diff --git a/java/com/android/dialer/app/DialtactsActivity.java b/java/com/android/dialer/app/DialtactsActivity.java
index bbb4594..66e02b4 100644
--- a/java/com/android/dialer/app/DialtactsActivity.java
+++ b/java/com/android/dialer/app/DialtactsActivity.java
@@ -204,74 +204,74 @@
    */
   private static final long HISTORY_TAB_SEEN_TIMEOUT = TimeUnit.SECONDS.toMillis(3);
 
-  private static Optional<Boolean> sVoiceSearchEnabledForTest = Optional.absent();
+  private static Optional<Boolean> voiceSearchEnabledForTest = Optional.absent();
 
   /** Fragment containing the dialpad that slides into view */
-  protected DialpadFragment mDialpadFragment;
+  protected DialpadFragment dialpadFragment;
 
   /** Root layout of DialtactsActivity */
-  private CoordinatorLayout mParentLayout;
+  private CoordinatorLayout parentLayout;
   /** Fragment for searching phone numbers using the alphanumeric keyboard. */
-  private RegularSearchFragment mRegularSearchFragment;
+  private RegularSearchFragment regularSearchFragment;
 
   /** Fragment for searching phone numbers using the dialpad. */
-  private SmartDialSearchFragment mSmartDialSearchFragment;
+  private SmartDialSearchFragment smartDialSearchFragment;
 
   /** new Fragment for search phone numbers using the keyboard and the dialpad. */
-  private NewSearchFragment mNewSearchFragment;
+  private NewSearchFragment newSearchFragment;
 
   /** Animation that slides in. */
-  private Animation mSlideIn;
+  private Animation slideIn;
 
   /** Animation that slides out. */
-  private Animation mSlideOut;
+  private Animation slideOut;
   /** Fragment containing the speed dial list, call history list, and all contacts list. */
-  private ListsFragment mListsFragment;
+  private ListsFragment listsFragment;
   /**
    * Tracks whether onSaveInstanceState has been called. If true, no fragment transactions can be
    * commited.
    */
-  private boolean mStateSaved;
+  private boolean stateSaved;
 
-  private boolean mIsKeyboardOpen;
-  private boolean mInNewSearch;
-  private boolean mIsRestarting;
-  private boolean mInDialpadSearch;
-  private boolean mInRegularSearch;
-  private boolean mClearSearchOnPause;
-  private boolean mIsDialpadShown;
+  private boolean isKeyboardOpen;
+  private boolean inNewSearch;
+  private boolean isRestarting;
+  private boolean inDialpadSearch;
+  private boolean inRegularSearch;
+  private boolean clearSearchOnPause;
+  private boolean isDialpadShown;
   /** Whether or not the device is in landscape orientation. */
-  private boolean mIsLandscape;
+  private boolean isLandscape;
   /** True if the dialpad is only temporarily showing due to being in call */
-  private boolean mInCallDialpadUp;
+  private boolean inCallDialpadUp;
   /** True when this activity has been launched for the first time. */
-  private boolean mFirstLaunch;
+  private boolean firstLaunch;
   /**
    * Search query to be applied to the SearchView in the ActionBar once onCreateOptionsMenu has been
    * called.
    */
-  private String mPendingSearchViewQuery;
+  private String pendingSearchViewQuery;
 
-  private PopupMenu mOverflowMenu;
-  private EditText mSearchView;
-  private SearchEditTextLayout mSearchEditTextLayout;
-  private View mVoiceSearchButton;
-  private String mSearchQuery;
-  private String mDialpadQuery;
-  private DialerDatabaseHelper mDialerDatabaseHelper;
-  private DragDropController mDragDropController;
-  private ActionBarController mActionBarController;
-  private FloatingActionButtonController mFloatingActionButtonController;
-  private boolean mWasConfigurationChange;
+  private PopupMenu overflowMenu;
+  private EditText searchView;
+  private SearchEditTextLayout searchEditTextLayout;
+  private View voiceSearchButton;
+  private String searchQuery;
+  private String dialpadQuery;
+  private DialerDatabaseHelper dialerDatabaseHelper;
+  private DragDropController dragDropController;
+  private ActionBarController actionBarController;
+  private FloatingActionButtonController floatingActionButtonController;
+  private boolean wasConfigurationChange;
   private long timeTabSelected;
 
-  private P13nLogger mP13nLogger;
-  private P13nRanker mP13nRanker;
+  private P13nLogger p13nLogger;
+  private P13nRanker p13nRanker;
   public boolean isMultiSelectModeEnabled;
 
   private boolean isLastTabEnabled;
 
-  AnimationListenerAdapter mSlideInListener =
+  AnimationListenerAdapter slideInListener =
       new AnimationListenerAdapter() {
         @Override
         public void onAnimationEnd(Animation animation) {
@@ -279,7 +279,7 @@
         }
       };
   /** Listener for after slide out animation completes on dialer fragment. */
-  AnimationListenerAdapter mSlideOutListener =
+  AnimationListenerAdapter slideOutListener =
       new AnimationListenerAdapter() {
         @Override
         public void onAnimationEnd(Animation animation) {
@@ -287,7 +287,7 @@
         }
       };
   /** Listener used to send search queries to the phone search fragment. */
-  private final TextWatcher mPhoneSearchQueryTextListener =
+  private final TextWatcher phoneSearchQueryTextListener =
       new TextWatcher() {
         @Override
         public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@@ -295,7 +295,7 @@
         @Override
         public void onTextChanged(CharSequence s, int start, int before, int count) {
           final String newText = s.toString();
-          if (newText.equals(mSearchQuery)) {
+          if (newText.equals(searchQuery)) {
             // If the query hasn't changed (perhaps due to activity being destroyed
             // and restored, or user launching the same DIAL intent twice), then there is
             // no need to do anything here.
@@ -307,8 +307,8 @@
           }
 
           LogUtil.v("DialtactsActivity.onTextChanged", "called with new query: " + newText);
-          LogUtil.v("DialtactsActivity.onTextChanged", "previous query: " + mSearchQuery);
-          mSearchQuery = newText;
+          LogUtil.v("DialtactsActivity.onTextChanged", "previous query: " + searchQuery);
+          searchQuery = newText;
 
           // TODO(calderwoodra): show p13n when newText is empty.
           // Show search fragment only when the query string is changed to non-empty text.
@@ -316,18 +316,18 @@
             // Call enterSearchUi only if we are switching search modes, or showing a search
             // fragment for the first time.
             final boolean sameSearchMode =
-                (mIsDialpadShown && mInDialpadSearch) || (!mIsDialpadShown && mInRegularSearch);
+                (isDialpadShown && inDialpadSearch) || (!isDialpadShown && inRegularSearch);
             if (!sameSearchMode) {
-              enterSearchUi(mIsDialpadShown, mSearchQuery, true /* animate */);
+              enterSearchUi(isDialpadShown, searchQuery, true /* animate */);
             }
           }
 
-          if (mSmartDialSearchFragment != null && mSmartDialSearchFragment.isVisible()) {
-            mSmartDialSearchFragment.setQueryString(mSearchQuery);
-          } else if (mRegularSearchFragment != null && mRegularSearchFragment.isVisible()) {
-            mRegularSearchFragment.setQueryString(mSearchQuery);
-          } else if (mNewSearchFragment != null && mNewSearchFragment.isVisible()) {
-            mNewSearchFragment.setQuery(mSearchQuery, getCallInitiationType());
+          if (smartDialSearchFragment != null && smartDialSearchFragment.isVisible()) {
+            smartDialSearchFragment.setQueryString(searchQuery);
+          } else if (regularSearchFragment != null && regularSearchFragment.isVisible()) {
+            regularSearchFragment.setQueryString(searchQuery);
+          } else if (newSearchFragment != null && newSearchFragment.isVisible()) {
+            newSearchFragment.setQuery(searchQuery, getCallInitiationType());
           }
         }
 
@@ -335,27 +335,27 @@
         public void afterTextChanged(Editable s) {}
       };
   /** Open the search UI when the user clicks on the search box. */
-  private final View.OnClickListener mSearchViewOnClickListener =
+  private final View.OnClickListener searchViewOnClickListener =
       new View.OnClickListener() {
         @Override
         public void onClick(View v) {
           if (!isInSearchUi()) {
             PerformanceReport.recordClick(UiAction.Type.OPEN_SEARCH);
-            mActionBarController.onSearchBoxTapped();
+            actionBarController.onSearchBoxTapped();
             enterSearchUi(
-                false /* smartDialSearch */, mSearchView.getText().toString(), true /* animate */);
+                false /* smartDialSearch */, searchView.getText().toString(), true /* animate */);
           }
         }
       };
 
-  private int mActionBarHeight;
-  private int mPreviouslySelectedTabIndex;
+  private int actionBarHeight;
+  private int previouslySelectedTabIndex;
 
   /**
    * The text returned from a voice search query. Set in {@link #onActivityResult} and used in
    * {@link #onResume()} to populate the search box.
    */
-  private String mVoiceSearchQuery;
+  private String voiceSearchQuery;
 
   /**
    * @param tab the TAB_INDEX_* constant in {@link ListsFragment}
@@ -391,11 +391,11 @@
     LogUtil.enterBlock("DialtactsActivity.onCreate");
     super.onCreate(savedInstanceState);
 
-    mFirstLaunch = true;
+    firstLaunch = true;
     isLastTabEnabled = ConfigProviderBindings.get(this).getBoolean("last_tab_enabled", false);
 
     final Resources resources = getResources();
-    mActionBarHeight = resources.getDimensionPixelSize(R.dimen.action_bar_height_large);
+    actionBarHeight = resources.getDimensionPixelSize(R.dimen.action_bar_height_large);
 
     Trace.beginSection(TAG + " setContentView");
     setContentView(R.layout.dialtacts_activity);
@@ -408,35 +408,34 @@
     actionBar.setDisplayShowCustomEnabled(true);
     actionBar.setBackgroundDrawable(null);
 
-    mSearchEditTextLayout = actionBar.getCustomView().findViewById(R.id.search_view_container);
+    searchEditTextLayout = actionBar.getCustomView().findViewById(R.id.search_view_container);
 
-    mActionBarController = new ActionBarController(this, mSearchEditTextLayout);
+    actionBarController = new ActionBarController(this, searchEditTextLayout);
 
-    mSearchView = mSearchEditTextLayout.findViewById(R.id.search_view);
-    mSearchView.addTextChangedListener(mPhoneSearchQueryTextListener);
-    mSearchView.setHint(getSearchBoxHint());
+    searchView = searchEditTextLayout.findViewById(R.id.search_view);
+    searchView.addTextChangedListener(phoneSearchQueryTextListener);
+    searchView.setHint(getSearchBoxHint());
 
-    mVoiceSearchButton = mSearchEditTextLayout.findViewById(R.id.voice_search_button);
-    mSearchEditTextLayout
+    voiceSearchButton = searchEditTextLayout.findViewById(R.id.voice_search_button);
+    searchEditTextLayout
         .findViewById(R.id.search_box_collapsed)
-        .setOnClickListener(mSearchViewOnClickListener);
-    mSearchEditTextLayout
+        .setOnClickListener(searchViewOnClickListener);
+    searchEditTextLayout
         .findViewById(R.id.search_back_button)
         .setOnClickListener(v -> exitSearchUi());
 
-    mIsLandscape =
+    isLandscape =
         getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE;
-    mPreviouslySelectedTabIndex = DialtactsPagerAdapter.TAB_INDEX_SPEED_DIAL;
+    previouslySelectedTabIndex = DialtactsPagerAdapter.TAB_INDEX_SPEED_DIAL;
     FloatingActionButton floatingActionButton = findViewById(R.id.floating_action_button);
     floatingActionButton.setOnClickListener(this);
-    mFloatingActionButtonController =
-        new FloatingActionButtonController(this, floatingActionButton);
+    floatingActionButtonController = new FloatingActionButtonController(this, floatingActionButton);
 
     ImageButton optionsMenuButton =
-        mSearchEditTextLayout.findViewById(R.id.dialtacts_options_menu_button);
+        searchEditTextLayout.findViewById(R.id.dialtacts_options_menu_button);
     optionsMenuButton.setOnClickListener(this);
-    mOverflowMenu = buildOptionsMenu(optionsMenuButton);
-    optionsMenuButton.setOnTouchListener(mOverflowMenu.getDragToOpenListener());
+    overflowMenu = buildOptionsMenu(optionsMenuButton);
+    optionsMenuButton.setOnTouchListener(overflowMenu.getDragToOpenListener());
 
     // Add the favorites fragment but only if savedInstanceState is null. Otherwise the
     // fragment manager is responsible for recreating it.
@@ -446,56 +445,56 @@
           .add(R.id.dialtacts_frame, new ListsFragment(), TAG_FAVORITES_FRAGMENT)
           .commit();
     } else {
-      mSearchQuery = savedInstanceState.getString(KEY_SEARCH_QUERY);
-      mDialpadQuery = savedInstanceState.getString(KEY_DIALPAD_QUERY);
-      mInRegularSearch = savedInstanceState.getBoolean(KEY_IN_REGULAR_SEARCH_UI);
-      mInDialpadSearch = savedInstanceState.getBoolean(KEY_IN_DIALPAD_SEARCH_UI);
-      mInNewSearch = savedInstanceState.getBoolean(KEY_IN_NEW_SEARCH_UI);
-      mFirstLaunch = savedInstanceState.getBoolean(KEY_FIRST_LAUNCH);
-      mWasConfigurationChange = savedInstanceState.getBoolean(KEY_WAS_CONFIGURATION_CHANGE);
-      mIsDialpadShown = savedInstanceState.getBoolean(KEY_IS_DIALPAD_SHOWN);
-      mFloatingActionButtonController.setVisible(savedInstanceState.getBoolean(KEY_FAB_VISIBLE));
-      mActionBarController.restoreInstanceState(savedInstanceState);
+      searchQuery = savedInstanceState.getString(KEY_SEARCH_QUERY);
+      dialpadQuery = savedInstanceState.getString(KEY_DIALPAD_QUERY);
+      inRegularSearch = savedInstanceState.getBoolean(KEY_IN_REGULAR_SEARCH_UI);
+      inDialpadSearch = savedInstanceState.getBoolean(KEY_IN_DIALPAD_SEARCH_UI);
+      inNewSearch = savedInstanceState.getBoolean(KEY_IN_NEW_SEARCH_UI);
+      firstLaunch = savedInstanceState.getBoolean(KEY_FIRST_LAUNCH);
+      wasConfigurationChange = savedInstanceState.getBoolean(KEY_WAS_CONFIGURATION_CHANGE);
+      isDialpadShown = savedInstanceState.getBoolean(KEY_IS_DIALPAD_SHOWN);
+      floatingActionButtonController.setVisible(savedInstanceState.getBoolean(KEY_FAB_VISIBLE));
+      actionBarController.restoreInstanceState(savedInstanceState);
     }
 
     final boolean isLayoutRtl = ViewUtil.isRtl();
-    if (mIsLandscape) {
-      mSlideIn =
+    if (isLandscape) {
+      slideIn =
           AnimationUtils.loadAnimation(
               this, isLayoutRtl ? R.anim.dialpad_slide_in_left : R.anim.dialpad_slide_in_right);
-      mSlideOut =
+      slideOut =
           AnimationUtils.loadAnimation(
               this, isLayoutRtl ? R.anim.dialpad_slide_out_left : R.anim.dialpad_slide_out_right);
     } else {
-      mSlideIn = AnimationUtils.loadAnimation(this, R.anim.dialpad_slide_in_bottom);
-      mSlideOut = AnimationUtils.loadAnimation(this, R.anim.dialpad_slide_out_bottom);
+      slideIn = AnimationUtils.loadAnimation(this, R.anim.dialpad_slide_in_bottom);
+      slideOut = AnimationUtils.loadAnimation(this, R.anim.dialpad_slide_out_bottom);
     }
 
-    mSlideIn.setInterpolator(AnimUtils.EASE_IN);
-    mSlideOut.setInterpolator(AnimUtils.EASE_OUT);
+    slideIn.setInterpolator(AnimUtils.EASE_IN);
+    slideOut.setInterpolator(AnimUtils.EASE_OUT);
 
-    mSlideIn.setAnimationListener(mSlideInListener);
-    mSlideOut.setAnimationListener(mSlideOutListener);
+    slideIn.setAnimationListener(slideInListener);
+    slideOut.setAnimationListener(slideOutListener);
 
-    mParentLayout = (CoordinatorLayout) findViewById(R.id.dialtacts_mainlayout);
-    mParentLayout.setOnDragListener(new LayoutOnDragListener());
+    parentLayout = (CoordinatorLayout) findViewById(R.id.dialtacts_mainlayout);
+    parentLayout.setOnDragListener(new LayoutOnDragListener());
     ViewUtil.doOnGlobalLayout(
         floatingActionButton,
         view -> {
-          int screenWidth = mParentLayout.getWidth();
-          mFloatingActionButtonController.setScreenWidth(screenWidth);
-          mFloatingActionButtonController.align(getFabAlignment(), false /* animate */);
+          int screenWidth = parentLayout.getWidth();
+          floatingActionButtonController.setScreenWidth(screenWidth);
+          floatingActionButtonController.align(getFabAlignment(), false /* animate */);
         });
 
     Trace.endSection();
 
     Trace.beginSection(TAG + " initialize smart dialing");
-    mDialerDatabaseHelper = Database.get(this).getDatabaseHelper(this);
+    dialerDatabaseHelper = Database.get(this).getDatabaseHelper(this);
     SmartDialPrefix.initializeNanpSettings(this);
     Trace.endSection();
 
-    mP13nLogger = P13nLogging.get(getApplicationContext());
-    mP13nRanker = P13nRanking.get(getApplicationContext());
+    p13nLogger = P13nLogging.get(getApplicationContext());
+    p13nRanker = P13nRanking.get(getApplicationContext());
     Trace.endSection();
 
     // Update the new search fragment to the correct position and the ActionBar's visibility.
@@ -522,78 +521,78 @@
       PerformanceReport.startRecording();
     }
 
-    mStateSaved = false;
-    if (mFirstLaunch) {
+    stateSaved = false;
+    if (firstLaunch) {
       LogUtil.i("DialtactsActivity.onResume", "mFirstLaunch true, displaying fragment");
       displayFragment(getIntent());
-    } else if (!phoneIsInUse() && mInCallDialpadUp) {
+    } else if (!phoneIsInUse() && inCallDialpadUp) {
       LogUtil.i("DialtactsActivity.onResume", "phone not in use, hiding dialpad fragment");
       hideDialpadFragment(false, true);
-      mInCallDialpadUp = false;
-    } else if (mIsDialpadShown) {
+      inCallDialpadUp = false;
+    } else if (isDialpadShown) {
       LogUtil.i("DialtactsActivity.onResume", "showing dialpad on resume");
       showDialpadFragment(false);
     } else {
-      PostCall.promptUserForMessageIfNecessary(this, mParentLayout);
+      PostCall.promptUserForMessageIfNecessary(this, parentLayout);
     }
 
     // On M the fragment manager does not restore the hidden state of a fragment from
     // savedInstanceState so it must be hidden again.
-    if (!mIsDialpadShown && mDialpadFragment != null && !mDialpadFragment.isHidden()) {
+    if (!isDialpadShown && dialpadFragment != null && !dialpadFragment.isHidden()) {
       LogUtil.i(
           "DialtactsActivity.onResume", "mDialpadFragment attached but not hidden, forcing hide");
-      getFragmentManager().beginTransaction().hide(mDialpadFragment).commit();
+      getFragmentManager().beginTransaction().hide(dialpadFragment).commit();
     }
 
     // If there was a voice query result returned in the {@link #onActivityResult} callback, it
     // will have been stashed in mVoiceSearchQuery since the search results fragment cannot be
     // shown until onResume has completed.  Active the search UI and set the search term now.
-    if (!TextUtils.isEmpty(mVoiceSearchQuery)) {
-      mActionBarController.onSearchBoxTapped();
-      mSearchView.setText(mVoiceSearchQuery);
-      mVoiceSearchQuery = null;
+    if (!TextUtils.isEmpty(voiceSearchQuery)) {
+      actionBarController.onSearchBoxTapped();
+      searchView.setText(voiceSearchQuery);
+      voiceSearchQuery = null;
     }
 
-    if (mIsRestarting) {
+    if (isRestarting) {
       // This is only called when the activity goes from resumed -> paused -> resumed, so it
       // will not cause an extra view to be sent out on rotation
-      if (mIsDialpadShown) {
+      if (isDialpadShown) {
         Logger.get(this).logScreenView(ScreenEvent.Type.DIALPAD, this);
       }
-      mIsRestarting = false;
+      isRestarting = false;
     }
 
     prepareVoiceSearchButton();
-    if (!mWasConfigurationChange) {
-      mDialerDatabaseHelper.startSmartDialUpdateThread();
+    if (!wasConfigurationChange) {
+      dialerDatabaseHelper.startSmartDialUpdateThread();
     }
-    if (mIsDialpadShown) {
-      mFloatingActionButtonController.scaleOut();
+    if (isDialpadShown) {
+      floatingActionButtonController.scaleOut();
     } else {
-      mFloatingActionButtonController.align(getFabAlignment(), false /* animate */);
+      floatingActionButtonController.align(getFabAlignment(), false /* animate */);
     }
 
-    if (mFirstLaunch) {
+    if (firstLaunch) {
       // Only process the Intent the first time onResume() is called after receiving it
       if (Calls.CONTENT_TYPE.equals(getIntent().getType())) {
         // Externally specified extras take precedence to EXTRA_SHOW_TAB, which is only
         // used internally.
         final Bundle extras = getIntent().getExtras();
         if (extras != null && extras.getInt(Calls.EXTRA_CALL_TYPE_FILTER) == Calls.VOICEMAIL_TYPE) {
-          mListsFragment.showTab(DialtactsPagerAdapter.TAB_INDEX_VOICEMAIL);
+          listsFragment.showTab(DialtactsPagerAdapter.TAB_INDEX_VOICEMAIL);
           Logger.get(this).logImpression(DialerImpression.Type.VVM_NOTIFICATION_CLICKED);
         } else {
-          mListsFragment.showTab(DialtactsPagerAdapter.TAB_INDEX_HISTORY);
+          listsFragment.showTab(DialtactsPagerAdapter.TAB_INDEX_HISTORY);
         }
       } else if (getIntent().hasExtra(EXTRA_SHOW_TAB)) {
         int index =
             getIntent().getIntExtra(EXTRA_SHOW_TAB, DialtactsPagerAdapter.TAB_INDEX_SPEED_DIAL);
-        if (index < mListsFragment.getTabCount()) {
+        if (index < listsFragment.getTabCount()) {
           // Hide dialpad since this is an explicit intent to show a specific tab, which is coming
           // from missed call or voicemail notification.
           hideDialpadFragment(false, false);
           exitSearchUi();
-          mListsFragment.showTab(index);
+          listsFragment.showTab(index);
         }
       }
 
@@ -609,13 +608,13 @@
           1000);
     }
 
-    mFirstLaunch = false;
+    firstLaunch = false;
 
     setSearchBoxHint();
     timeTabSelected = SystemClock.elapsedRealtime();
 
-    mP13nLogger.reset();
-    mP13nRanker.refresh(
+    p13nLogger.reset();
+    p13nRanker.refresh(
         new P13nRefreshCompleteListener() {
           @Override
           public void onP13nRefreshComplete() {
@@ -628,16 +627,16 @@
   @Override
   protected void onRestart() {
     super.onRestart();
-    mIsRestarting = true;
+    isRestarting = true;
   }
 
   @Override
   protected void onPause() {
-    if (mClearSearchOnPause) {
+    if (clearSearchOnPause) {
       hideDialpadAndSearchUi();
-      mClearSearchOnPause = false;
+      clearSearchOnPause = false;
     }
-    if (mSlideOut.hasStarted() && !mSlideOut.hasEnded()) {
+    if (slideOut.hasStarted() && !slideOut.hasEnded()) {
       commitDialpadFragmentHide();
     }
     super.onPause();
@@ -649,17 +648,17 @@
     boolean timeoutElapsed =
         SystemClock.elapsedRealtime() - timeTabSelected >= HISTORY_TAB_SEEN_TIMEOUT;
     boolean isOnHistoryTab =
-        mListsFragment.getCurrentTabIndex() == DialtactsPagerAdapter.TAB_INDEX_HISTORY;
+        listsFragment.getCurrentTabIndex() == DialtactsPagerAdapter.TAB_INDEX_HISTORY;
     if (isOnHistoryTab
         && timeoutElapsed
         && !isChangingConfigurations()
         && !getSystemService(KeyguardManager.class).isKeyguardLocked()) {
-      mListsFragment.markMissedCallsAsReadAndRemoveNotifications();
+      listsFragment.markMissedCallsAsReadAndRemoveNotifications();
     }
     StorageComponent.get(this)
         .unencryptedSharedPrefs()
         .edit()
-        .putInt(KEY_LAST_TAB, mListsFragment.getCurrentTabIndex())
+        .putInt(KEY_LAST_TAB, listsFragment.getCurrentTabIndex())
         .apply();
   }
 
@@ -667,38 +666,38 @@
   protected void onSaveInstanceState(Bundle outState) {
     LogUtil.enterBlock("DialtactsActivity.onSaveInstanceState");
     super.onSaveInstanceState(outState);
-    outState.putString(KEY_SEARCH_QUERY, mSearchQuery);
-    outState.putString(KEY_DIALPAD_QUERY, mDialpadQuery);
-    outState.putBoolean(KEY_IN_REGULAR_SEARCH_UI, mInRegularSearch);
-    outState.putBoolean(KEY_IN_DIALPAD_SEARCH_UI, mInDialpadSearch);
-    outState.putBoolean(KEY_IN_NEW_SEARCH_UI, mInNewSearch);
-    outState.putBoolean(KEY_FIRST_LAUNCH, mFirstLaunch);
-    outState.putBoolean(KEY_IS_DIALPAD_SHOWN, mIsDialpadShown);
-    outState.putBoolean(KEY_FAB_VISIBLE, mFloatingActionButtonController.isVisible());
+    outState.putString(KEY_SEARCH_QUERY, searchQuery);
+    outState.putString(KEY_DIALPAD_QUERY, dialpadQuery);
+    outState.putBoolean(KEY_IN_REGULAR_SEARCH_UI, inRegularSearch);
+    outState.putBoolean(KEY_IN_DIALPAD_SEARCH_UI, inDialpadSearch);
+    outState.putBoolean(KEY_IN_NEW_SEARCH_UI, inNewSearch);
+    outState.putBoolean(KEY_FIRST_LAUNCH, firstLaunch);
+    outState.putBoolean(KEY_IS_DIALPAD_SHOWN, isDialpadShown);
+    outState.putBoolean(KEY_FAB_VISIBLE, floatingActionButtonController.isVisible());
     outState.putBoolean(KEY_WAS_CONFIGURATION_CHANGE, isChangingConfigurations());
-    mActionBarController.saveInstanceState(outState);
-    mStateSaved = true;
+    actionBarController.saveInstanceState(outState);
+    stateSaved = true;
   }
 
   @Override
   public void onAttachFragment(final Fragment fragment) {
     LogUtil.i("DialtactsActivity.onAttachFragment", "fragment: %s", fragment);
     if (fragment instanceof DialpadFragment) {
-      mDialpadFragment = (DialpadFragment) fragment;
+      dialpadFragment = (DialpadFragment) fragment;
     } else if (fragment instanceof SmartDialSearchFragment) {
-      mSmartDialSearchFragment = (SmartDialSearchFragment) fragment;
-      mSmartDialSearchFragment.setOnPhoneNumberPickerActionListener(this);
-      if (!TextUtils.isEmpty(mDialpadQuery)) {
-        mSmartDialSearchFragment.setAddToContactNumber(mDialpadQuery);
+      smartDialSearchFragment = (SmartDialSearchFragment) fragment;
+      smartDialSearchFragment.setOnPhoneNumberPickerActionListener(this);
+      if (!TextUtils.isEmpty(dialpadQuery)) {
+        smartDialSearchFragment.setAddToContactNumber(dialpadQuery);
       }
     } else if (fragment instanceof SearchFragment) {
-      mRegularSearchFragment = (RegularSearchFragment) fragment;
-      mRegularSearchFragment.setOnPhoneNumberPickerActionListener(this);
+      regularSearchFragment = (RegularSearchFragment) fragment;
+      regularSearchFragment.setOnPhoneNumberPickerActionListener(this);
     } else if (fragment instanceof ListsFragment) {
-      mListsFragment = (ListsFragment) fragment;
-      mListsFragment.addOnPageChangeListener(this);
+      listsFragment = (ListsFragment) fragment;
+      listsFragment.addOnPageChangeListener(this);
     } else if (fragment instanceof NewSearchFragment) {
-      mNewSearchFragment = (NewSearchFragment) fragment;
+      newSearchFragment = (NewSearchFragment) fragment;
       updateSearchFragmentPosition();
     }
     if (fragment instanceof SearchFragment) {
@@ -710,14 +709,14 @@
             public Cursor rerankCursor(Cursor data) {
               Assert.isMainThread();
               String queryString = searchFragment.getQueryString();
-              return mP13nRanker.rankCursor(data, queryString == null ? 0 : queryString.length());
+              return p13nRanker.rankCursor(data, queryString == null ? 0 : queryString.length());
             }
           });
       searchFragment.addOnLoadFinishedListener(
           new OnLoadFinishedListener() {
             @Override
             public void onLoadFinished() {
-              mP13nLogger.onSearchQuery(
+              p13nLogger.onSearchQuery(
                   searchFragment.getQueryString(),
                   (PhoneNumberListAdapter) searchFragment.getAdapter());
             }
@@ -731,18 +730,18 @@
   }
 
   public boolean isListsFragmentVisible() {
-    return mListsFragment.getUserVisibleHint();
+    return listsFragment.getUserVisibleHint();
   }
 
   @Override
   public void onClick(View view) {
     int resId = view.getId();
     if (resId == R.id.floating_action_button) {
-      if (!mIsDialpadShown) {
+      if (!isDialpadShown) {
         LogUtil.i(
             "DialtactsActivity.onClick", "floating action button clicked, going to show dialpad");
         PerformanceReport.recordClick(UiAction.Type.OPEN_DIALPAD);
-        mInCallDialpadUp = false;
+        inCallDialpadUp = false;
         showDialpadFragment(true);
         PostCall.closePrompt();
       } else {
@@ -761,7 +760,7 @@
             .show();
       }
     } else if (resId == R.id.dialtacts_options_menu_button) {
-      mOverflowMenu.show();
+      overflowMenu.show();
     } else {
       Assert.fail("Unexpected onClick event from " + view);
     }
@@ -805,7 +804,7 @@
         final ArrayList<String> matches =
             data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
         if (matches.size() > 0) {
-          mVoiceSearchQuery = matches.get(0);
+          voiceSearchQuery = matches.get(0);
         } else {
           LogUtil.i("DialtactsActivity.onActivityResult", "voice search - nothing heard");
         }
@@ -820,7 +819,7 @@
             getString(
                 R.string.call_composer_connection_failed,
                 data.getStringExtra(CallComposerActivity.KEY_CONTACT_NAME));
-        Snackbar.make(mParentLayout, message, Snackbar.LENGTH_LONG).show();
+        Snackbar.make(parentLayout, message, Snackbar.LENGTH_LONG).show();
       } else {
         LogUtil.i("DialtactsActivity.onActivityResult", "returned from call composer, no error");
       }
@@ -830,7 +829,7 @@
           && data.getBooleanExtra(CallDetailsActivity.EXTRA_HAS_ENRICHED_CALL_DATA, false)) {
         String number = data.getStringExtra(CallDetailsActivity.EXTRA_PHONE_NUMBER);
         int snackbarDurationMillis = 5_000;
-        Snackbar.make(mParentLayout, getString(R.string.ec_data_deleted), snackbarDurationMillis)
+        Snackbar.make(parentLayout, getString(R.string.ec_data_deleted), snackbarDurationMillis)
             .setAction(
                 R.string.view_conversation,
                 v -> startActivity(IntentProvider.getSendSmsIntentProvider(number).getIntent(this)))
@@ -849,7 +848,7 @@
    * Update the number of unread voicemails (potentially other tabs) displayed next to the tab icon.
    */
   public void updateTabUnreadCounts() {
-    mListsFragment.updateTabUnreadCounts();
+    listsFragment.updateTabUnreadCounts();
   }
 
   /**
@@ -860,40 +859,40 @@
    */
   private void showDialpadFragment(boolean animate) {
     LogUtil.i("DialtactActivity.showDialpadFragment", "animate: %b", animate);
-    if (mIsDialpadShown) {
+    if (isDialpadShown) {
       LogUtil.i("DialtactsActivity.showDialpadFragment", "dialpad already shown");
       return;
     }
-    if (mStateSaved) {
+    if (stateSaved) {
       LogUtil.i("DialtactsActivity.showDialpadFragment", "state already saved");
       return;
     }
-    mIsDialpadShown = true;
+    isDialpadShown = true;
 
-    mListsFragment.setUserVisibleHint(false);
+    listsFragment.setUserVisibleHint(false);
 
     final FragmentTransaction ft = getFragmentManager().beginTransaction();
-    if (mDialpadFragment == null) {
-      mDialpadFragment = new DialpadFragment();
-      ft.add(R.id.dialtacts_container, mDialpadFragment, TAG_DIALPAD_FRAGMENT);
+    if (dialpadFragment == null) {
+      dialpadFragment = new DialpadFragment();
+      ft.add(R.id.dialtacts_container, dialpadFragment, TAG_DIALPAD_FRAGMENT);
     } else {
-      ft.show(mDialpadFragment);
+      ft.show(dialpadFragment);
     }
 
-    mDialpadFragment.setAnimate(animate);
+    dialpadFragment.setAnimate(animate);
     Logger.get(this).logScreenView(ScreenEvent.Type.DIALPAD, this);
     ft.commit();
 
     if (animate) {
-      mFloatingActionButtonController.scaleOut();
+      floatingActionButtonController.scaleOut();
       maybeEnterSearchUi();
     } else {
-      mFloatingActionButtonController.scaleOut();
+      floatingActionButtonController.scaleOut();
       maybeEnterSearchUi();
     }
-    mActionBarController.onDialpadUp();
+    actionBarController.onDialpadUp();
 
-    Assert.isNotNull(mListsFragment.getView()).animate().alpha(0).withLayer();
+    Assert.isNotNull(listsFragment.getView()).animate().alpha(0).withLayer();
 
     // adjust the title, so the user will know where we're at when the activity start/resumes.
     setTitle(R.string.launcherDialpadActivityLabel);
@@ -910,11 +909,11 @@
   @Override
   public void onDialpadShown() {
     LogUtil.enterBlock("DialtactsActivity.onDialpadShown");
-    Assert.isNotNull(mDialpadFragment);
-    if (mDialpadFragment.getAnimate()) {
-      Assert.isNotNull(mDialpadFragment.getView()).startAnimation(mSlideIn);
+    Assert.isNotNull(dialpadFragment);
+    if (dialpadFragment.getAnimate()) {
+      Assert.isNotNull(dialpadFragment.getView()).startAnimation(slideIn);
     } else {
-      mDialpadFragment.setYFraction(0);
+      dialpadFragment.setYFraction(0);
     }
 
     updateSearchFragmentPosition();
@@ -922,7 +921,7 @@
 
   @Override
   public void onCallPlacedFromDialpad() {
-    mClearSearchOnPause = true;
+    clearSearchOnPause = true;
   }
 
   @Override
@@ -938,38 +937,38 @@
    */
   private void hideDialpadFragment(boolean animate, boolean clearDialpad) {
     LogUtil.enterBlock("DialtactsActivity.hideDialpadFragment");
-    if (mDialpadFragment == null || mDialpadFragment.getView() == null) {
+    if (dialpadFragment == null || dialpadFragment.getView() == null) {
       return;
     }
     if (clearDialpad) {
       // Temporarily disable accessibility when we clear the dialpad, since it should be
       // invisible and should not announce anything.
-      mDialpadFragment
+      dialpadFragment
           .getDigitsWidget()
           .setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO);
-      mDialpadFragment.clearDialpad();
-      mDialpadFragment
+      dialpadFragment.clearDialpad();
+      dialpadFragment
           .getDigitsWidget()
           .setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_AUTO);
     }
-    if (!mIsDialpadShown) {
+    if (!isDialpadShown) {
       return;
     }
-    mIsDialpadShown = false;
-    mDialpadFragment.setAnimate(animate);
-    mListsFragment.setUserVisibleHint(true);
-    mListsFragment.sendScreenViewForCurrentPosition();
+    isDialpadShown = false;
+    dialpadFragment.setAnimate(animate);
+    listsFragment.setUserVisibleHint(true);
+    listsFragment.sendScreenViewForCurrentPosition();
 
     updateSearchFragmentPosition();
 
-    mFloatingActionButtonController.align(getFabAlignment(), animate);
+    floatingActionButtonController.align(getFabAlignment(), animate);
     if (animate) {
-      mDialpadFragment.getView().startAnimation(mSlideOut);
+      dialpadFragment.getView().startAnimation(slideOut);
     } else {
       commitDialpadFragmentHide();
     }
 
-    mActionBarController.onDialpadDown();
+    actionBarController.onDialpadDown();
 
     // reset the title to normal.
     setTitle(R.string.launcherActivityLabel);
@@ -977,23 +976,20 @@
 
   /** Finishes hiding the dialpad fragment after any animations are completed. */
   private void commitDialpadFragmentHide() {
-    if (!mStateSaved
-        && mDialpadFragment != null
-        && !mDialpadFragment.isHidden()
-        && !isDestroyed()) {
+    if (!stateSaved && dialpadFragment != null && !dialpadFragment.isHidden() && !isDestroyed()) {
       final FragmentTransaction ft = getFragmentManager().beginTransaction();
-      ft.hide(mDialpadFragment);
+      ft.hide(dialpadFragment);
       ft.commit();
     }
-    mFloatingActionButtonController.scaleIn();
+    floatingActionButtonController.scaleIn();
   }
 
   private void updateSearchFragmentPosition() {
     SearchFragment fragment = null;
-    if (mSmartDialSearchFragment != null) {
-      fragment = mSmartDialSearchFragment;
-    } else if (mRegularSearchFragment != null) {
-      fragment = mRegularSearchFragment;
+    if (smartDialSearchFragment != null) {
+      fragment = smartDialSearchFragment;
+    } else if (regularSearchFragment != null) {
+      fragment = regularSearchFragment;
     }
     LogUtil.d(
         "DialtactsActivity.updateSearchFragmentPosition",
@@ -1006,47 +1002,47 @@
       // available immediately which is required to update position. By forcing an animation,
       // position will be updated after a delay by when the dialpad height would be available.
       fragment.updatePosition(true /* animate */);
-    } else if (mNewSearchFragment != null) {
+    } else if (newSearchFragment != null) {
       int animationDuration = getResources().getInteger(R.integer.dialpad_slide_in_duration);
       int actionbarHeight = getResources().getDimensionPixelSize(R.dimen.action_bar_height_large);
       int shadowHeight = getResources().getDrawable(R.drawable.search_shadow).getIntrinsicHeight();
       int start = isDialpadShown() ? actionbarHeight - shadowHeight : 0;
       int end = isDialpadShown() ? 0 : actionbarHeight - shadowHeight;
-      mNewSearchFragment.animatePosition(start, end, animationDuration);
+      newSearchFragment.animatePosition(start, end, animationDuration);
     }
   }
 
   @Override
   public boolean isInSearchUi() {
-    return mInDialpadSearch || mInRegularSearch || mInNewSearch;
+    return inDialpadSearch || inRegularSearch || inNewSearch;
   }
 
   @Override
   public boolean hasSearchQuery() {
-    return !TextUtils.isEmpty(mSearchQuery);
+    return !TextUtils.isEmpty(searchQuery);
   }
 
   private void setNotInSearchUi() {
-    mInDialpadSearch = false;
-    mInRegularSearch = false;
-    mInNewSearch = false;
+    inDialpadSearch = false;
+    inRegularSearch = false;
+    inNewSearch = false;
   }
 
   private void hideDialpadAndSearchUi() {
-    if (mIsDialpadShown) {
+    if (isDialpadShown) {
       hideDialpadFragment(false, true);
     }
     exitSearchUi();
   }
 
   private void prepareVoiceSearchButton() {
-    mSearchEditTextLayout.setVoiceSearchEnabled(isVoiceSearchEnabled());
-    mVoiceSearchButton.setOnClickListener(this);
+    searchEditTextLayout.setVoiceSearchEnabled(isVoiceSearchEnabled());
+    voiceSearchButton.setOnClickListener(this);
   }
 
   private boolean isVoiceSearchEnabled() {
-    if (sVoiceSearchEnabledForTest.isPresent()) {
-      return sVoiceSearchEnabledForTest.get();
+    if (voiceSearchEnabledForTest.isPresent()) {
+      return voiceSearchEnabledForTest.get();
     }
     return canIntentBeHandled(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH));
   }
@@ -1061,7 +1057,7 @@
 
   /** Sets the hint text for the contacts search box */
   private void setSearchBoxHint() {
-    ((TextView) mSearchEditTextLayout.findViewById(R.id.search_box_start_search))
+    ((TextView) searchEditTextLayout.findViewById(R.id.search_box_start_search))
         .setHint(getSearchBoxHint());
   }
 
@@ -1074,12 +1070,12 @@
 
   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
-    if (mPendingSearchViewQuery != null) {
-      mSearchView.setText(mPendingSearchViewQuery);
-      mPendingSearchViewQuery = null;
+    if (pendingSearchViewQuery != null) {
+      searchView.setText(pendingSearchViewQuery);
+      pendingSearchViewQuery = null;
     }
-    if (mActionBarController != null) {
-      mActionBarController.restoreActionBarOffset();
+    if (actionBarController != null) {
+      actionBarController.restoreActionBarOffset();
     }
     return false;
   }
@@ -1133,9 +1129,9 @@
           isDialIntent,
           isAddCallIntent);
       showDialpadFragment(false);
-      mDialpadFragment.setStartedFromNewIntent(true);
-      if (showDialpadChooser && !mDialpadFragment.isVisible()) {
-        mInCallDialpadUp = true;
+      dialpadFragment.setStartedFromNewIntent(true);
+      if (showDialpadChooser && !dialpadFragment.isVisible()) {
+        inCallDialpadUp = true;
       }
     } else if (isLastTabEnabled) {
       @TabIndex
@@ -1145,8 +1141,8 @@
               .getInt(KEY_LAST_TAB, DialtactsPagerAdapter.TAB_INDEX_SPEED_DIAL);
       // If voicemail tab is saved and its availability changes, we still move to the voicemail tab
       // but it is quickly removed and shown the contacts tab.
-      if (mListsFragment != null) {
-        mListsFragment.showTab(tabIndex);
+      if (listsFragment != null) {
+        listsFragment.showTab(tabIndex);
         PerformanceReport.setStartingTabIndex(tabIndex);
       } else {
         PerformanceReport.setStartingTabIndex(DialtactsPagerAdapter.TAB_INDEX_SPEED_DIAL);
@@ -1158,9 +1154,9 @@
   public void onNewIntent(Intent newIntent) {
     LogUtil.enterBlock("DialtactsActivity.onNewIntent");
     setIntent(newIntent);
-    mFirstLaunch = true;
+    firstLaunch = true;
 
-    mStateSaved = false;
+    stateSaved = false;
     displayFragment(newIntent);
 
     invalidateOptionsMenu();
@@ -1184,43 +1180,43 @@
   /** Shows the search fragment */
   private void enterSearchUi(boolean smartDialSearch, String query, boolean animate) {
     LogUtil.i("DialtactsActivity.enterSearchUi", "smart dial: %b", smartDialSearch);
-    if (mStateSaved || getFragmentManager().isDestroyed()) {
+    if (stateSaved || getFragmentManager().isDestroyed()) {
       // Weird race condition where fragment is doing work after the activity is destroyed
       // due to talkback being on (a bug). Just return since we can't do any
       // constructive here.
       LogUtil.i(
           "DialtactsActivity.enterSearchUi",
           "not entering search UI (mStateSaved: %b, isDestroyed: %b)",
-          mStateSaved,
+          stateSaved,
           getFragmentManager().isDestroyed());
       return;
     }
 
     final FragmentTransaction transaction = getFragmentManager().beginTransaction();
-    if (mInDialpadSearch && mSmartDialSearchFragment != null) {
-      transaction.remove(mSmartDialSearchFragment);
-    } else if (mInRegularSearch && mRegularSearchFragment != null) {
-      transaction.remove(mRegularSearchFragment);
+    if (inDialpadSearch && smartDialSearchFragment != null) {
+      transaction.remove(smartDialSearchFragment);
+    } else if (inRegularSearch && regularSearchFragment != null) {
+      transaction.remove(regularSearchFragment);
     }
 
     final String tag;
-    mInDialpadSearch = false;
-    mInRegularSearch = false;
-    mInNewSearch = false;
+    inDialpadSearch = false;
+    inRegularSearch = false;
+    inNewSearch = false;
     boolean useNewSearch =
         ConfigProviderBindings.get(this).getBoolean("enable_new_search_fragment", false);
     if (useNewSearch) {
       tag = TAG_NEW_SEARCH_FRAGMENT;
-      mInNewSearch = true;
+      inNewSearch = true;
     } else if (smartDialSearch) {
       tag = TAG_SMARTDIAL_SEARCH_FRAGMENT;
-      mInDialpadSearch = true;
+      inDialpadSearch = true;
     } else {
       tag = TAG_REGULAR_SEARCH_FRAGMENT;
-      mInRegularSearch = true;
+      inRegularSearch = true;
     }
 
-    mFloatingActionButtonController.scaleOut();
+    floatingActionButtonController.scaleOut();
 
     if (animate) {
       transaction.setCustomAnimations(android.R.animator.fade_in, 0);
@@ -1259,7 +1255,7 @@
     // Will show empty list if P13nRanker is not enabled. Else, re-ranked list by the ranker.
     if (!useNewSearch) {
       ((SearchFragment) fragment)
-          .setShowEmptyListForNullQuery(mP13nRanker.shouldShowEmptyListForNullQuery());
+          .setShowEmptyListForNullQuery(p13nRanker.shouldShowEmptyListForNullQuery());
     } else {
       // TODO(calderwoodra): add p13n ranker to new search.
     }
@@ -1272,9 +1268,9 @@
     transaction.commit();
 
     if (animate) {
-      Assert.isNotNull(mListsFragment.getView()).animate().alpha(0).withLayer();
+      Assert.isNotNull(listsFragment.getView()).animate().alpha(0).withLayer();
     }
-    mListsFragment.setUserVisibleHint(false);
+    listsFragment.setUserVisibleHint(false);
 
     if (smartDialSearch) {
       Logger.get(this).logScreenView(ScreenEvent.Type.SMART_DIAL_SEARCH, this);
@@ -1288,14 +1284,14 @@
     LogUtil.enterBlock("DialtactsActivity.exitSearchUi");
 
     // See related bug in enterSearchUI();
-    if (getFragmentManager().isDestroyed() || mStateSaved) {
+    if (getFragmentManager().isDestroyed() || stateSaved) {
       return;
     }
 
-    mSearchView.setText(null);
+    searchView.setText(null);
 
-    if (mDialpadFragment != null) {
-      mDialpadFragment.clearDialpad();
+    if (dialpadFragment != null) {
+      dialpadFragment.clearDialpad();
     }
 
     setNotInSearchUi();
@@ -1305,65 +1301,65 @@
     //   - Not visible (move then show the fab)
     //   - Visible, in the correct position (do nothing)
     //   - Visible, in the wrong position (hide, move, then show the fab)
-    if (mFloatingActionButtonController.isVisible()
+    if (floatingActionButtonController.isVisible()
         && getFabAlignment() != FloatingActionButtonController.ALIGN_END) {
-      mFloatingActionButtonController.scaleOut(
+      floatingActionButtonController.scaleOut(
           new OnVisibilityChangedListener() {
             @Override
             public void onHidden(FloatingActionButton floatingActionButton) {
               super.onHidden(floatingActionButton);
               onPageScrolled(
-                  mListsFragment.getCurrentTabIndex(), 0 /* offset */, 0 /* pixelOffset */);
-              mFloatingActionButtonController.scaleIn();
+                  listsFragment.getCurrentTabIndex(), 0 /* offset */, 0 /* pixelOffset */);
+              floatingActionButtonController.scaleIn();
             }
           });
-    } else if (!mFloatingActionButtonController.isVisible() && mListsFragment.shouldShowFab()) {
-      onPageScrolled(mListsFragment.getCurrentTabIndex(), 0 /* offset */, 0 /* pixelOffset */);
+    } else if (!floatingActionButtonController.isVisible() && listsFragment.shouldShowFab()) {
+      onPageScrolled(listsFragment.getCurrentTabIndex(), 0 /* offset */, 0 /* pixelOffset */);
       ThreadUtil.getUiThreadHandler()
-          .postDelayed(() -> mFloatingActionButtonController.scaleIn(), FAB_SCALE_IN_DELAY_MS);
+          .postDelayed(() -> floatingActionButtonController.scaleIn(), FAB_SCALE_IN_DELAY_MS);
     }
 
     final FragmentTransaction transaction = getFragmentManager().beginTransaction();
-    if (mSmartDialSearchFragment != null) {
-      transaction.remove(mSmartDialSearchFragment);
+    if (smartDialSearchFragment != null) {
+      transaction.remove(smartDialSearchFragment);
     }
-    if (mRegularSearchFragment != null) {
-      transaction.remove(mRegularSearchFragment);
+    if (regularSearchFragment != null) {
+      transaction.remove(regularSearchFragment);
     }
-    if (mNewSearchFragment != null) {
-      transaction.remove(mNewSearchFragment);
+    if (newSearchFragment != null) {
+      transaction.remove(newSearchFragment);
     }
     transaction.commit();
 
-    Assert.isNotNull(mListsFragment.getView()).animate().alpha(1).withLayer();
+    Assert.isNotNull(listsFragment.getView()).animate().alpha(1).withLayer();
 
-    if (mDialpadFragment == null || !mDialpadFragment.isVisible()) {
+    if (dialpadFragment == null || !dialpadFragment.isVisible()) {
       // If the dialpad fragment wasn't previously visible, then send a screen view because
       // we are exiting regular search. Otherwise, the screen view will be sent by
       // {@link #hideDialpadFragment}.
-      mListsFragment.sendScreenViewForCurrentPosition();
-      mListsFragment.setUserVisibleHint(true);
+      listsFragment.sendScreenViewForCurrentPosition();
+      listsFragment.setUserVisibleHint(true);
     }
-    onPageSelected(mListsFragment.getCurrentTabIndex());
+    onPageSelected(listsFragment.getCurrentTabIndex());
 
-    mActionBarController.onSearchUiExited();
+    actionBarController.onSearchUiExited();
   }
 
   @Override
   public void onBackPressed() {
     PerformanceReport.recordClick(UiAction.Type.PRESS_ANDROID_BACK_BUTTON);
 
-    if (mStateSaved) {
+    if (stateSaved) {
       return;
     }
-    if (mIsDialpadShown) {
+    if (isDialpadShown) {
       hideDialpadFragment(true, false);
-      if (TextUtils.isEmpty(mDialpadQuery)) {
+      if (TextUtils.isEmpty(dialpadQuery)) {
         exitSearchUi();
       }
     } else if (isInSearchUi()) {
-      if (mIsKeyboardOpen) {
-        DialerUtils.hideInputMethod(mParentLayout);
+      if (isKeyboardOpen) {
+        DialerUtils.hideInputMethod(parentLayout);
         PerformanceReport.recordClick(UiAction.Type.HIDE_KEYBOARD_IN_SEARCH);
       } else {
         exitSearchUi();
@@ -1378,51 +1374,51 @@
     super.onConfigurationChanged(configuration);
     // Checks whether a hardware keyboard is available
     if (configuration.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) {
-      mIsKeyboardOpen = true;
+      isKeyboardOpen = true;
     } else if (configuration.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES) {
-      mIsKeyboardOpen = false;
+      isKeyboardOpen = false;
     }
   }
 
   private void maybeEnterSearchUi() {
     if (!isInSearchUi()) {
-      enterSearchUi(true /* isSmartDial */, mSearchQuery, false);
+      enterSearchUi(true /* isSmartDial */, searchQuery, false);
     }
   }
 
   @Override
   public void onDialpadQueryChanged(String query) {
-    mDialpadQuery = query;
-    if (mSmartDialSearchFragment != null) {
-      mSmartDialSearchFragment.setAddToContactNumber(query);
+    dialpadQuery = query;
+    if (smartDialSearchFragment != null) {
+      smartDialSearchFragment.setAddToContactNumber(query);
     }
-    if (mNewSearchFragment != null) {
-      mNewSearchFragment.setRawNumber(query);
+    if (newSearchFragment != null) {
+      newSearchFragment.setRawNumber(query);
     }
     final String normalizedQuery =
         SmartDialNameMatcher.normalizeNumber(/* context = */ this, query);
 
-    if (!TextUtils.equals(mSearchView.getText(), normalizedQuery)) {
+    if (!TextUtils.equals(searchView.getText(), normalizedQuery)) {
       if (DEBUG) {
         LogUtil.v("DialtactsActivity.onDialpadQueryChanged", "new query: " + query);
       }
-      if (mDialpadFragment == null || !mDialpadFragment.isVisible()) {
+      if (dialpadFragment == null || !dialpadFragment.isVisible()) {
         // This callback can happen if the dialpad fragment is recreated because of
         // activity destruction. In that case, don't update the search view because
         // that would bring the user back to the search fragment regardless of the
         // previous state of the application. Instead, just return here and let the
         // fragment manager correctly figure out whatever fragment was last displayed.
         if (!TextUtils.isEmpty(normalizedQuery)) {
-          mPendingSearchViewQuery = normalizedQuery;
+          pendingSearchViewQuery = normalizedQuery;
         }
         return;
       }
-      mSearchView.setText(normalizedQuery);
+      searchView.setText(normalizedQuery);
     }
 
     try {
-      if (mDialpadFragment != null && mDialpadFragment.isVisible()) {
-        mDialpadFragment.process_quote_emergency_unquote(normalizedQuery);
+      if (dialpadFragment != null && dialpadFragment.isVisible()) {
+        dialpadFragment.process_quote_emergency_unquote(normalizedQuery);
       }
     } catch (Exception ignored) {
       // Skip any exceptions for this piece of code
@@ -1431,9 +1427,9 @@
 
   @Override
   public boolean onDialpadSpacerTouchWithEmptyQuery() {
-    if (mInDialpadSearch
-        && mSmartDialSearchFragment != null
-        && !mSmartDialSearchFragment.isShowingPermissionRequest()) {
+    if (inDialpadSearch
+        && smartDialSearchFragment != null
+        && !smartDialSearchFragment.isShowingPermissionRequest()) {
       PerformanceReport.recordClick(UiAction.Type.CLOSE_DIALPAD);
       hideDialpadFragment(true /* animate */, true /* clearDialpad */);
       return true;
@@ -1443,15 +1439,15 @@
 
   @Override
   public boolean onSearchListTouch(MotionEvent event) {
-    if (mIsDialpadShown) {
+    if (isDialpadShown) {
       PerformanceReport.recordClick(UiAction.Type.CLOSE_DIALPAD);
       hideDialpadFragment(true, false);
-      if (TextUtils.isEmpty(mDialpadQuery)) {
+      if (TextUtils.isEmpty(dialpadQuery)) {
         exitSearchUi();
       }
       return true;
     } else {
-      UiUtil.hideKeyboardFrom(this, mSearchEditTextLayout);
+      UiUtil.hideKeyboardFrom(this, searchEditTextLayout);
     }
     return false;
   }
@@ -1461,7 +1457,7 @@
     PerformanceReport.recordScrollStateChange(scrollState);
     if (scrollState == OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
       hideDialpadFragment(true, false);
-      DialerUtils.hideInputMethod(mParentLayout);
+      DialerUtils.hideInputMethod(parentLayout);
     }
   }
 
@@ -1485,7 +1481,7 @@
   /** Called when the user has long-pressed a contact tile to start a drag operation. */
   @Override
   public void onDragStarted(int x, int y, PhoneFavoriteSquareTileView view) {
-    mListsFragment.showRemoveView(true);
+    listsFragment.showRemoveView(true);
   }
 
   @Override
@@ -1494,7 +1490,7 @@
   /** Called when the user has released a contact tile after long-pressing it. */
   @Override
   public void onDragFinished(int x, int y) {
-    mListsFragment.showRemoveView(false);
+    listsFragment.showRemoveView(false);
   }
 
   @Override
@@ -1506,15 +1502,15 @@
    */
   @Override
   public void setDragDropController(DragDropController dragController) {
-    mDragDropController = dragController;
-    mListsFragment.getRemoveView().setDragDropController(dragController);
+    dragDropController = dragController;
+    listsFragment.getRemoveView().setDragDropController(dragController);
   }
 
   /** Implemented to satisfy {@link OldSpeedDialFragment.HostInterface} */
   @Override
   public void showAllContactsTab() {
-    if (mListsFragment != null) {
-      mListsFragment.showTab(DialtactsPagerAdapter.TAB_INDEX_ALL_CONTACTS);
+    if (listsFragment != null) {
+      listsFragment.showTab(DialtactsPagerAdapter.TAB_INDEX_ALL_CONTACTS);
     }
   }
 
@@ -1529,14 +1525,14 @@
     LogUtil.d("DialtactsActivity.enableFloatingButton", "enable: %b", enabled);
     // Floating button shouldn't be enabled when dialpad is shown.
     if (!isDialpadShown() || !enabled) {
-      mFloatingActionButtonController.setVisible(enabled);
+      floatingActionButtonController.setVisible(enabled);
     }
   }
 
   @Override
   public void onPickDataUri(
       Uri dataUri, boolean isVideoCall, CallSpecificAppData callSpecificAppData) {
-    mClearSearchOnPause = true;
+    clearSearchOnPause = true;
     PhoneNumberInteraction.startInteractionForPhoneCall(
         DialtactsActivity.this, dataUri, isVideoCall, callSpecificAppData);
   }
@@ -1555,7 +1551,7 @@
             .setIsVideoCall(isVideoCall)
             .setAllowAssistedDial(callSpecificAppData.getAllowAssistedDialing()));
 
-    mClearSearchOnPause = true;
+    clearSearchOnPause = true;
   }
 
   @Override
@@ -1569,30 +1565,30 @@
     if (newFavoritesIsEnabled()) {
       return;
     }
-    int tabIndex = mListsFragment.getCurrentTabIndex();
+    int tabIndex = listsFragment.getCurrentTabIndex();
 
     // Scroll the button from center to end when moving from the Speed Dial to Call History tab.
     // In RTL, scroll when the current tab is Call History instead, since the order of the tabs
     // is reversed and the ViewPager returns the left tab position during scroll.
     boolean isRtl = ViewUtil.isRtl();
-    if (!isRtl && tabIndex == DialtactsPagerAdapter.TAB_INDEX_SPEED_DIAL && !mIsLandscape) {
-      mFloatingActionButtonController.onPageScrolled(positionOffset);
-    } else if (isRtl && tabIndex == DialtactsPagerAdapter.TAB_INDEX_HISTORY && !mIsLandscape) {
-      mFloatingActionButtonController.onPageScrolled(1 - positionOffset);
+    if (!isRtl && tabIndex == DialtactsPagerAdapter.TAB_INDEX_SPEED_DIAL && !isLandscape) {
+      floatingActionButtonController.onPageScrolled(positionOffset);
+    } else if (isRtl && tabIndex == DialtactsPagerAdapter.TAB_INDEX_HISTORY && !isLandscape) {
+      floatingActionButtonController.onPageScrolled(1 - positionOffset);
     } else if (tabIndex != DialtactsPagerAdapter.TAB_INDEX_SPEED_DIAL) {
-      mFloatingActionButtonController.onPageScrolled(1);
+      floatingActionButtonController.onPageScrolled(1);
     }
   }
 
   @Override
   public void onPageSelected(int position) {
     updateMissedCalls();
-    int tabIndex = mListsFragment.getCurrentTabIndex();
-    if (tabIndex != mPreviouslySelectedTabIndex) {
-      mFloatingActionButtonController.scaleIn();
+    int tabIndex = listsFragment.getCurrentTabIndex();
+    if (tabIndex != previouslySelectedTabIndex) {
+      floatingActionButtonController.scaleIn();
     }
     LogUtil.i("DialtactsActivity.onPageSelected", "tabIndex: %d", tabIndex);
-    mPreviouslySelectedTabIndex = tabIndex;
+    previouslySelectedTabIndex = tabIndex;
     timeTabSelected = SystemClock.elapsedRealtime();
   }
 
@@ -1601,18 +1597,18 @@
 
   @Override
   public boolean isActionBarShowing() {
-    return mActionBarController.isActionBarShowing();
+    return actionBarController.isActionBarShowing();
   }
 
   @Override
   public boolean isDialpadShown() {
-    return mIsDialpadShown;
+    return isDialpadShown;
   }
 
   @Override
   public int getDialpadHeight() {
-    if (mDialpadFragment != null) {
-      return mDialpadFragment.getDialpadHeight();
+    if (dialpadFragment != null) {
+      return dialpadFragment.getDialpadHeight();
     }
     return 0;
   }
@@ -1624,23 +1620,23 @@
 
   @Override
   public int getActionBarHeight() {
-    return mActionBarHeight;
+    return actionBarHeight;
   }
 
   @VisibleForTesting
   public int getFabAlignment() {
     if (!newFavoritesIsEnabled()
-        && !mIsLandscape
+        && !isLandscape
         && !isInSearchUi()
-        && mListsFragment.getCurrentTabIndex() == DialtactsPagerAdapter.TAB_INDEX_SPEED_DIAL) {
+        && listsFragment.getCurrentTabIndex() == DialtactsPagerAdapter.TAB_INDEX_SPEED_DIAL) {
       return FloatingActionButtonController.ALIGN_MIDDLE;
     }
     return FloatingActionButtonController.ALIGN_END;
   }
 
   private void updateMissedCalls() {
-    if (mPreviouslySelectedTabIndex == DialtactsPagerAdapter.TAB_INDEX_HISTORY) {
-      mListsFragment.markMissedCallsAsReadAndRemoveNotifications();
+    if (previouslySelectedTabIndex == DialtactsPagerAdapter.TAB_INDEX_HISTORY) {
+      listsFragment.markMissedCallsAsReadAndRemoveNotifications();
     }
   }
 
@@ -1690,19 +1686,19 @@
   }
 
   private CallInitiationType.Type getCallInitiationType() {
-    return mIsDialpadShown
+    return isDialpadShown
         ? CallInitiationType.Type.DIALPAD
         : CallInitiationType.Type.REGULAR_SEARCH;
   }
 
   @Override
   public void onCallPlacedFromSearch() {
-    DialerUtils.hideInputMethod(mParentLayout);
-    mClearSearchOnPause = true;
+    DialerUtils.hideInputMethod(parentLayout);
+    clearSearchOnPause = true;
   }
 
   protected int getPreviouslySelectedTabIndex() {
-    return mPreviouslySelectedTabIndex;
+    return previouslySelectedTabIndex;
   }
 
   @Override
@@ -1726,8 +1722,8 @@
       MenuItem clearFrequents = menu.findItem(R.id.menu_clear_frequents);
       clearFrequents.setVisible(
           PermissionsUtil.hasContactsReadPermissions(DialtactsActivity.this)
-              && mListsFragment != null
-              && mListsFragment.hasFrequents());
+              && listsFragment != null
+              && listsFragment.hasFrequents());
 
       menu.findItem(R.id.menu_history)
           .setVisible(PermissionsUtil.hasPhonePermissions(DialtactsActivity.this));
@@ -1759,7 +1755,7 @@
     @Override
     public boolean onDrag(View v, DragEvent event) {
       if (event.getAction() == DragEvent.ACTION_DRAG_LOCATION) {
-        mDragDropController.handleDragHovered(v, (int) event.getX(), (int) event.getY());
+        dragDropController.handleDragHovered(v, (int) event.getX(), (int) event.getY());
       }
       return true;
     }
@@ -1767,7 +1763,7 @@
 
   @VisibleForTesting
   static void setVoiceSearchEnabledForTest(Optional<Boolean> enabled) {
-    sVoiceSearchEnabledForTest = enabled;
+    voiceSearchEnabledForTest = enabled;
   }
 
   private boolean newFavoritesIsEnabled() {
diff --git a/java/com/android/dialer/app/calllog/BlockReportSpamListener.java b/java/com/android/dialer/app/calllog/BlockReportSpamListener.java
index 05fb2b3..092c098 100644
--- a/java/com/android/dialer/app/calllog/BlockReportSpamListener.java
+++ b/java/com/android/dialer/app/calllog/BlockReportSpamListener.java
@@ -33,10 +33,10 @@
 /** Listener to show dialogs for block and report spam actions. */
 public class BlockReportSpamListener implements CallLogListItemViewHolder.OnClickListener {
 
-  private final Context mContext;
-  private final FragmentManager mFragmentManager;
-  private final RecyclerView.Adapter mAdapter;
-  private final FilteredNumberAsyncQueryHandler mFilteredNumberAsyncQueryHandler;
+  private final Context context;
+  private final FragmentManager fragmentManager;
+  private final RecyclerView.Adapter adapter;
+  private final FilteredNumberAsyncQueryHandler filteredNumberAsyncQueryHandler;
   private final Spam spam;
 
   public BlockReportSpamListener(
@@ -44,10 +44,10 @@
       FragmentManager fragmentManager,
       RecyclerView.Adapter adapter,
       FilteredNumberAsyncQueryHandler filteredNumberAsyncQueryHandler) {
-    mContext = context;
-    mFragmentManager = fragmentManager;
-    mAdapter = adapter;
-    mFilteredNumberAsyncQueryHandler = filteredNumberAsyncQueryHandler;
+    this.context = context;
+    this.fragmentManager = fragmentManager;
+    this.adapter = adapter;
+    this.filteredNumberAsyncQueryHandler = filteredNumberAsyncQueryHandler;
     spam = SpamComponent.get(context).spam();
   }
 
@@ -64,7 +64,7 @@
             isSpamChecked -> {
               LogUtil.i("BlockReportSpamListener.onBlockReportSpam", "onClick");
               if (isSpamChecked && spam.isSpamEnabled()) {
-                Logger.get(mContext)
+                Logger.get(context)
                     .logImpression(
                         DialerImpression.Type
                             .REPORT_CALL_AS_SPAM_VIA_CALL_LOG_BLOCK_REPORT_SPAM_SENT_VIA_BLOCK_NUMBER_DIALOG);
@@ -75,17 +75,17 @@
                     ReportingLocation.Type.CALL_LOG_HISTORY,
                     contactSourceType);
               }
-              mFilteredNumberAsyncQueryHandler.blockNumber(
+              filteredNumberAsyncQueryHandler.blockNumber(
                   uri -> {
-                    Logger.get(mContext)
+                    Logger.get(context)
                         .logImpression(DialerImpression.Type.USER_ACTION_BLOCKED_NUMBER);
-                    mAdapter.notifyDataSetChanged();
+                    adapter.notifyDataSetChanged();
                   },
                   number,
                   countryIso);
             },
             null)
-        .show(mFragmentManager, BlockReportSpamDialogs.BLOCK_REPORT_SPAM_DIALOG_TAG);
+        .show(fragmentManager, BlockReportSpamDialogs.BLOCK_REPORT_SPAM_DIALOG_TAG);
   }
 
   @Override
@@ -101,7 +101,7 @@
             () -> {
               LogUtil.i("BlockReportSpamListener.onBlock", "onClick");
               if (spam.isSpamEnabled()) {
-                Logger.get(mContext)
+                Logger.get(context)
                     .logImpression(
                         DialerImpression.Type
                             .DIALOG_ACTION_CONFIRM_NUMBER_SPAM_INDIRECTLY_VIA_BLOCK_NUMBER);
@@ -112,17 +112,17 @@
                     ReportingLocation.Type.CALL_LOG_HISTORY,
                     contactSourceType);
               }
-              mFilteredNumberAsyncQueryHandler.blockNumber(
+              filteredNumberAsyncQueryHandler.blockNumber(
                   uri -> {
-                    Logger.get(mContext)
+                    Logger.get(context)
                         .logImpression(DialerImpression.Type.USER_ACTION_BLOCKED_NUMBER);
-                    mAdapter.notifyDataSetChanged();
+                    adapter.notifyDataSetChanged();
                   },
                   number,
                   countryIso);
             },
             null)
-        .show(mFragmentManager, BlockReportSpamDialogs.BLOCK_DIALOG_TAG);
+        .show(fragmentManager, BlockReportSpamDialogs.BLOCK_DIALOG_TAG);
   }
 
   @Override
@@ -140,7 +140,7 @@
             () -> {
               LogUtil.i("BlockReportSpamListener.onUnblock", "onClick");
               if (isSpam && spam.isSpamEnabled()) {
-                Logger.get(mContext)
+                Logger.get(context)
                     .logImpression(DialerImpression.Type.REPORT_AS_NOT_SPAM_VIA_UNBLOCK_NUMBER);
                 spam.reportNotSpamFromCallHistory(
                     number,
@@ -149,16 +149,16 @@
                     ReportingLocation.Type.CALL_LOG_HISTORY,
                     contactSourceType);
               }
-              mFilteredNumberAsyncQueryHandler.unblock(
+              filteredNumberAsyncQueryHandler.unblock(
                   (rows, values) -> {
-                    Logger.get(mContext)
+                    Logger.get(context)
                         .logImpression(DialerImpression.Type.USER_ACTION_UNBLOCKED_NUMBER);
-                    mAdapter.notifyDataSetChanged();
+                    adapter.notifyDataSetChanged();
                   },
                   blockId);
             },
             null)
-        .show(mFragmentManager, BlockReportSpamDialogs.UNBLOCK_DIALOG_TAG);
+        .show(fragmentManager, BlockReportSpamDialogs.UNBLOCK_DIALOG_TAG);
   }
 
   @Override
@@ -173,7 +173,7 @@
             () -> {
               LogUtil.i("BlockReportSpamListener.onReportNotSpam", "onClick");
               if (spam.isSpamEnabled()) {
-                Logger.get(mContext)
+                Logger.get(context)
                     .logImpression(DialerImpression.Type.DIALOG_ACTION_CONFIRM_NUMBER_NOT_SPAM);
                 spam.reportNotSpamFromCallHistory(
                     number,
@@ -182,9 +182,9 @@
                     ReportingLocation.Type.CALL_LOG_HISTORY,
                     contactSourceType);
               }
-              mAdapter.notifyDataSetChanged();
+              adapter.notifyDataSetChanged();
             },
             null)
-        .show(mFragmentManager, BlockReportSpamDialogs.NOT_SPAM_DIALOG_TAG);
+        .show(fragmentManager, BlockReportSpamDialogs.NOT_SPAM_DIALOG_TAG);
   }
 }
diff --git a/java/com/android/dialer/app/calllog/CallLogActivity.java b/java/com/android/dialer/app/calllog/CallLogActivity.java
index 4b65ed9..99e11b0 100644
--- a/java/com/android/dialer/app/calllog/CallLogActivity.java
+++ b/java/com/android/dialer/app/calllog/CallLogActivity.java
@@ -52,13 +52,13 @@
   @VisibleForTesting static final int TAB_INDEX_ALL = 0;
   @VisibleForTesting static final int TAB_INDEX_MISSED = 1;
   private static final int TAB_INDEX_COUNT = 2;
-  private ViewPager mViewPager;
-  private ViewPagerTabs mViewPagerTabs;
-  private ViewPagerAdapter mViewPagerAdapter;
-  private CallLogFragment mAllCallsFragment;
-  private CallLogFragment mMissedCallsFragment;
-  private String[] mTabTitles;
-  private boolean mIsResumed;
+  private ViewPager viewPager;
+  private ViewPagerTabs viewPagerTabs;
+  private ViewPagerAdapter viewPagerAdapter;
+  private CallLogFragment allCallsFragment;
+  private CallLogFragment missedCallsFragment;
+  private String[] tabTitles;
+  private boolean isResumed;
   private int selectedPageIndex;
 
   @Override
@@ -84,21 +84,21 @@
     }
     selectedPageIndex = startingTab;
 
-    mTabTitles = new String[TAB_INDEX_COUNT];
-    mTabTitles[0] = getString(R.string.call_log_all_title);
-    mTabTitles[1] = getString(R.string.call_log_missed_title);
+    tabTitles = new String[TAB_INDEX_COUNT];
+    tabTitles[0] = getString(R.string.call_log_all_title);
+    tabTitles[1] = getString(R.string.call_log_missed_title);
 
-    mViewPager = (ViewPager) findViewById(R.id.call_log_pager);
+    viewPager = (ViewPager) findViewById(R.id.call_log_pager);
 
-    mViewPagerAdapter = new ViewPagerAdapter(getFragmentManager());
-    mViewPager.setAdapter(mViewPagerAdapter);
-    mViewPager.setOffscreenPageLimit(1);
-    mViewPager.setOnPageChangeListener(this);
+    viewPagerAdapter = new ViewPagerAdapter(getFragmentManager());
+    viewPager.setAdapter(viewPagerAdapter);
+    viewPager.setOffscreenPageLimit(1);
+    viewPager.setOnPageChangeListener(this);
 
-    mViewPagerTabs = (ViewPagerTabs) findViewById(R.id.viewpager_header);
+    viewPagerTabs = (ViewPagerTabs) findViewById(R.id.viewpager_header);
 
-    mViewPagerTabs.setViewPager(mViewPager);
-    mViewPager.setCurrentItem(startingTab);
+    viewPagerTabs.setViewPager(viewPager);
+    viewPager.setCurrentItem(startingTab);
   }
 
   @Override
@@ -110,23 +110,23 @@
       PerformanceReport.startRecording();
     }
 
-    mIsResumed = true;
+    isResumed = true;
     super.onResume();
     sendScreenViewForChildFragment();
   }
 
   @Override
   protected void onPause() {
-    mIsResumed = false;
+    isResumed = false;
     super.onPause();
   }
 
   @Override
   protected void onStop() {
-    if (!isChangingConfigurations() && mViewPager != null) {
+    if (!isChangingConfigurations() && viewPager != null) {
       // Make sure current index != selectedPageIndex
       selectedPageIndex = -1;
-      updateMissedCalls(mViewPager.getCurrentItem());
+      updateMissedCalls(viewPager.getCurrentItem());
     }
     super.onStop();
   }
@@ -141,9 +141,9 @@
   @Override
   public boolean onPrepareOptionsMenu(Menu menu) {
     final MenuItem itemDeleteAll = menu.findItem(R.id.delete_all);
-    if (mAllCallsFragment != null && itemDeleteAll != null) {
+    if (allCallsFragment != null && itemDeleteAll != null) {
       // If onPrepareOptionsMenu is called before fragments are loaded, don't do anything.
-      final CallLogAdapter adapter = mAllCallsFragment.getAdapter();
+      final CallLogAdapter adapter = allCallsFragment.getAdapter();
       itemDeleteAll.setVisible(adapter != null && !adapter.isEmpty());
     }
     return true;
@@ -170,22 +170,22 @@
 
   @Override
   public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
-    mViewPagerTabs.onPageScrolled(position, positionOffset, positionOffsetPixels);
+    viewPagerTabs.onPageScrolled(position, positionOffset, positionOffsetPixels);
   }
 
   @Override
   public void onPageSelected(int position) {
     updateMissedCalls(position);
     selectedPageIndex = position;
-    if (mIsResumed) {
+    if (isResumed) {
       sendScreenViewForChildFragment();
     }
-    mViewPagerTabs.onPageSelected(position);
+    viewPagerTabs.onPageSelected(position);
   }
 
   @Override
   public void onPageScrollStateChanged(int state) {
-    mViewPagerTabs.onPageScrollStateChanged(state);
+    viewPagerTabs.onPageScrollStateChanged(state);
   }
 
   private void sendScreenViewForChildFragment() {
@@ -194,7 +194,7 @@
 
   private int getRtlPosition(int position) {
     if (ViewUtil.isRtl()) {
-      return mViewPagerAdapter.getCount() - 1 - position;
+      return viewPagerAdapter.getCount() - 1 - position;
     }
     return position;
   }
@@ -205,13 +205,13 @@
     }
     switch (getRtlPosition(position)) {
       case TAB_INDEX_ALL:
-        if (mAllCallsFragment != null) {
-          mAllCallsFragment.markMissedCallsAsReadAndRemoveNotifications();
+        if (allCallsFragment != null) {
+          allCallsFragment.markMissedCallsAsReadAndRemoveNotifications();
         }
         break;
       case TAB_INDEX_MISSED:
-        if (mMissedCallsFragment != null) {
-          mMissedCallsFragment.markMissedCallsAsReadAndRemoveNotifications();
+        if (missedCallsFragment != null) {
+          missedCallsFragment.markMissedCallsAsReadAndRemoveNotifications();
         }
         break;
       default:
@@ -255,10 +255,10 @@
       final CallLogFragment fragment = (CallLogFragment) super.instantiateItem(container, position);
       switch (getRtlPosition(position)) {
         case TAB_INDEX_ALL:
-          mAllCallsFragment = fragment;
+          allCallsFragment = fragment;
           break;
         case TAB_INDEX_MISSED:
-          mMissedCallsFragment = fragment;
+          missedCallsFragment = fragment;
           break;
         default:
           throw Assert.createIllegalStateFailException("Invalid position: " + position);
@@ -268,7 +268,7 @@
 
     @Override
     public CharSequence getPageTitle(int position) {
-      return mTabTitles[position];
+      return tabTitles[position];
     }
 
     @Override
diff --git a/java/com/android/dialer/app/calllog/CallLogAdapter.java b/java/com/android/dialer/app/calllog/CallLogAdapter.java
index f3d04d9..261b0ec 100644
--- a/java/com/android/dialer/app/calllog/CallLogAdapter.java
+++ b/java/com/android/dialer/app/calllog/CallLogAdapter.java
@@ -116,54 +116,54 @@
   public static final String ENABLE_CALL_LOG_MULTI_SELECT = "enable_call_log_multiselect";
   public static final boolean ENABLE_CALL_LOG_MULTI_SELECT_FLAG = true;
 
-  protected final Activity mActivity;
-  protected final VoicemailPlaybackPresenter mVoicemailPlaybackPresenter;
+  protected final Activity activity;
+  protected final VoicemailPlaybackPresenter voicemailPlaybackPresenter;
   /** Cache for repeated requests to Telecom/Telephony. */
-  protected final CallLogCache mCallLogCache;
+  protected final CallLogCache callLogCache;
 
-  private final CallFetcher mCallFetcher;
-  private final OnActionModeStateChangedListener mActionModeStateChangedListener;
-  private final MultiSelectRemoveView mMultiSelectRemoveView;
-  @NonNull private final FilteredNumberAsyncQueryHandler mFilteredNumberAsyncQueryHandler;
-  private final int mActivityType;
+  private final CallFetcher callFetcher;
+  private final OnActionModeStateChangedListener actionModeStateChangedListener;
+  private final MultiSelectRemoveView multiSelectRemoveView;
+  @NonNull private final FilteredNumberAsyncQueryHandler filteredNumberAsyncQueryHandler;
+  private final int activityType;
 
   /** Instance of helper class for managing views. */
-  private final CallLogListItemHelper mCallLogListItemHelper;
+  private final CallLogListItemHelper callLogListItemHelper;
   /** Helper to group call log entries. */
-  private final CallLogGroupBuilder mCallLogGroupBuilder;
+  private final CallLogGroupBuilder callLogGroupBuilder;
 
-  private final AsyncTaskExecutor mAsyncTaskExecutor = AsyncTaskExecutors.createAsyncTaskExecutor();
-  private ContactInfoCache mContactInfoCache;
+  private final AsyncTaskExecutor asyncTaskExecutor = AsyncTaskExecutors.createAsyncTaskExecutor();
+  private ContactInfoCache contactInfoCache;
   // Tracks the position of the currently expanded list item.
-  private int mCurrentlyExpandedPosition = RecyclerView.NO_POSITION;
+  private int currentlyExpandedPosition = RecyclerView.NO_POSITION;
   // Tracks the rowId of the currently expanded list item, so the position can be updated if there
   // are any changes to the call log entries, such as additions or removals.
-  private long mCurrentlyExpandedRowId = NO_EXPANDED_LIST_ITEM;
+  private long currentlyExpandedRowId = NO_EXPANDED_LIST_ITEM;
 
-  private final CallLogAlertManager mCallLogAlertManager;
+  private final CallLogAlertManager callLogAlertManager;
 
-  public ActionMode mActionMode = null;
+  public ActionMode actionMode = null;
   public boolean selectAllMode = false;
   public boolean deselectAllMode = false;
   private final SparseArray<String> selectedItems = new SparseArray<>();
 
-  private final ActionMode.Callback mActionModeCallback =
+  private final ActionMode.Callback actionModeCallback =
       new ActionMode.Callback() {
 
         // Called when the action mode is created; startActionMode() was called
         @Override
         public boolean onCreateActionMode(ActionMode mode, Menu menu) {
-          if (mActivity != null) {
+          if (activity != null) {
             announceforAccessibility(
-                mActivity.getCurrentFocus(),
-                mActivity.getString(R.string.description_entering_bulk_action_mode));
+                activity.getCurrentFocus(),
+                activity.getString(R.string.description_entering_bulk_action_mode));
           }
-          mActionMode = mode;
+          actionMode = mode;
           // Inflate a menu resource providing context menu items
           MenuInflater inflater = mode.getMenuInflater();
           inflater.inflate(R.menu.actionbar_delete, menu);
-          mMultiSelectRemoveView.showMultiSelectRemoveView(true);
-          mActionModeStateChangedListener.onActionModeStateChanged(true);
+          multiSelectRemoveView.showMultiSelectRemoveView(true);
+          actionModeStateChangedListener.onActionModeStateChanged(true);
           return true;
         }
 
@@ -178,7 +178,7 @@
         @Override
         public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
           if (item.getItemId() == R.id.action_bar_delete_menu_item) {
-            Logger.get(mActivity).logImpression(DialerImpression.Type.MULTISELECT_TAP_DELETE_ICON);
+            Logger.get(activity).logImpression(DialerImpression.Type.MULTISELECT_TAP_DELETE_ICON);
             if (selectedItems.size() > 0) {
               showDeleteSelectedItemsDialog();
             }
@@ -191,27 +191,27 @@
         // Called when the user exits the action mode
         @Override
         public void onDestroyActionMode(ActionMode mode) {
-          if (mActivity != null) {
+          if (activity != null) {
             announceforAccessibility(
-                mActivity.getCurrentFocus(),
-                mActivity.getString(R.string.description_leaving_bulk_action_mode));
+                activity.getCurrentFocus(),
+                activity.getString(R.string.description_leaving_bulk_action_mode));
           }
           selectedItems.clear();
-          mActionMode = null;
+          actionMode = null;
           selectAllMode = false;
           deselectAllMode = false;
-          mMultiSelectRemoveView.showMultiSelectRemoveView(false);
-          mActionModeStateChangedListener.onActionModeStateChanged(false);
+          multiSelectRemoveView.showMultiSelectRemoveView(false);
+          actionModeStateChangedListener.onActionModeStateChanged(false);
           notifyDataSetChanged();
         }
       };
 
   private void showDeleteSelectedItemsDialog() {
     SparseArray<String> voicemailsToDeleteOnConfirmation = selectedItems.clone();
-    new AlertDialog.Builder(mActivity, R.style.AlertDialogCustom)
+    new AlertDialog.Builder(activity, R.style.AlertDialogCustom)
         .setCancelable(true)
         .setTitle(
-            mActivity
+            activity
                 .getResources()
                 .getQuantityString(
                     R.plurals.delete_voicemails_confirmation_dialog_title, selectedItems.size()))
@@ -224,9 +224,9 @@
                     "CallLogAdapter.showDeleteSelectedItemsDialog",
                     "onClick, these items to delete " + voicemailsToDeleteOnConfirmation);
                 deleteSelectedItems(voicemailsToDeleteOnConfirmation);
-                mActionMode.finish();
+                actionMode.finish();
                 dialog.cancel();
-                Logger.get(mActivity)
+                Logger.get(activity)
                     .logImpression(
                         DialerImpression.Type.MULTISELECT_DELETE_ENTRY_VIA_CONFIRMATION_DIALOG);
               }
@@ -235,7 +235,7 @@
             new OnCancelListener() {
               @Override
               public void onCancel(DialogInterface dialogInterface) {
-                Logger.get(mActivity)
+                Logger.get(activity)
                     .logImpression(
                         DialerImpression.Type
                             .MULTISELECT_CANCEL_CONFIRMATION_DIALOG_VIA_CANCEL_TOUCH);
@@ -247,7 +247,7 @@
             new DialogInterface.OnClickListener() {
               @Override
               public void onClick(final DialogInterface dialog, final int button) {
-                Logger.get(mActivity)
+                Logger.get(activity)
                     .logImpression(
                         DialerImpression.Type
                             .MULTISELECT_CANCEL_CONFIRMATION_DIALOG_VIA_CANCEL_BUTTON);
@@ -255,7 +255,7 @@
               }
             })
         .show();
-    Logger.get(mActivity)
+    Logger.get(activity)
         .logImpression(DialerImpression.Type.MULTISELECT_DISPLAY_DELETE_CONFIRMATION_DIALOG);
   }
 
@@ -263,30 +263,30 @@
     for (int i = 0; i < voicemailsToDelete.size(); i++) {
       String voicemailUri = voicemailsToDelete.get(voicemailsToDelete.keyAt(i));
       LogUtil.i("CallLogAdapter.deleteSelectedItems", "deleting uri:" + voicemailUri);
-      CallLogAsyncTaskUtil.deleteVoicemail(mActivity, Uri.parse(voicemailUri), null);
+      CallLogAsyncTaskUtil.deleteVoicemail(activity, Uri.parse(voicemailUri), null);
     }
   }
 
-  private final View.OnLongClickListener mLongPressListener =
+  private final View.OnLongClickListener longPressListener =
       new View.OnLongClickListener() {
         @Override
         public boolean onLongClick(View v) {
           if (ConfigProviderBindings.get(v.getContext())
                   .getBoolean(ENABLE_CALL_LOG_MULTI_SELECT, ENABLE_CALL_LOG_MULTI_SELECT_FLAG)
-              && mVoicemailPlaybackPresenter != null) {
+              && voicemailPlaybackPresenter != null) {
             if (v.getId() == R.id.primary_action_view || v.getId() == R.id.quick_contact_photo) {
-              if (mActionMode == null) {
-                Logger.get(mActivity)
+              if (actionMode == null) {
+                Logger.get(activity)
                     .logImpression(
                         DialerImpression.Type.MULTISELECT_LONG_PRESS_ENTER_MULTI_SELECT_MODE);
-                mActionMode = v.startActionMode(mActionModeCallback);
+                actionMode = v.startActionMode(actionModeCallback);
               }
-              Logger.get(mActivity)
+              Logger.get(activity)
                   .logImpression(DialerImpression.Type.MULTISELECT_LONG_PRESS_TAP_ENTRY);
               CallLogListItemViewHolder viewHolder = (CallLogListItemViewHolder) v.getTag();
               viewHolder.quickContactView.setVisibility(View.GONE);
               viewHolder.checkBoxView.setVisibility(View.VISIBLE);
-              mExpandCollapseListener.onClick(v);
+              expandCollapseListener.onClick(v);
               return true;
             }
           }
@@ -296,11 +296,11 @@
 
   @VisibleForTesting
   public View.OnClickListener getExpandCollapseListener() {
-    return mExpandCollapseListener;
+    return expandCollapseListener;
   }
 
   /** The OnClickListener used to expand or collapse the action buttons of a call log entry. */
-  private final View.OnClickListener mExpandCollapseListener =
+  private final View.OnClickListener expandCollapseListener =
       new View.OnClickListener() {
         @Override
         public void onClick(View v) {
@@ -310,17 +310,17 @@
           if (viewHolder == null) {
             return;
           }
-          if (mActionMode != null && viewHolder.voicemailUri != null) {
+          if (actionMode != null && viewHolder.voicemailUri != null) {
             selectAllMode = false;
             deselectAllMode = false;
-            mMultiSelectRemoveView.setSelectAllModeToFalse();
+            multiSelectRemoveView.setSelectAllModeToFalse();
             int id = getVoicemailId(viewHolder.voicemailUri);
             if (selectedItems.get(id) != null) {
-              Logger.get(mActivity)
+              Logger.get(activity)
                   .logImpression(DialerImpression.Type.MULTISELECT_SINGLE_PRESS_UNSELECT_ENTRY);
               uncheckMarkCallLogEntry(viewHolder, id);
             } else {
-              Logger.get(mActivity)
+              Logger.get(activity)
                   .logImpression(DialerImpression.Type.MULTISELECT_SINGLE_PRESS_SELECT_ENTRY);
               checkMarkCallLogEntry(viewHolder);
               // select all check box logic
@@ -330,15 +330,15 @@
                     "getitem count %d is equal to items select count %d, check select all box",
                     getItemCount(),
                     selectedItems.size());
-                mMultiSelectRemoveView.tapSelectAll();
+                multiSelectRemoveView.tapSelectAll();
               }
             }
             return;
           }
 
-          if (mVoicemailPlaybackPresenter != null) {
+          if (voicemailPlaybackPresenter != null) {
             // Always reset the voicemail playback state on expand or collapse.
-            mVoicemailPlaybackPresenter.resetAll();
+            voicemailPlaybackPresenter.resetAll();
           }
 
           // If enriched call capabilities were unknown on the initial load,
@@ -368,16 +368,16 @@
             getEnrichedCallManager().requestCapabilities(viewHolder.number);
           }
 
-          if (viewHolder.rowId == mCurrentlyExpandedRowId) {
+          if (viewHolder.rowId == currentlyExpandedRowId) {
             // Hide actions, if the clicked item is the expanded item.
             viewHolder.showActions(false);
 
-            mCurrentlyExpandedPosition = RecyclerView.NO_POSITION;
-            mCurrentlyExpandedRowId = NO_EXPANDED_LIST_ITEM;
+            currentlyExpandedPosition = RecyclerView.NO_POSITION;
+            currentlyExpandedRowId = NO_EXPANDED_LIST_ITEM;
           } else {
             if (viewHolder.callType == CallLog.Calls.MISSED_TYPE) {
-              CallLogAsyncTaskUtil.markCallAsRead(mActivity, viewHolder.callIds);
-              if (mActivityType == ACTIVITY_TYPE_DIALTACTS) {
+              CallLogAsyncTaskUtil.markCallAsRead(activity, viewHolder.callIds);
+              if (activityType == ACTIVITY_TYPE_DIALTACTS) {
                 ((DialtactsActivity) v.getContext()).updateTabUnreadCounts();
               }
             }
@@ -400,7 +400,7 @@
           if (intentProvider == null) {
             return false;
           }
-          return DuoConstants.PACKAGE_NAME.equals(intentProvider.getIntent(mActivity).getPackage());
+          return DuoConstants.PACKAGE_NAME.equals(intentProvider.getIntent(activity).getPackage());
         }
       };
 
@@ -411,8 +411,8 @@
 
   private void checkMarkCallLogEntry(CallLogListItemViewHolder viewHolder) {
     announceforAccessibility(
-        mActivity.getCurrentFocus(),
-        mActivity.getString(
+        activity.getCurrentFocus(),
+        activity.getString(
             R.string.description_selecting_bulk_action_mode, viewHolder.nameOrNumber));
     viewHolder.quickContactView.setVisibility(View.GONE);
     viewHolder.checkBoxView.setVisibility(View.VISIBLE);
@@ -427,14 +427,14 @@
   }
 
   private void updateActionBar() {
-    if (mActionMode == null && selectedItems.size() > 0) {
-      Logger.get(mActivity)
+    if (actionMode == null && selectedItems.size() > 0) {
+      Logger.get(activity)
           .logImpression(DialerImpression.Type.MULTISELECT_ROTATE_AND_SHOW_ACTION_MODE);
-      mActivity.startActionMode(mActionModeCallback);
+      activity.startActionMode(actionModeCallback);
     }
-    if (mActionMode != null) {
-      mActionMode.setTitle(
-          mActivity
+    if (actionMode != null) {
+      actionMode.setTitle(
+          activity
               .getResources()
               .getString(
                   R.string.voicemailMultiSelectActionBarTitle,
@@ -444,8 +444,8 @@
 
   private void uncheckMarkCallLogEntry(CallLogListItemViewHolder viewHolder, int id) {
     announceforAccessibility(
-        mActivity.getCurrentFocus(),
-        mActivity.getString(
+        activity.getCurrentFocus(),
+        activity.getString(
             R.string.description_unselecting_bulk_action_mode, viewHolder.nameOrNumber));
     selectedItems.delete(id);
     viewHolder.checkBoxView.setVisibility(View.GONE);
@@ -464,7 +464,7 @@
    * if removing an item, it will be shown as an invisible view. This simplifies the calculation of
    * item position.
    */
-  @NonNull private Set<Long> mHiddenRowIds = new ArraySet<>();
+  @NonNull private Set<Long> hiddenRowIds = new ArraySet<>();
   /**
    * Holds a list of URIs that are pending deletion or undo. If the activity ends before the undo
    * timeout, all of the pending URIs will be deleted.
@@ -473,9 +473,9 @@
    * VisualVoicemailCallLogFragment}. The CallLogAdapter does not need to know about what to do with
    * hidden item or what to hide.
    */
-  @NonNull private final Set<Uri> mHiddenItemUris = new ArraySet<>();
+  @NonNull private final Set<Uri> hiddenItemUris = new ArraySet<>();
 
-  private CallLogListItemViewHolder.OnClickListener mBlockReportSpamListener;
+  private CallLogListItemViewHolder.OnClickListener blockReportSpamListener;
 
   /**
    * Map, keyed by call ID, used to track the callback action for a call. Calls associated with the
@@ -483,7 +483,7 @@
    * com.android.dialer.app.calllog.CallLogGroupBuilder}. This information is used to set the
    * callback icon and trigger the corresponding action.
    */
-  private final Map<Long, Integer> mCallbackActions = new ArrayMap<>();
+  private final Map<Long, Integer> callbackActions = new ArrayMap<>();
 
   /**
    * Map, keyed by call ID, used to track the day group for a call. As call log entries are put into
@@ -497,12 +497,12 @@
    * previous day group without having to reverse the cursor to the start of the previous day call
    * log entry.
    */
-  private final Map<Long, Integer> mDayGroups = new ArrayMap<>();
+  private final Map<Long, Integer> dayGroups = new ArrayMap<>();
 
-  private boolean mLoading = true;
-  private ContactsPreferences mContactsPreferences;
+  private boolean loading = true;
+  private ContactsPreferences contactsPreferences;
 
-  private boolean mIsSpamEnabled;
+  private boolean isSpamEnabled;
 
   public CallLogAdapter(
       Activity activity,
@@ -517,58 +517,58 @@
       int activityType) {
     super();
 
-    mActivity = activity;
-    mCallFetcher = callFetcher;
-    mActionModeStateChangedListener = actionModeStateChangedListener;
-    mMultiSelectRemoveView = multiSelectRemoveView;
-    mVoicemailPlaybackPresenter = voicemailPlaybackPresenter;
-    if (mVoicemailPlaybackPresenter != null) {
-      mVoicemailPlaybackPresenter.setOnVoicemailDeletedListener(this);
+    this.activity = activity;
+    this.callFetcher = callFetcher;
+    this.actionModeStateChangedListener = actionModeStateChangedListener;
+    this.multiSelectRemoveView = multiSelectRemoveView;
+    this.voicemailPlaybackPresenter = voicemailPlaybackPresenter;
+    if (this.voicemailPlaybackPresenter != null) {
+      this.voicemailPlaybackPresenter.setOnVoicemailDeletedListener(this);
     }
 
-    mActivityType = activityType;
+    this.activityType = activityType;
 
-    mContactInfoCache = contactInfoCache;
+    this.contactInfoCache = contactInfoCache;
 
     if (!PermissionsUtil.hasContactsReadPermissions(activity)) {
-      mContactInfoCache.disableRequestProcessing();
+      this.contactInfoCache.disableRequestProcessing();
     }
 
-    Resources resources = mActivity.getResources();
+    Resources resources = this.activity.getResources();
 
-    mCallLogCache = callLogCache;
+    this.callLogCache = callLogCache;
 
     PhoneCallDetailsHelper phoneCallDetailsHelper =
-        new PhoneCallDetailsHelper(mActivity, resources, mCallLogCache);
-    mCallLogListItemHelper =
-        new CallLogListItemHelper(phoneCallDetailsHelper, resources, mCallLogCache);
-    mCallLogGroupBuilder = new CallLogGroupBuilder(this);
-    mFilteredNumberAsyncQueryHandler = Assert.isNotNull(filteredNumberAsyncQueryHandler);
+        new PhoneCallDetailsHelper(this.activity, resources, this.callLogCache);
+    callLogListItemHelper =
+        new CallLogListItemHelper(phoneCallDetailsHelper, resources, this.callLogCache);
+    callLogGroupBuilder = new CallLogGroupBuilder(this);
+    this.filteredNumberAsyncQueryHandler = Assert.isNotNull(filteredNumberAsyncQueryHandler);
 
-    mContactsPreferences = new ContactsPreferences(mActivity);
+    contactsPreferences = new ContactsPreferences(this.activity);
 
-    mBlockReportSpamListener =
+    blockReportSpamListener =
         new BlockReportSpamListener(
-            mActivity,
-            ((Activity) mActivity).getFragmentManager(),
+            this.activity,
+            ((Activity) this.activity).getFragmentManager(),
             this,
-            mFilteredNumberAsyncQueryHandler);
+            this.filteredNumberAsyncQueryHandler);
     setHasStableIds(true);
 
-    mCallLogAlertManager =
-        new CallLogAlertManager(this, LayoutInflater.from(mActivity), alertContainer);
+    callLogAlertManager =
+        new CallLogAlertManager(this, LayoutInflater.from(this.activity), alertContainer);
   }
 
   private void expandViewHolderActions(CallLogListItemViewHolder viewHolder) {
     if (!TextUtils.isEmpty(viewHolder.voicemailUri)) {
-      Logger.get(mActivity).logImpression(DialerImpression.Type.VOICEMAIL_EXPAND_ENTRY);
+      Logger.get(activity).logImpression(DialerImpression.Type.VOICEMAIL_EXPAND_ENTRY);
     }
 
-    int lastExpandedPosition = mCurrentlyExpandedPosition;
+    int lastExpandedPosition = currentlyExpandedPosition;
     // Show the actions for the clicked list item.
     viewHolder.showActions(true);
-    mCurrentlyExpandedPosition = viewHolder.getAdapterPosition();
-    mCurrentlyExpandedRowId = viewHolder.rowId;
+    currentlyExpandedPosition = viewHolder.getAdapterPosition();
+    currentlyExpandedRowId = viewHolder.rowId;
 
     // If another item is expanded, notify it that it has changed. Its actions will be
     // hidden when it is re-binded because we change mCurrentlyExpandedRowId above.
@@ -578,8 +578,8 @@
   }
 
   public void onSaveInstanceState(Bundle outState) {
-    outState.putInt(KEY_EXPANDED_POSITION, mCurrentlyExpandedPosition);
-    outState.putLong(KEY_EXPANDED_ROW_ID, mCurrentlyExpandedRowId);
+    outState.putInt(KEY_EXPANDED_POSITION, currentlyExpandedPosition);
+    outState.putLong(KEY_EXPANDED_ROW_ID, currentlyExpandedRowId);
 
     ArrayList<String> listOfSelectedItems = new ArrayList<>();
 
@@ -603,9 +603,9 @@
 
   public void onRestoreInstanceState(Bundle savedInstanceState) {
     if (savedInstanceState != null) {
-      mCurrentlyExpandedPosition =
+      currentlyExpandedPosition =
           savedInstanceState.getInt(KEY_EXPANDED_POSITION, RecyclerView.NO_POSITION);
-      mCurrentlyExpandedRowId =
+      currentlyExpandedRowId =
           savedInstanceState.getLong(KEY_EXPANDED_ROW_ID, NO_EXPANDED_LIST_ITEM);
       // Restoring multi selected entries
       ArrayList<String> listOfSelectedItems =
@@ -642,15 +642,15 @@
   /** Requery on background thread when {@link Cursor} changes. */
   @Override
   protected void onContentChanged() {
-    mCallFetcher.fetchCalls();
+    callFetcher.fetchCalls();
   }
 
   public void setLoading(boolean loading) {
-    mLoading = loading;
+    this.loading = loading;
   }
 
   public boolean isEmpty() {
-    if (mLoading) {
+    if (loading) {
       // We don't want the empty state to show when loading.
       return false;
     } else {
@@ -659,15 +659,15 @@
   }
 
   public void clearFilteredNumbersCache() {
-    mFilteredNumberAsyncQueryHandler.clearCache();
+    filteredNumberAsyncQueryHandler.clearCache();
   }
 
   public void onResume() {
-    if (PermissionsUtil.hasPermission(mActivity, android.Manifest.permission.READ_CONTACTS)) {
-      mContactInfoCache.start();
+    if (PermissionsUtil.hasPermission(activity, android.Manifest.permission.READ_CONTACTS)) {
+      contactInfoCache.start();
     }
-    mContactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
-    mIsSpamEnabled = SpamComponent.get(mActivity).spam().isSpamEnabled();
+    contactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
+    isSpamEnabled = SpamComponent.get(activity).spam().isSpamEnabled();
     getDuo().registerListener(this);
     notifyDataSetChanged();
   }
@@ -675,8 +675,8 @@
   public void onPause() {
     getDuo().unregisterListener(this);
     pauseCache();
-    for (Uri uri : mHiddenItemUris) {
-      CallLogAsyncTaskUtil.deleteVoicemail(mActivity, uri, null);
+    for (Uri uri : hiddenItemUris) {
+      CallLogAsyncTaskUtil.deleteVoicemail(activity, uri, null);
     }
   }
 
@@ -685,24 +685,24 @@
   }
 
   public CallLogAlertManager getAlertManager() {
-    return mCallLogAlertManager;
+    return callLogAlertManager;
   }
 
   @VisibleForTesting
   /* package */ void pauseCache() {
-    mContactInfoCache.stop();
-    mCallLogCache.reset();
+    contactInfoCache.stop();
+    callLogCache.reset();
   }
 
   @Override
   protected void addGroups(Cursor cursor) {
-    mCallLogGroupBuilder.addGroups(cursor);
+    callLogGroupBuilder.addGroups(cursor);
   }
 
   @Override
   public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
     if (viewType == VIEW_TYPE_ALERT) {
-      return mCallLogAlertManager.createViewHolder(parent);
+      return callLogAlertManager.createViewHolder(parent);
     }
     return createCallLogEntryViewHolder(parent);
   }
@@ -714,19 +714,19 @@
    * @return The {@link ViewHolder}.
    */
   private ViewHolder createCallLogEntryViewHolder(ViewGroup parent) {
-    LayoutInflater inflater = LayoutInflater.from(mActivity);
+    LayoutInflater inflater = LayoutInflater.from(activity);
     View view = inflater.inflate(R.layout.call_log_list_item, parent, false);
     CallLogListItemViewHolder viewHolder =
         CallLogListItemViewHolder.create(
             view,
-            mActivity,
-            mBlockReportSpamListener,
-            mExpandCollapseListener,
-            mLongPressListener,
-            mActionModeStateChangedListener,
-            mCallLogCache,
-            mCallLogListItemHelper,
-            mVoicemailPlaybackPresenter);
+            activity,
+            blockReportSpamListener,
+            expandCollapseListener,
+            longPressListener,
+            actionModeStateChangedListener,
+            callLogCache,
+            callLogListItemHelper,
+            voicemailPlaybackPresenter);
 
     viewHolder.callLogEntryView.setTag(viewHolder);
 
@@ -802,7 +802,7 @@
     int groupSize = getGroupSize(position);
     CallDetailsEntries callDetailsEntries = createCallDetailsEntries(c, groupSize);
     PhoneCallDetails details = createPhoneCallDetails(c, groupSize, views);
-    if (mHiddenRowIds.contains(c.getLong(CallLogQuery.ID))) {
+    if (hiddenRowIds.contains(c.getLong(CallLogQuery.ID))) {
       views.callLogEntryView.setVisibility(View.GONE);
       views.dayGroupHeader.setVisibility(View.GONE);
       return;
@@ -810,7 +810,7 @@
       views.callLogEntryView.setVisibility(View.VISIBLE);
       // dayGroupHeader will be restored after loadAndRender() if it is needed.
     }
-    if (mCurrentlyExpandedRowId == views.rowId) {
+    if (currentlyExpandedRowId == views.rowId) {
       views.inflateActionViewStub();
     }
     loadAndRender(views, views.rowId, details, callDetailsEntries);
@@ -849,19 +849,19 @@
           @Override
           protected Boolean doInBackground(Void... params) {
             viewHolder.blockId =
-                mFilteredNumberAsyncQueryHandler.getBlockedIdSynchronous(
+                filteredNumberAsyncQueryHandler.getBlockedIdSynchronous(
                     viewHolder.number, viewHolder.countryIso);
             details.isBlocked = viewHolder.blockId != null;
             if (isCancelled()) {
               return false;
             }
-            if (mIsSpamEnabled) {
+            if (isSpamEnabled) {
               viewHolder.isSpamFeatureEnabled = true;
               // Only display the call as a spam call if there are incoming calls in the list.
               // Call log cards with only outgoing calls should never be displayed as spam.
               viewHolder.isSpam =
                   details.hasIncomingCalls()
-                      && SpamComponent.get(mActivity)
+                      && SpamComponent.get(activity)
                           .spam()
                           .checkSpamStatusSynchronous(viewHolder.number, viewHolder.countryIso);
               details.isSpam = viewHolder.isSpam;
@@ -887,7 +887,7 @@
         };
 
     viewHolder.asyncTask = loadDataTask;
-    mAsyncTaskExecutor.submit(LOAD_DATA_TASK_IDENTIFIER, loadDataTask);
+    asyncTaskExecutor.submit(LOAD_DATA_TASK_IDENTIFIER, loadDataTask);
   }
 
   @MainThread
@@ -1011,8 +1011,7 @@
     final PhoneAccountHandle accountHandle =
         PhoneAccountUtils.getAccount(details.accountComponentName, details.accountId);
 
-    final boolean isVoicemailNumber =
-        mCallLogCache.isVoicemailNumber(accountHandle, details.number);
+    final boolean isVoicemailNumber = callLogCache.isVoicemailNumber(accountHandle, details.number);
 
     // Note: Binding of the action buttons is done as required in configureActionViews when the
     // user expands the actions ViewStub.
@@ -1024,19 +1023,19 @@
       // Only do remote lookup in first 5 rows.
       int position = views.getAdapterPosition();
       info =
-          mContactInfoCache.getValue(
+          contactInfoCache.getValue(
               details.number + details.postDialDigits,
               details.countryIso,
               details.cachedContactInfo,
               position
-                  < ConfigProviderBindings.get(mActivity)
+                  < ConfigProviderBindings.get(activity)
                       .getLong("number_of_call_to_do_remote_lookup", 5L));
     }
     CharSequence formattedNumber =
         info.formattedNumber == null
             ? null
             : PhoneNumberUtilsCompat.createTtsSpannable(info.formattedNumber);
-    details.updateDisplayNumber(mActivity, formattedNumber, isVoicemailNumber);
+    details.updateDisplayNumber(activity, formattedNumber, isVoicemailNumber);
 
     views.displayNumber = details.displayNumber;
     views.accountHandle = accountHandle;
@@ -1046,7 +1045,7 @@
       details.contactUri = info.lookupUri;
       details.namePrimary = info.name;
       details.nameAlternative = info.nameAlternative;
-      details.nameDisplayOrder = mContactsPreferences.getDisplayOrder();
+      details.nameDisplayOrder = contactsPreferences.getDisplayOrder();
       details.numberType = info.type;
       details.numberLabel = info.label;
       details.photoUri = info.photoUri;
@@ -1067,9 +1066,9 @@
     }
 
     views.info = info;
-    views.numberType = getNumberType(mActivity.getResources(), details);
+    views.numberType = getNumberType(activity.getResources(), details);
 
-    mCallLogListItemHelper.updatePhoneCallDetails(details);
+    callLogListItemHelper.updatePhoneCallDetails(details);
     return true;
   }
 
@@ -1119,11 +1118,11 @@
       views.checkBoxView.setVisibility(View.GONE);
       views.quickContactView.setVisibility(View.VISIBLE);
     }
-    mCallLogListItemHelper.setPhoneCallDetails(views, details);
-    if (mCurrentlyExpandedRowId == views.rowId) {
+    callLogListItemHelper.setPhoneCallDetails(views, details);
+    if (currentlyExpandedRowId == views.rowId) {
       // In case ViewHolders were added/removed, update the expanded position if the rowIds
       // match so that we can restore the correct expanded state on rebind.
-      mCurrentlyExpandedPosition = views.getAdapterPosition();
+      currentlyExpandedPosition = views.getAdapterPosition();
       views.showActions(true);
     } else {
       views.showActions(false);
@@ -1134,12 +1133,12 @@
 
   @Override
   public int getItemCount() {
-    return super.getItemCount() + (mCallLogAlertManager.isEmpty() ? 0 : 1);
+    return super.getItemCount() + (callLogAlertManager.isEmpty() ? 0 : 1);
   }
 
   @Override
   public int getItemViewType(int position) {
-    if (position == ALERT_POSITION && !mCallLogAlertManager.isEmpty()) {
+    if (position == ALERT_POSITION && !callLogAlertManager.isEmpty()) {
       return VIEW_TYPE_ALERT;
     }
     return VIEW_TYPE_CALLLOG;
@@ -1153,7 +1152,7 @@
    */
   @Override
   public Object getItem(int position) {
-    return super.getItem(position - (mCallLogAlertManager.isEmpty() ? 0 : 1));
+    return super.getItem(position - (callLogAlertManager.isEmpty() ? 0 : 1));
   }
 
   @Override
@@ -1168,11 +1167,11 @@
 
   @Override
   public int getGroupSize(int position) {
-    return super.getGroupSize(position - (mCallLogAlertManager.isEmpty() ? 0 : 1));
+    return super.getGroupSize(position - (callLogAlertManager.isEmpty() ? 0 : 1));
   }
 
   protected boolean isCallLogActivity() {
-    return mActivityType == ACTIVITY_TYPE_CALL_LOG;
+    return activityType == ACTIVITY_TYPE_CALL_LOG;
   }
 
   /**
@@ -1183,9 +1182,9 @@
    */
   @Override
   public void onVoicemailDeleted(CallLogListItemViewHolder viewHolder, Uri uri) {
-    mHiddenRowIds.add(viewHolder.rowId);
+    hiddenRowIds.add(viewHolder.rowId);
     // Save the new hidden item uri in case the activity is suspend before the undo has timed out.
-    mHiddenItemUris.add(uri);
+    hiddenItemUris.add(uri);
 
     collapseExpandedCard();
     notifyItemChanged(viewHolder.getAdapterPosition());
@@ -1194,20 +1193,20 @@
   }
 
   private void collapseExpandedCard() {
-    mCurrentlyExpandedRowId = NO_EXPANDED_LIST_ITEM;
-    mCurrentlyExpandedPosition = RecyclerView.NO_POSITION;
+    currentlyExpandedRowId = NO_EXPANDED_LIST_ITEM;
+    currentlyExpandedPosition = RecyclerView.NO_POSITION;
   }
 
   /** When the list is changing all stored position is no longer valid. */
   public void invalidatePositions() {
-    mCurrentlyExpandedPosition = RecyclerView.NO_POSITION;
+    currentlyExpandedPosition = RecyclerView.NO_POSITION;
   }
 
   /** When the user clicks "undo", the hidden item is unhidden. */
   @Override
   public void onVoicemailDeleteUndo(long rowId, int adapterPosition, Uri uri) {
-    mHiddenItemUris.remove(uri);
-    mHiddenRowIds.remove(rowId);
+    hiddenItemUris.remove(uri);
+    hiddenRowIds.remove(rowId);
     notifyItemChanged(adapterPosition);
     // The next item might have to update its day group label
     notifyItemChanged(adapterPosition + 1);
@@ -1216,7 +1215,7 @@
   /** This callback signifies that a database deletion has completed. */
   @Override
   public void onVoicemailDeletedInDatabase(long rowId, Uri uri) {
-    mHiddenItemUris.remove(uri);
+    hiddenItemUris.remove(uri);
   }
 
   /**
@@ -1240,7 +1239,7 @@
   }
 
   private void moveToPreviousNonHiddenRow(Cursor cursor) {
-    while (cursor.moveToPrevious() && mHiddenRowIds.contains(cursor.getLong(CallLogQuery.ID))) {}
+    while (cursor.moveToPrevious() && hiddenRowIds.contains(cursor.getLong(CallLogQuery.ID))) {}
   }
 
   /**
@@ -1252,7 +1251,7 @@
    */
   @MainThread
   private int getCallbackAction(long callId) {
-    Integer result = mCallbackActions.get(callId);
+    Integer result = callbackActions.get(callId);
     if (result != null) {
       return result;
     }
@@ -1268,7 +1267,7 @@
    */
   @MainThread
   private int getDayGroup(long callId) {
-    Integer result = mDayGroups.get(callId);
+    Integer result = dayGroups.get(callId);
     if (result != null) {
       return result;
     }
@@ -1320,13 +1319,13 @@
   @VisibleForTesting
   void disableRequestProcessingForTest() {
     // TODO: Remove this and test the cache directly.
-    mContactInfoCache.disableRequestProcessing();
+    contactInfoCache.disableRequestProcessing();
   }
 
   @VisibleForTesting
   void injectContactInfoForTest(String number, String countryIso, ContactInfo contactInfo) {
     // TODO: Remove this and test the cache directly.
-    mContactInfoCache.injectContactInfoForTest(number, countryIso, contactInfo);
+    contactInfoCache.injectContactInfoForTest(number, countryIso, contactInfo);
   }
 
   /**
@@ -1338,7 +1337,7 @@
   @Override
   @MainThread
   public void setCallbackAction(long rowId, @CallbackAction int callbackAction) {
-    mCallbackActions.put(rowId, callbackAction);
+    callbackActions.put(rowId, callbackAction);
   }
 
   /**
@@ -1350,14 +1349,14 @@
   @Override
   @MainThread
   public void setDayGroup(long rowId, int dayGroup) {
-    mDayGroups.put(rowId, dayGroup);
+    dayGroups.put(rowId, dayGroup);
   }
 
   /** Clears the day group associations on re-bind of the call log. */
   @Override
   @MainThread
   public void clearDayGroups() {
-    mDayGroups.clear();
+    dayGroups.clear();
   }
 
   /**
@@ -1388,22 +1387,22 @@
    */
   private CharSequence getGroupDescription(int group) {
     if (group == CallLogGroupBuilder.DAY_GROUP_TODAY) {
-      return mActivity.getResources().getString(R.string.call_log_header_today);
+      return activity.getResources().getString(R.string.call_log_header_today);
     } else if (group == CallLogGroupBuilder.DAY_GROUP_YESTERDAY) {
-      return mActivity.getResources().getString(R.string.call_log_header_yesterday);
+      return activity.getResources().getString(R.string.call_log_header_yesterday);
     } else {
-      return mActivity.getResources().getString(R.string.call_log_header_other);
+      return activity.getResources().getString(R.string.call_log_header_other);
     }
   }
 
   @NonNull
   private EnrichedCallManager getEnrichedCallManager() {
-    return EnrichedCallComponent.get(mActivity).getEnrichedCallManager();
+    return EnrichedCallComponent.get(activity).getEnrichedCallManager();
   }
 
   @NonNull
   private Duo getDuo() {
-    return DuoComponent.get(mActivity).getDuo();
+    return DuoComponent.get(activity).getDuo();
   }
 
   @Override
diff --git a/java/com/android/dialer/app/calllog/CallLogAsync.java b/java/com/android/dialer/app/calllog/CallLogAsync.java
index f62deca..26435f3 100644
--- a/java/com/android/dialer/app/calllog/CallLogAsync.java
+++ b/java/com/android/dialer/app/calllog/CallLogAsync.java
@@ -65,10 +65,10 @@
   /** AsyncTask to get the last outgoing call from the DB. */
   private class GetLastOutgoingCallTask extends AsyncTask<GetLastOutgoingCallArgs, Void, String> {
 
-    private final OnLastOutgoingCallComplete mCallback;
+    private final OnLastOutgoingCallComplete callback;
 
     public GetLastOutgoingCallTask(OnLastOutgoingCallComplete callback) {
-      mCallback = callback;
+      this.callback = callback;
     }
 
     // Happens on a background thread. We cannot run the callback
@@ -90,7 +90,7 @@
     @Override
     protected void onPostExecute(String number) {
       Assert.isMainThread();
-      mCallback.lastOutgoingCall(number);
+      callback.lastOutgoingCall(number);
     }
   }
 }
diff --git a/java/com/android/dialer/app/calllog/CallLogAsyncTaskUtil.java b/java/com/android/dialer/app/calllog/CallLogAsyncTaskUtil.java
index c0d30f5..08f5585 100644
--- a/java/com/android/dialer/app/calllog/CallLogAsyncTaskUtil.java
+++ b/java/com/android/dialer/app/calllog/CallLogAsyncTaskUtil.java
@@ -38,20 +38,20 @@
 public class CallLogAsyncTaskUtil {
 
   private static final String TAG = "CallLogAsyncTaskUtil";
-  private static AsyncTaskExecutor sAsyncTaskExecutor;
+  private static AsyncTaskExecutor asyncTaskExecutor;
 
   private static void initTaskExecutor() {
-    sAsyncTaskExecutor = AsyncTaskExecutors.createThreadPoolExecutor();
+    asyncTaskExecutor = AsyncTaskExecutors.createThreadPoolExecutor();
   }
 
   public static void markVoicemailAsRead(
       @NonNull final Context context, @NonNull final Uri voicemailUri) {
     LogUtil.enterBlock("CallLogAsyncTaskUtil.markVoicemailAsRead, voicemailUri: " + voicemailUri);
-    if (sAsyncTaskExecutor == null) {
+    if (asyncTaskExecutor == null) {
       initTaskExecutor();
     }
 
-    sAsyncTaskExecutor.submit(
+    asyncTaskExecutor.submit(
         Tasks.MARK_VOICEMAIL_READ,
         new AsyncTask<Void, Void, Void>() {
           @Override
@@ -77,11 +77,11 @@
       @NonNull final Context context,
       final Uri voicemailUri,
       @Nullable final CallLogAsyncTaskListener callLogAsyncTaskListener) {
-    if (sAsyncTaskExecutor == null) {
+    if (asyncTaskExecutor == null) {
       initTaskExecutor();
     }
 
-    sAsyncTaskExecutor.submit(
+    asyncTaskExecutor.submit(
         Tasks.DELETE_VOICEMAIL,
         new AsyncTask<Void, Void, Void>() {
           @Override
@@ -113,11 +113,11 @@
         || !PermissionsUtil.hasCallLogWritePermissions(context)) {
       return;
     }
-    if (sAsyncTaskExecutor == null) {
+    if (asyncTaskExecutor == null) {
       initTaskExecutor();
     }
 
-    sAsyncTaskExecutor.submit(
+    asyncTaskExecutor.submit(
         Tasks.MARK_CALL_READ,
         new AsyncTask<Void, Void, Void>() {
           @Override
diff --git a/java/com/android/dialer/app/calllog/CallLogFragment.java b/java/com/android/dialer/app/calllog/CallLogFragment.java
index 6910f19..4f5035f 100644
--- a/java/com/android/dialer/app/calllog/CallLogFragment.java
+++ b/java/com/android/dialer/app/calllog/CallLogFragment.java
@@ -101,47 +101,47 @@
   private static final int EVENT_UPDATE_DISPLAY = 1;
 
   private static final long MILLIS_IN_MINUTE = 60 * 1000;
-  private final Handler mHandler = new Handler();
+  private final Handler handler = new Handler();
   // See issue 6363009
-  private final ContentObserver mCallLogObserver = new CustomContentObserver();
-  private final ContentObserver mContactsObserver = new CustomContentObserver();
-  private View mMultiSelectUnSelectAllViewContent;
-  private TextView mSelectUnselectAllViewText;
-  private ImageView mSelectUnselectAllIcon;
-  private RecyclerView mRecyclerView;
-  private LinearLayoutManager mLayoutManager;
-  private CallLogAdapter mAdapter;
-  private CallLogQueryHandler mCallLogQueryHandler;
-  private boolean mScrollToTop;
-  private EmptyContentView mEmptyListView;
-  private ContactInfoCache mContactInfoCache;
-  private final OnContactInfoChangedListener mOnContactInfoChangedListener =
+  private final ContentObserver callLogObserver = new CustomContentObserver();
+  private final ContentObserver contactsObserver = new CustomContentObserver();
+  private View multiSelectUnSelectAllViewContent;
+  private TextView selectUnselectAllViewText;
+  private ImageView selectUnselectAllIcon;
+  private RecyclerView recyclerView;
+  private LinearLayoutManager layoutManager;
+  private CallLogAdapter adapter;
+  private CallLogQueryHandler callLogQueryHandler;
+  private boolean scrollToTop;
+  private EmptyContentView emptyListView;
+  private ContactInfoCache contactInfoCache;
+  private final OnContactInfoChangedListener onContactInfoChangedListener =
       new OnContactInfoChangedListener() {
         @Override
         public void onContactInfoChanged() {
-          if (mAdapter != null) {
-            mAdapter.notifyDataSetChanged();
+          if (adapter != null) {
+            adapter.notifyDataSetChanged();
           }
         }
       };
-  private boolean mRefreshDataRequired;
-  private boolean mHasReadCallLogPermission;
+  private boolean refreshDataRequired;
+  private boolean hasReadCallLogPermission;
   // Exactly same variable is in Fragment as a package private.
-  private boolean mMenuVisible = true;
+  private boolean menuVisible = true;
   // Default to all calls.
-  private int mCallTypeFilter = CallLogQueryHandler.CALL_TYPE_ALL;
+  private int callTypeFilter = CallLogQueryHandler.CALL_TYPE_ALL;
   // Log limit - if no limit is specified, then the default in {@link CallLogQueryHandler}
   // will be used.
-  private int mLogLimit = NO_LOG_LIMIT;
+  private int logLimit = NO_LOG_LIMIT;
   // Date limit (in millis since epoch) - when non-zero, only calls which occurred on or after
   // the date filter are included.  If zero, no date-based filtering occurs.
-  private long mDateLimit = NO_DATE_LIMIT;
+  private long dateLimit = NO_DATE_LIMIT;
   /*
    * True if this instance of the CallLogFragment shown in the CallLogActivity.
    */
-  private boolean mIsCallLogActivity = false;
+  private boolean isCallLogActivity = false;
   private boolean selectAllMode;
-  private final Handler mDisplayUpdateHandler =
+  private final Handler displayUpdateHandler =
       new Handler() {
         @Override
         public void handleMessage(Message msg) {
@@ -155,8 +155,8 @@
           }
         }
       };
-  protected CallLogModalAlertManager mModalAlertManager;
-  private ViewGroup mModalAlertView;
+  protected CallLogModalAlertManager modalAlertManager;
+  private ViewGroup modalAlertView;
 
   public CallLogFragment() {
     this(CallLogQueryHandler.CALL_TYPE_ALL, NO_LOG_LIMIT);
@@ -168,7 +168,7 @@
 
   public CallLogFragment(int filterType, boolean isCallLogActivity) {
     this(filterType, NO_LOG_LIMIT);
-    mIsCallLogActivity = isCallLogActivity;
+    this.isCallLogActivity = isCallLogActivity;
   }
 
   public CallLogFragment(int filterType, int logLimit) {
@@ -195,38 +195,38 @@
    * @param dateLimit limits results to calls occurring on or after the specified date.
    */
   public CallLogFragment(int filterType, int logLimit, long dateLimit) {
-    mCallTypeFilter = filterType;
-    mLogLimit = logLimit;
-    mDateLimit = dateLimit;
+    callTypeFilter = filterType;
+    this.logLimit = logLimit;
+    this.dateLimit = dateLimit;
   }
 
   @Override
   public void onCreate(Bundle state) {
     LogUtil.enterBlock("CallLogFragment.onCreate");
     super.onCreate(state);
-    mRefreshDataRequired = true;
+    refreshDataRequired = true;
     if (state != null) {
-      mCallTypeFilter = state.getInt(KEY_FILTER_TYPE, mCallTypeFilter);
-      mLogLimit = state.getInt(KEY_LOG_LIMIT, mLogLimit);
-      mDateLimit = state.getLong(KEY_DATE_LIMIT, mDateLimit);
-      mIsCallLogActivity = state.getBoolean(KEY_IS_CALL_LOG_ACTIVITY, mIsCallLogActivity);
-      mHasReadCallLogPermission = state.getBoolean(KEY_HAS_READ_CALL_LOG_PERMISSION, false);
-      mRefreshDataRequired = state.getBoolean(KEY_REFRESH_DATA_REQUIRED, mRefreshDataRequired);
+      callTypeFilter = state.getInt(KEY_FILTER_TYPE, callTypeFilter);
+      logLimit = state.getInt(KEY_LOG_LIMIT, logLimit);
+      dateLimit = state.getLong(KEY_DATE_LIMIT, dateLimit);
+      isCallLogActivity = state.getBoolean(KEY_IS_CALL_LOG_ACTIVITY, isCallLogActivity);
+      hasReadCallLogPermission = state.getBoolean(KEY_HAS_READ_CALL_LOG_PERMISSION, false);
+      refreshDataRequired = state.getBoolean(KEY_REFRESH_DATA_REQUIRED, refreshDataRequired);
       selectAllMode = state.getBoolean(KEY_SELECT_ALL_MODE, false);
     }
 
     final Activity activity = getActivity();
     final ContentResolver resolver = activity.getContentResolver();
-    mCallLogQueryHandler = new CallLogQueryHandler(activity, resolver, this, mLogLimit);
+    callLogQueryHandler = new CallLogQueryHandler(activity, resolver, this, logLimit);
 
     if (PermissionsUtil.hasCallLogReadPermissions(getContext())) {
-      resolver.registerContentObserver(CallLog.CONTENT_URI, true, mCallLogObserver);
+      resolver.registerContentObserver(CallLog.CONTENT_URI, true, callLogObserver);
     } else {
       LogUtil.w("CallLogFragment.onCreate", "call log permission not available");
     }
     if (PermissionsUtil.hasContactsReadPermissions(getContext())) {
       resolver.registerContentObserver(
-          ContactsContract.Contacts.CONTENT_URI, true, mContactsObserver);
+          ContactsContract.Contacts.CONTENT_URI, true, contactsObserver);
     } else {
       LogUtil.w("CallLogFragment.onCreate", "contacts permission not available.");
     }
@@ -240,49 +240,49 @@
       // Return false; we did not take ownership of the cursor
       return false;
     }
-    mAdapter.invalidatePositions();
-    mAdapter.setLoading(false);
-    mAdapter.changeCursor(cursor);
+    adapter.invalidatePositions();
+    adapter.setLoading(false);
+    adapter.changeCursor(cursor);
     // This will update the state of the "Clear call log" menu item.
     getActivity().invalidateOptionsMenu();
 
     if (cursor != null && cursor.getCount() > 0) {
-      mRecyclerView.setPaddingRelative(
-          mRecyclerView.getPaddingStart(),
+      recyclerView.setPaddingRelative(
+          recyclerView.getPaddingStart(),
           0,
-          mRecyclerView.getPaddingEnd(),
+          recyclerView.getPaddingEnd(),
           getResources().getDimensionPixelSize(R.dimen.floating_action_button_list_bottom_padding));
-      mEmptyListView.setVisibility(View.GONE);
+      emptyListView.setVisibility(View.GONE);
     } else {
-      mRecyclerView.setPaddingRelative(
-          mRecyclerView.getPaddingStart(), 0, mRecyclerView.getPaddingEnd(), 0);
-      mEmptyListView.setVisibility(View.VISIBLE);
+      recyclerView.setPaddingRelative(
+          recyclerView.getPaddingStart(), 0, recyclerView.getPaddingEnd(), 0);
+      emptyListView.setVisibility(View.VISIBLE);
     }
-    if (mScrollToTop) {
+    if (scrollToTop) {
       // The smooth-scroll animation happens over a fixed time period.
       // As a result, if it scrolls through a large portion of the list,
       // each frame will jump so far from the previous one that the user
       // will not experience the illusion of downward motion.  Instead,
       // if we're not already near the top of the list, we instantly jump
       // near the top, and animate from there.
-      if (mLayoutManager.findFirstVisibleItemPosition() > 5) {
+      if (layoutManager.findFirstVisibleItemPosition() > 5) {
         // TODO: Jump to near the top, then begin smooth scroll.
-        mRecyclerView.smoothScrollToPosition(0);
+        recyclerView.smoothScrollToPosition(0);
       }
       // Workaround for framework issue: the smooth-scroll doesn't
       // occur if setSelection() is called immediately before.
-      mHandler.post(
+      handler.post(
           new Runnable() {
             @Override
             public void run() {
               if (getActivity() == null || getActivity().isFinishing()) {
                 return;
               }
-              mRecyclerView.smoothScrollToPosition(0);
+              recyclerView.smoothScrollToPosition(0);
             }
           });
 
-      mScrollToTop = false;
+      scrollToTop = false;
     }
     return true;
   }
@@ -304,57 +304,57 @@
   }
 
   protected void setupView(View view) {
-    mRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
-    mRecyclerView.setHasFixedSize(true);
-    mLayoutManager = new LinearLayoutManager(getActivity());
-    mRecyclerView.setLayoutManager(mLayoutManager);
-    PerformanceReport.logOnScrollStateChange(mRecyclerView);
-    mEmptyListView = (EmptyContentView) view.findViewById(R.id.empty_list_view);
-    mEmptyListView.setImage(R.drawable.empty_call_log);
-    mEmptyListView.setActionClickedListener(this);
-    mModalAlertView = (ViewGroup) view.findViewById(R.id.modal_message_container);
-    mModalAlertManager =
-        new CallLogModalAlertManager(LayoutInflater.from(getContext()), mModalAlertView, this);
-    mMultiSelectUnSelectAllViewContent =
+    recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
+    recyclerView.setHasFixedSize(true);
+    layoutManager = new LinearLayoutManager(getActivity());
+    recyclerView.setLayoutManager(layoutManager);
+    PerformanceReport.logOnScrollStateChange(recyclerView);
+    emptyListView = (EmptyContentView) view.findViewById(R.id.empty_list_view);
+    emptyListView.setImage(R.drawable.empty_call_log);
+    emptyListView.setActionClickedListener(this);
+    modalAlertView = (ViewGroup) view.findViewById(R.id.modal_message_container);
+    modalAlertManager =
+        new CallLogModalAlertManager(LayoutInflater.from(getContext()), modalAlertView, this);
+    multiSelectUnSelectAllViewContent =
         view.findViewById(R.id.multi_select_select_all_view_content);
-    mSelectUnselectAllViewText = (TextView) view.findViewById(R.id.select_all_view_text);
-    mSelectUnselectAllIcon = (ImageView) view.findViewById(R.id.select_all_view_icon);
-    mMultiSelectUnSelectAllViewContent.setOnClickListener(null);
-    mSelectUnselectAllIcon.setOnClickListener(this);
-    mSelectUnselectAllViewText.setOnClickListener(this);
+    selectUnselectAllViewText = (TextView) view.findViewById(R.id.select_all_view_text);
+    selectUnselectAllIcon = (ImageView) view.findViewById(R.id.select_all_view_icon);
+    multiSelectUnSelectAllViewContent.setOnClickListener(null);
+    selectUnselectAllIcon.setOnClickListener(this);
+    selectUnselectAllViewText.setOnClickListener(this);
   }
 
   protected void setupData() {
     int activityType =
-        mIsCallLogActivity
+        isCallLogActivity
             ? CallLogAdapter.ACTIVITY_TYPE_CALL_LOG
             : CallLogAdapter.ACTIVITY_TYPE_DIALTACTS;
     String currentCountryIso = GeoUtil.getCurrentCountryIso(getActivity());
 
-    mContactInfoCache =
+    contactInfoCache =
         new ContactInfoCache(
             ExpirableCacheHeadlessFragment.attach((AppCompatActivity) getActivity())
                 .getRetainedCache(),
             new ContactInfoHelper(getActivity(), currentCountryIso),
-            mOnContactInfoChangedListener);
-    mAdapter =
+            onContactInfoChangedListener);
+    adapter =
         Bindings.getLegacy(getActivity())
             .newCallLogAdapter(
                 getActivity(),
-                mRecyclerView,
+                recyclerView,
                 this,
                 this,
                 activityType == CallLogAdapter.ACTIVITY_TYPE_DIALTACTS
                     ? (CallLogAdapter.OnActionModeStateChangedListener) getActivity()
                     : null,
                 new CallLogCache(getActivity()),
-                mContactInfoCache,
+                contactInfoCache,
                 getVoicemailPlaybackPresenter(),
                 new FilteredNumberAsyncQueryHandler(getActivity()),
                 activityType);
-    mRecyclerView.setAdapter(mAdapter);
-    if (mAdapter.getOnScrollListener() != null) {
-      mRecyclerView.addOnScrollListener(mAdapter.getOnScrollListener());
+    recyclerView.setAdapter(adapter);
+    if (adapter.getOnScrollListener() != null) {
+      recyclerView.addOnScrollListener(adapter.getOnScrollListener());
     }
     fetchCalls();
   }
@@ -370,7 +370,7 @@
     super.onActivityCreated(savedInstanceState);
     setupData();
     updateSelectAllState(savedInstanceState);
-    mAdapter.onRestoreInstanceState(savedInstanceState);
+    adapter.onRestoreInstanceState(savedInstanceState);
   }
 
   private void updateSelectAllState(Bundle savedInstanceState) {
@@ -384,7 +384,7 @@
   @Override
   public void onViewCreated(View view, Bundle savedInstanceState) {
     super.onViewCreated(view, savedInstanceState);
-    updateEmptyMessage(mCallTypeFilter);
+    updateEmptyMessage(callTypeFilter);
   }
 
   @Override
@@ -393,23 +393,23 @@
     super.onResume();
     final boolean hasReadCallLogPermission =
         PermissionsUtil.hasPermission(getActivity(), READ_CALL_LOG);
-    if (!mHasReadCallLogPermission && hasReadCallLogPermission) {
+    if (!this.hasReadCallLogPermission && hasReadCallLogPermission) {
       // We didn't have the permission before, and now we do. Force a refresh of the call log.
       // Note that this code path always happens on a fresh start, but mRefreshDataRequired
       // is already true in that case anyway.
-      mRefreshDataRequired = true;
-      updateEmptyMessage(mCallTypeFilter);
+      refreshDataRequired = true;
+      updateEmptyMessage(callTypeFilter);
     }
 
-    mHasReadCallLogPermission = hasReadCallLogPermission;
+    this.hasReadCallLogPermission = hasReadCallLogPermission;
 
     /*
      * Always clear the filtered numbers cache since users could have blocked/unblocked numbers
      * from the settings page
      */
-    mAdapter.clearFilteredNumbersCache();
+    adapter.clearFilteredNumbersCache();
     refreshData();
-    mAdapter.onResume();
+    adapter.onResume();
 
     rescheduleDisplayUpdate();
     // onResume() may also be called as a "side" page on the ViewPager, which is not visible.
@@ -425,7 +425,7 @@
       onNotVisible();
     }
     cancelDisplayUpdate();
-    mAdapter.onPause();
+    adapter.onPause();
     super.onPause();
   }
 
@@ -437,48 +437,48 @@
     if (CequintCallerIdManager.isCequintCallerIdEnabled(getContext())) {
       cequintCallerIdManager = CequintCallerIdManager.createInstanceForCallLog();
     }
-    mContactInfoCache.setCequintCallerIdManager(cequintCallerIdManager);
+    contactInfoCache.setCequintCallerIdManager(cequintCallerIdManager);
   }
 
   @Override
   public void onStop() {
     LogUtil.enterBlock("CallLogFragment.onStop");
     super.onStop();
-    mAdapter.onStop();
-    mContactInfoCache.stop();
+    adapter.onStop();
+    contactInfoCache.stop();
   }
 
   @Override
   public void onDestroy() {
     LogUtil.enterBlock("CallLogFragment.onDestroy");
-    if (mAdapter != null) {
-      mAdapter.changeCursor(null);
+    if (adapter != null) {
+      adapter.changeCursor(null);
     }
 
-    getActivity().getContentResolver().unregisterContentObserver(mCallLogObserver);
-    getActivity().getContentResolver().unregisterContentObserver(mContactsObserver);
+    getActivity().getContentResolver().unregisterContentObserver(callLogObserver);
+    getActivity().getContentResolver().unregisterContentObserver(contactsObserver);
     super.onDestroy();
   }
 
   @Override
   public void onSaveInstanceState(Bundle outState) {
     super.onSaveInstanceState(outState);
-    outState.putInt(KEY_FILTER_TYPE, mCallTypeFilter);
-    outState.putInt(KEY_LOG_LIMIT, mLogLimit);
-    outState.putLong(KEY_DATE_LIMIT, mDateLimit);
-    outState.putBoolean(KEY_IS_CALL_LOG_ACTIVITY, mIsCallLogActivity);
-    outState.putBoolean(KEY_HAS_READ_CALL_LOG_PERMISSION, mHasReadCallLogPermission);
-    outState.putBoolean(KEY_REFRESH_DATA_REQUIRED, mRefreshDataRequired);
+    outState.putInt(KEY_FILTER_TYPE, callTypeFilter);
+    outState.putInt(KEY_LOG_LIMIT, logLimit);
+    outState.putLong(KEY_DATE_LIMIT, dateLimit);
+    outState.putBoolean(KEY_IS_CALL_LOG_ACTIVITY, isCallLogActivity);
+    outState.putBoolean(KEY_HAS_READ_CALL_LOG_PERMISSION, hasReadCallLogPermission);
+    outState.putBoolean(KEY_REFRESH_DATA_REQUIRED, refreshDataRequired);
     outState.putBoolean(KEY_SELECT_ALL_MODE, selectAllMode);
-    if (mAdapter != null) {
-      mAdapter.onSaveInstanceState(outState);
+    if (adapter != null) {
+      adapter.onSaveInstanceState(outState);
     }
   }
 
   @Override
   public void fetchCalls() {
-    mCallLogQueryHandler.fetchCalls(mCallTypeFilter, mDateLimit);
-    if (!mIsCallLogActivity) {
+    callLogQueryHandler.fetchCalls(callTypeFilter, dateLimit);
+    if (!isCallLogActivity) {
       ((ListsFragment) getParentFragment()).updateTabUnreadCounts();
     }
   }
@@ -490,8 +490,8 @@
     }
 
     if (!PermissionsUtil.hasPermission(context, READ_CALL_LOG)) {
-      mEmptyListView.setDescription(R.string.permission_no_calllog);
-      mEmptyListView.setActionLabel(R.string.permission_single_turn_on);
+      emptyListView.setDescription(R.string.permission_no_calllog);
+      emptyListView.setActionLabel(R.string.permission_single_turn_on);
       return;
     }
 
@@ -510,25 +510,25 @@
         throw new IllegalArgumentException(
             "Unexpected filter type in CallLogFragment: " + filterType);
     }
-    mEmptyListView.setDescription(messageId);
-    if (mIsCallLogActivity) {
-      mEmptyListView.setActionLabel(EmptyContentView.NO_LABEL);
+    emptyListView.setDescription(messageId);
+    if (isCallLogActivity) {
+      emptyListView.setActionLabel(EmptyContentView.NO_LABEL);
     } else if (filterType == CallLogQueryHandler.CALL_TYPE_ALL) {
-      mEmptyListView.setActionLabel(R.string.call_log_all_empty_action);
+      emptyListView.setActionLabel(R.string.call_log_all_empty_action);
     } else {
-      mEmptyListView.setActionLabel(EmptyContentView.NO_LABEL);
+      emptyListView.setActionLabel(EmptyContentView.NO_LABEL);
     }
   }
 
   public CallLogAdapter getAdapter() {
-    return mAdapter;
+    return adapter;
   }
 
   @Override
   public void setMenuVisibility(boolean menuVisible) {
     super.setMenuVisibility(menuVisible);
-    if (mMenuVisible != menuVisible) {
-      mMenuVisible = menuVisible;
+    if (this.menuVisible != menuVisible) {
+      this.menuVisible = menuVisible;
       if (menuVisible && isResumed()) {
         refreshData();
       }
@@ -538,19 +538,19 @@
   /** Requests updates to the data to be shown. */
   private void refreshData() {
     // Prevent unnecessary refresh.
-    if (mRefreshDataRequired) {
+    if (refreshDataRequired) {
       // Mark all entries in the contact info cache as out of date, so they will be looked up
       // again once being shown.
-      mContactInfoCache.invalidate();
-      mAdapter.setLoading(true);
+      contactInfoCache.invalidate();
+      adapter.setLoading(true);
 
       fetchCalls();
-      mCallLogQueryHandler.fetchVoicemailStatus();
-      mCallLogQueryHandler.fetchMissedCallsUnreadCount();
-      mRefreshDataRequired = false;
+      callLogQueryHandler.fetchVoicemailStatus();
+      callLogQueryHandler.fetchMissedCallsUnreadCount();
+      refreshDataRequired = false;
     } else {
       // Refresh the display of the existing data to update the timestamp text descriptions.
-      mAdapter.notifyDataSetChanged();
+      adapter.notifyDataSetChanged();
     }
   }
 
@@ -569,7 +569,7 @@
           "CallLogFragment.onEmptyViewActionButtonClicked",
           "Requesting permissions: " + Arrays.toString(deniedPermissions));
       FragmentCompat.requestPermissions(this, deniedPermissions, PHONE_PERMISSIONS_REQUEST_CODE);
-    } else if (!mIsCallLogActivity) {
+    } else if (!isCallLogActivity) {
       LogUtil.i("CallLogFragment.onEmptyViewActionButtonClicked", "showing dialpad");
       // Show dialpad if we are not in the call log activity.
       ((HostInterface) activity).showDialpad();
@@ -582,32 +582,32 @@
     if (requestCode == PHONE_PERMISSIONS_REQUEST_CODE) {
       if (grantResults.length >= 1 && PackageManager.PERMISSION_GRANTED == grantResults[0]) {
         // Force a refresh of the data since we were missing the permission before this.
-        mRefreshDataRequired = true;
+        refreshDataRequired = true;
       }
     }
   }
 
   /** Schedules an update to the relative call times (X mins ago). */
   private void rescheduleDisplayUpdate() {
-    if (!mDisplayUpdateHandler.hasMessages(EVENT_UPDATE_DISPLAY)) {
+    if (!displayUpdateHandler.hasMessages(EVENT_UPDATE_DISPLAY)) {
       long time = System.currentTimeMillis();
       // This value allows us to change the display relatively close to when the time changes
       // from one minute to the next.
       long millisUtilNextMinute = MILLIS_IN_MINUTE - (time % MILLIS_IN_MINUTE);
-      mDisplayUpdateHandler.sendEmptyMessageDelayed(EVENT_UPDATE_DISPLAY, millisUtilNextMinute);
+      displayUpdateHandler.sendEmptyMessageDelayed(EVENT_UPDATE_DISPLAY, millisUtilNextMinute);
     }
   }
 
   /** Cancels any pending update requests to update the relative call times (X mins ago). */
   private void cancelDisplayUpdate() {
-    mDisplayUpdateHandler.removeMessages(EVENT_UPDATE_DISPLAY);
+    displayUpdateHandler.removeMessages(EVENT_UPDATE_DISPLAY);
   }
 
   /** Mark all missed calls as read if Keyguard not locked and possible. */
   void markMissedCallsAsReadAndRemoveNotifications() {
-    if (mCallLogQueryHandler != null
+    if (callLogQueryHandler != null
         && !getContext().getSystemService(KeyguardManager.class).isKeyguardLocked()) {
-      mCallLogQueryHandler.markMissedCallsAsRead();
+      callLogQueryHandler.markMissedCallsAsRead();
       CallLogNotificationsService.cancelAllMissedCalls(getContext());
     }
   }
@@ -621,7 +621,7 @@
   }
 
   public boolean isModalAlertVisible() {
-    return mModalAlertManager != null && !mModalAlertManager.isEmpty();
+    return modalAlertManager != null && !modalAlertManager.isEmpty();
   }
 
   @CallSuper
@@ -640,14 +640,14 @@
     getAdapter().notifyDataSetChanged();
     HostInterface hostInterface = (HostInterface) getActivity();
     if (show) {
-      mRecyclerView.setVisibility(View.GONE);
-      mModalAlertView.setVisibility(View.VISIBLE);
+      recyclerView.setVisibility(View.GONE);
+      modalAlertView.setVisibility(View.VISIBLE);
       if (hostInterface != null && getUserVisibleHint()) {
         hostInterface.enableFloatingButton(false);
       }
     } else {
-      mRecyclerView.setVisibility(View.VISIBLE);
-      mModalAlertView.setVisibility(View.GONE);
+      recyclerView.setVisibility(View.VISIBLE);
+      modalAlertView.setVisibility(View.GONE);
       if (hostInterface != null && getUserVisibleHint()) {
         hostInterface.enableFloatingButton(true);
       }
@@ -656,16 +656,16 @@
 
   @Override
   public void showMultiSelectRemoveView(boolean show) {
-    mMultiSelectUnSelectAllViewContent.setVisibility(show ? View.VISIBLE : View.GONE);
-    mMultiSelectUnSelectAllViewContent.setAlpha(show ? 0 : 1);
-    mMultiSelectUnSelectAllViewContent.animate().alpha(show ? 1 : 0).start();
+    multiSelectUnSelectAllViewContent.setVisibility(show ? View.VISIBLE : View.GONE);
+    multiSelectUnSelectAllViewContent.setAlpha(show ? 0 : 1);
+    multiSelectUnSelectAllViewContent.animate().alpha(show ? 1 : 0).start();
     ((ListsFragment) getParentFragment()).showMultiSelectRemoveView(show);
   }
 
   @Override
   public void setSelectAllModeToFalse() {
     selectAllMode = false;
-    mSelectUnselectAllIcon.setImageDrawable(
+    selectUnselectAllIcon.setImageDrawable(
         getContext().getDrawable(R.drawable.ic_empty_check_mark_white_24dp));
   }
 
@@ -689,11 +689,11 @@
 
   private void updateSelectAllIcon() {
     if (selectAllMode) {
-      mSelectUnselectAllIcon.setImageDrawable(
+      selectUnselectAllIcon.setImageDrawable(
           getContext().getDrawable(R.drawable.ic_check_mark_blue_24dp));
       getAdapter().onAllSelected();
     } else {
-      mSelectUnselectAllIcon.setImageDrawable(
+      selectUnselectAllIcon.setImageDrawable(
           getContext().getDrawable(R.drawable.ic_empty_check_mark_white_24dp));
       getAdapter().onAllDeselected();
     }
@@ -709,12 +709,12 @@
   protected class CustomContentObserver extends ContentObserver {
 
     public CustomContentObserver() {
-      super(mHandler);
+      super(handler);
     }
 
     @Override
     public void onChange(boolean selfChange) {
-      mRefreshDataRequired = true;
+      refreshDataRequired = true;
     }
   }
 }
diff --git a/java/com/android/dialer/app/calllog/CallLogGroupBuilder.java b/java/com/android/dialer/app/calllog/CallLogGroupBuilder.java
index a48de0f..4c0c634 100644
--- a/java/com/android/dialer/app/calllog/CallLogGroupBuilder.java
+++ b/java/com/android/dialer/app/calllog/CallLogGroupBuilder.java
@@ -57,15 +57,15 @@
   /** Instance of the time object used for time calculations. */
   private static final Time TIME = new Time();
   /** The object on which the groups are created. */
-  private final GroupCreator mGroupCreator;
+  private final GroupCreator groupCreator;
 
   public CallLogGroupBuilder(GroupCreator groupCreator) {
-    mGroupCreator = groupCreator;
+    this.groupCreator = groupCreator;
   }
 
   /**
    * Finds all groups of adjacent entries in the call log which should be grouped together and calls
-   * {@link GroupCreator#addGroup(int, int)} on {@link #mGroupCreator} for each of them.
+   * {@link GroupCreator#addGroup(int, int)} on {@link #groupCreator} for each of them.
    *
    * <p>For entries that are not grouped with others, we do not need to create a group of size one.
    *
@@ -80,7 +80,7 @@
     }
 
     // Clear any previous day grouping information.
-    mGroupCreator.clearDayGroups();
+    groupCreator.clearDayGroups();
 
     // Get current system time, used for calculating which day group calls belong to.
     long currentTime = System.currentTimeMillis();
@@ -90,7 +90,7 @@
     final long firstDate = cursor.getLong(CallLogQuery.DATE);
     final long firstRowId = cursor.getLong(CallLogQuery.ID);
     int groupDayGroup = getDayGroup(firstDate, currentTime);
-    mGroupCreator.setDayGroup(firstRowId, groupDayGroup);
+    groupCreator.setDayGroup(firstRowId, groupDayGroup);
 
     // Determine the callback action for the first call in the cursor.
     String groupNumber = cursor.getString(CallLogQuery.NUMBER);
@@ -99,7 +99,7 @@
     int groupCallbackAction =
         CallbackActionHelper.getCallbackAction(
             groupNumber, groupFeatures, groupAccountComponentName);
-    mGroupCreator.setCallbackAction(firstRowId, groupCallbackAction);
+    groupCreator.setCallbackAction(firstRowId, groupCallbackAction);
 
     // Instantiate other group values to those of the first call in the cursor.
     String groupAccountId = cursor.getString(CallLogQuery.ACCOUNT_ID);
@@ -164,7 +164,7 @@
 
         // Create a group for the previous group of calls, which does not include the
         // current call.
-        mGroupCreator.addGroup(cursor.getPosition() - groupSize, groupSize);
+        groupCreator.addGroup(cursor.getPosition() - groupSize, groupSize);
 
         // Start a new group; it will include at least the current call.
         groupSize = 1;
@@ -181,12 +181,12 @@
 
       // Save the callback action and the day group associated with the current call.
       final long currentCallId = cursor.getLong(CallLogQuery.ID);
-      mGroupCreator.setCallbackAction(currentCallId, groupCallbackAction);
-      mGroupCreator.setDayGroup(currentCallId, groupDayGroup);
+      groupCreator.setCallbackAction(currentCallId, groupCallbackAction);
+      groupCreator.setDayGroup(currentCallId, groupDayGroup);
     }
 
     // Create a group for the last set of calls.
-    mGroupCreator.addGroup(count - groupSize, groupSize);
+    groupCreator.addGroup(count - groupSize, groupSize);
   }
 
   /**
diff --git a/java/com/android/dialer/app/calllog/CallLogListItemHelper.java b/java/com/android/dialer/app/calllog/CallLogListItemHelper.java
index ac43b9e..13ee9a4 100644
--- a/java/com/android/dialer/app/calllog/CallLogListItemHelper.java
+++ b/java/com/android/dialer/app/calllog/CallLogListItemHelper.java
@@ -32,11 +32,11 @@
 /* package */ class CallLogListItemHelper {
 
   /** Helper for populating the details of a phone call. */
-  private final PhoneCallDetailsHelper mPhoneCallDetailsHelper;
+  private final PhoneCallDetailsHelper phoneCallDetailsHelper;
   /** Resources to look up strings. */
-  private final Resources mResources;
+  private final Resources resources;
 
-  private final CallLogCache mCallLogCache;
+  private final CallLogCache callLogCache;
 
   /**
    * Creates a new helper instance.
@@ -49,9 +49,9 @@
       PhoneCallDetailsHelper phoneCallDetailsHelper,
       Resources resources,
       CallLogCache callLogCache) {
-    mPhoneCallDetailsHelper = phoneCallDetailsHelper;
-    mResources = resources;
-    mCallLogCache = callLogCache;
+    this.phoneCallDetailsHelper = phoneCallDetailsHelper;
+    this.resources = resources;
+    this.callLogCache = callLogCache;
   }
 
   /**
@@ -63,7 +63,7 @@
   @WorkerThread
   public void updatePhoneCallDetails(PhoneCallDetails details) {
     Assert.isWorkerThread();
-    details.callLocationAndDate = mPhoneCallDetailsHelper.getCallLocationAndDate(details);
+    details.callLocationAndDate = phoneCallDetailsHelper.getCallLocationAndDate(details);
     details.callDescription = getCallDescription(details);
   }
 
@@ -74,7 +74,7 @@
    * @param details the details of a phone call needed to fill in the data
    */
   public void setPhoneCallDetails(CallLogListItemViewHolder views, PhoneCallDetails details) {
-    mPhoneCallDetailsHelper.setPhoneCallDetails(views.phoneCallDetailsViews, details);
+    phoneCallDetailsHelper.setPhoneCallDetails(views.phoneCallDetailsViews, details);
 
     // Set the accessibility text for the contact badge
     views.quickContactView.setContentDescription(getContactBadgeDescription(details));
@@ -88,7 +88,7 @@
 
     // The call type or Location associated with the call. Use when setting text for a
     // voicemail log's call button
-    views.callTypeOrLocation = mPhoneCallDetailsHelper.getCallTypeOrLocation(details);
+    views.callTypeOrLocation = phoneCallDetailsHelper.getCallTypeOrLocation(details);
 
     // Cache country iso. Used for number filtering.
     views.countryIso = details.countryIso;
@@ -114,20 +114,20 @@
 
     views.videoCallButtonView.setContentDescription(
         TextUtils.expandTemplate(
-            mResources.getString(R.string.description_video_call_action), nameOrNumber));
+            resources.getString(R.string.description_video_call_action), nameOrNumber));
 
     views.createNewContactButtonView.setContentDescription(
         TextUtils.expandTemplate(
-            mResources.getString(R.string.description_create_new_contact_action), nameOrNumber));
+            resources.getString(R.string.description_create_new_contact_action), nameOrNumber));
 
     views.addToExistingContactButtonView.setContentDescription(
         TextUtils.expandTemplate(
-            mResources.getString(R.string.description_add_to_existing_contact_action),
+            resources.getString(R.string.description_add_to_existing_contact_action),
             nameOrNumber));
 
     views.detailsButtonView.setContentDescription(
         TextUtils.expandTemplate(
-            mResources.getString(R.string.description_details_action), nameOrNumber));
+            resources.getString(R.string.description_details_action), nameOrNumber));
   }
 
   /**
@@ -138,10 +138,10 @@
    */
   private CharSequence getContactBadgeDescription(PhoneCallDetails details) {
     if (details.isSpam) {
-      return mResources.getString(
+      return resources.getString(
           R.string.description_spam_contact_details, getNameOrNumber(details));
     }
-    return mResources.getString(R.string.description_contact_details, getNameOrNumber(details));
+    return resources.getString(R.string.description_contact_details, getNameOrNumber(details));
   }
 
   /**
@@ -178,32 +178,32 @@
     final CharSequence nameOrNumber = getNameOrNumber(details);
 
     // Get the call type or location of the caller; null if not applicable
-    final CharSequence typeOrLocation = mPhoneCallDetailsHelper.getCallTypeOrLocation(details);
+    final CharSequence typeOrLocation = phoneCallDetailsHelper.getCallTypeOrLocation(details);
 
     // Get the time/date of the call
-    final CharSequence timeOfCall = mPhoneCallDetailsHelper.getCallDate(details);
+    final CharSequence timeOfCall = phoneCallDetailsHelper.getCallDate(details);
 
     SpannableStringBuilder callDescription = new SpannableStringBuilder();
 
     // Add number of calls if more than one.
     if (details.callTypes.length > 1) {
       callDescription.append(
-          mResources.getString(R.string.description_num_calls, details.callTypes.length));
+          resources.getString(R.string.description_num_calls, details.callTypes.length));
     }
 
     // If call had video capabilities, add the "Video Call" string.
     if ((details.features & Calls.FEATURES_VIDEO) == Calls.FEATURES_VIDEO) {
-      callDescription.append(mResources.getString(R.string.description_video_call));
+      callDescription.append(resources.getString(R.string.description_video_call));
     }
 
-    String accountLabel = mCallLogCache.getAccountLabel(details.accountHandle);
+    String accountLabel = callLogCache.getAccountLabel(details.accountHandle);
     CharSequence onAccountLabel =
-        PhoneCallDetails.createAccountLabelDescription(mResources, details.viaNumber, accountLabel);
+        PhoneCallDetails.createAccountLabelDescription(resources, details.viaNumber, accountLabel);
 
     int stringID = getCallDescriptionStringID(details.callTypes, details.isRead);
     callDescription.append(
         TextUtils.expandTemplate(
-            mResources.getString(stringID),
+            resources.getString(stringID),
             nameOrNumber,
             typeOrLocation == null ? "" : typeOrLocation,
             timeOfCall,
diff --git a/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java b/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
index 15c4b58..f8d3a4c 100644
--- a/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
+++ b/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
@@ -132,13 +132,13 @@
   /** The actionable view which places a call to the number corresponding to the call log row. */
   public final ImageView primaryActionButtonView;
 
-  private final Context mContext;
-  @Nullable private final PhoneAccountHandle mDefaultPhoneAccountHandle;
-  private final CallLogCache mCallLogCache;
-  private final CallLogListItemHelper mCallLogListItemHelper;
-  private final CachedNumberLookupService mCachedNumberLookupService;
-  private final VoicemailPlaybackPresenter mVoicemailPlaybackPresenter;
-  private final OnClickListener mBlockReportListener;
+  private final Context context;
+  @Nullable private final PhoneAccountHandle defaultPhoneAccountHandle;
+  private final CallLogCache callLogCache;
+  private final CallLogListItemHelper callLogListItemHelper;
+  private final CachedNumberLookupService cachedNumberLookupService;
+  private final VoicemailPlaybackPresenter voicemailPlaybackPresenter;
+  private final OnClickListener blockReportListener;
   @HostUi private final int hostUi;
   /** Whether the data fields are populated by the worker thread, ready to be shown. */
   public boolean isLoaded;
@@ -233,10 +233,10 @@
 
   public boolean isCallComposerCapable;
 
-  private View.OnClickListener mExpandCollapseListener;
+  private View.OnClickListener expandCollapseListener;
   private final OnActionModeStateChangedListener onActionModeStateChangedListener;
   private final View.OnLongClickListener longPressListener;
-  private boolean mVoicemailPrimaryActionButtonClicked;
+  private boolean voicemailPrimaryActionButtonClicked;
 
   public int callbackAction;
   public int dayGroupHeaderVisibility;
@@ -264,18 +264,18 @@
       ImageView primaryActionButtonView) {
     super(rootView);
 
-    mContext = context;
-    mExpandCollapseListener = expandCollapseListener;
+    this.context = context;
+    this.expandCollapseListener = expandCollapseListener;
     onActionModeStateChangedListener = actionModeStateChangedListener;
     longPressListener = longClickListener;
-    mCallLogCache = callLogCache;
-    mCallLogListItemHelper = callLogListItemHelper;
-    mVoicemailPlaybackPresenter = voicemailPlaybackPresenter;
-    mBlockReportListener = blockReportListener;
-    mCachedNumberLookupService = PhoneNumberCache.get(mContext).getCachedNumberLookupService();
+    this.callLogCache = callLogCache;
+    this.callLogListItemHelper = callLogListItemHelper;
+    this.voicemailPlaybackPresenter = voicemailPlaybackPresenter;
+    this.blockReportListener = blockReportListener;
+    cachedNumberLookupService = PhoneNumberCache.get(this.context).getCachedNumberLookupService();
 
     // Cache this to avoid having to look it up each time we bind to a call log entry
-    mDefaultPhoneAccountHandle =
+    defaultPhoneAccountHandle =
         TelecomUtil.getDefaultOutgoingPhoneAccount(context, PhoneAccount.SCHEME_TEL);
 
     this.rootView = rootView;
@@ -292,19 +292,19 @@
     phoneCallDetailsViews.nameView.setElegantTextHeight(false);
     phoneCallDetailsViews.callLocationAndDate.setElegantTextHeight(false);
 
-    if (mContext instanceof CallLogActivity) {
+    if (this.context instanceof CallLogActivity) {
       hostUi = HostUi.CALL_HISTORY;
-      Logger.get(mContext)
+      Logger.get(this.context)
           .logQuickContactOnTouch(
               quickContactView, InteractionEvent.Type.OPEN_QUICK_CONTACT_FROM_CALL_HISTORY, true);
-    } else if (mVoicemailPlaybackPresenter == null) {
+    } else if (this.voicemailPlaybackPresenter == null) {
       hostUi = HostUi.CALL_LOG;
-      Logger.get(mContext)
+      Logger.get(this.context)
           .logQuickContactOnTouch(
               quickContactView, InteractionEvent.Type.OPEN_QUICK_CONTACT_FROM_CALL_LOG, true);
     } else {
       hostUi = HostUi.VOICEMAIL;
-      Logger.get(mContext)
+      Logger.get(this.context)
           .logQuickContactOnTouch(
               quickContactView, InteractionEvent.Type.OPEN_QUICK_CONTACT_FROM_VOICEMAIL, false);
     }
@@ -314,16 +314,16 @@
       quickContactView.setPrioritizedMimeType(Phone.CONTENT_ITEM_TYPE);
     }
     primaryActionButtonView.setOnClickListener(this);
-    primaryActionView.setOnClickListener(mExpandCollapseListener);
-    if (mVoicemailPlaybackPresenter != null
-        && ConfigProviderBindings.get(mContext)
+    primaryActionView.setOnClickListener(this.expandCollapseListener);
+    if (this.voicemailPlaybackPresenter != null
+        && ConfigProviderBindings.get(this.context)
             .getBoolean(
                 CallLogAdapter.ENABLE_CALL_LOG_MULTI_SELECT,
                 CallLogAdapter.ENABLE_CALL_LOG_MULTI_SELECT_FLAG)) {
       primaryActionView.setOnLongClickListener(longPressListener);
       quickContactView.setOnLongClickListener(longPressListener);
       quickContactView.setMulitSelectListeners(
-          mExpandCollapseListener, onActionModeStateChangedListener);
+          this.expandCollapseListener, onActionModeStateChangedListener);
     } else {
       primaryActionView.setOnCreateContextMenuListener(this);
     }
@@ -400,51 +400,50 @@
   public boolean onMenuItemClick(MenuItem item) {
     int resId = item.getItemId();
     if (resId == R.id.context_menu_copy_to_clipboard) {
-      ClipboardUtils.copyText(mContext, null, number, true);
+      ClipboardUtils.copyText(context, null, number, true);
       return true;
     } else if (resId == R.id.context_menu_copy_transcript_to_clipboard) {
       ClipboardUtils.copyText(
-          mContext, null, phoneCallDetailsViews.voicemailTranscriptionView.getText(), true);
+          context, null, phoneCallDetailsViews.voicemailTranscriptionView.getText(), true);
       return true;
     } else if (resId == R.id.context_menu_edit_before_call) {
       final Intent intent = new Intent(Intent.ACTION_DIAL, CallUtil.getCallUri(number));
-      intent.setClass(mContext, DialtactsActivity.class);
-      DialerUtils.startActivityWithErrorToast(mContext, intent);
+      intent.setClass(context, DialtactsActivity.class);
+      DialerUtils.startActivityWithErrorToast(context, intent);
       return true;
     } else if (resId == R.id.context_menu_block_report_spam) {
-      Logger.get(mContext)
+      Logger.get(context)
           .logImpression(DialerImpression.Type.CALL_LOG_CONTEXT_MENU_BLOCK_REPORT_SPAM);
       maybeShowBlockNumberMigrationDialog(
           new BlockedNumbersMigrator.Listener() {
             @Override
             public void onComplete() {
-              mBlockReportListener.onBlockReportSpam(
+              blockReportListener.onBlockReportSpam(
                   displayNumber, number, countryIso, callType, info.sourceType);
             }
           });
     } else if (resId == R.id.context_menu_block) {
-      Logger.get(mContext).logImpression(DialerImpression.Type.CALL_LOG_CONTEXT_MENU_BLOCK_NUMBER);
+      Logger.get(context).logImpression(DialerImpression.Type.CALL_LOG_CONTEXT_MENU_BLOCK_NUMBER);
       maybeShowBlockNumberMigrationDialog(
           new BlockedNumbersMigrator.Listener() {
             @Override
             public void onComplete() {
-              mBlockReportListener.onBlock(
+              blockReportListener.onBlock(
                   displayNumber, number, countryIso, callType, info.sourceType);
             }
           });
     } else if (resId == R.id.context_menu_unblock) {
-      Logger.get(mContext)
-          .logImpression(DialerImpression.Type.CALL_LOG_CONTEXT_MENU_UNBLOCK_NUMBER);
-      mBlockReportListener.onUnblock(
+      Logger.get(context).logImpression(DialerImpression.Type.CALL_LOG_CONTEXT_MENU_UNBLOCK_NUMBER);
+      blockReportListener.onUnblock(
           displayNumber, number, countryIso, callType, info.sourceType, isSpam, blockId);
     } else if (resId == R.id.context_menu_report_not_spam) {
-      Logger.get(mContext)
+      Logger.get(context)
           .logImpression(DialerImpression.Type.CALL_LOG_CONTEXT_MENU_REPORT_AS_NOT_SPAM);
-      mBlockReportListener.onReportNotSpam(
+      blockReportListener.onReportNotSpam(
           displayNumber, number, countryIso, callType, info.sourceType);
     } else if (resId == R.id.context_menu_delete) {
       AsyncTaskExecutors.createAsyncTaskExecutor()
-          .submit(TASK_DELETE, new DeleteCallTask(mContext, callIds));
+          .submit(TASK_DELETE, new DeleteCallTask(context, callIds));
     }
     return false;
   }
@@ -526,7 +525,7 @@
         primaryActionButtonView.setImageResource(R.drawable.quantum_ic_play_arrow_white_24);
         primaryActionButtonView.setContentDescription(
             TextUtils.expandTemplate(
-                mContext.getString(R.string.description_voicemail_action), validNameOrNumber));
+                context.getString(R.string.description_voicemail_action), validNameOrNumber));
         primaryActionButtonView.setVisibility(View.VISIBLE);
       } else {
         primaryActionButtonView.setVisibility(View.GONE);
@@ -547,7 +546,7 @@
             IntentProvider.getReturnVideoCallIntentProvider(number, accountHandle));
         primaryActionButtonView.setContentDescription(
             TextUtils.expandTemplate(
-                mContext.getString(R.string.description_video_call_action), validNameOrNumber));
+                context.getString(R.string.description_video_call_action), validNameOrNumber));
         primaryActionButtonView.setImageResource(R.drawable.quantum_ic_videocam_vd_theme_24);
         primaryActionButtonView.setVisibility(View.VISIBLE);
         break;
@@ -560,20 +559,20 @@
         }
         primaryActionButtonView.setContentDescription(
             TextUtils.expandTemplate(
-                mContext.getString(R.string.description_video_call_action), validNameOrNumber));
+                context.getString(R.string.description_video_call_action), validNameOrNumber));
         primaryActionButtonView.setImageResource(R.drawable.quantum_ic_videocam_vd_theme_24);
         primaryActionButtonView.setVisibility(View.VISIBLE);
         break;
       case CallbackAction.VOICE:
-        if (mCallLogCache.isVoicemailNumber(accountHandle, number)) {
+        if (callLogCache.isVoicemailNumber(accountHandle, number)) {
           // Call to generic voicemail number, in case there are multiple accounts
           primaryActionButtonView.setTag(IntentProvider.getReturnVoicemailCallIntentProvider(null));
         } else if (canSupportAssistedDialing()) {
           primaryActionButtonView.setTag(
               IntentProvider.getAssistedDialIntentProvider(
                   number + postDialDigits,
-                  mContext,
-                  mContext.getSystemService(TelephonyManager.class)));
+                  context,
+                  context.getSystemService(TelephonyManager.class)));
         } else {
           primaryActionButtonView.setTag(
               IntentProvider.getReturnCallIntentProvider(number + postDialDigits));
@@ -581,7 +580,7 @@
 
         primaryActionButtonView.setContentDescription(
             TextUtils.expandTemplate(
-                mContext.getString(R.string.description_call_action), validNameOrNumber));
+                context.getString(R.string.description_call_action), validNameOrNumber));
         primaryActionButtonView.setImageResource(R.drawable.quantum_ic_call_vd_theme_24);
         primaryActionButtonView.setVisibility(View.VISIBLE);
         break;
@@ -622,14 +621,14 @@
 
       voicemailPlaybackView.setVisibility(View.VISIBLE);
       Uri uri = Uri.parse(voicemailUri);
-      mVoicemailPlaybackPresenter.setPlaybackView(
+      voicemailPlaybackPresenter.setPlaybackView(
           voicemailPlaybackView,
           rowId,
           uri,
-          mVoicemailPrimaryActionButtonClicked,
+          voicemailPrimaryActionButtonClicked,
           sendVoicemailButtonView);
-      mVoicemailPrimaryActionButtonClicked = false;
-      CallLogAsyncTaskUtil.markVoicemailAsRead(mContext, uri);
+      voicemailPrimaryActionButtonClicked = false;
+      CallLogAsyncTaskUtil.markVoicemailAsRead(context, uri);
       return;
     }
 
@@ -640,7 +639,7 @@
       if (canSupportAssistedDialing()) {
         callButtonView.setTag(
             IntentProvider.getAssistedDialIntentProvider(
-                number, mContext, mContext.getSystemService(TelephonyManager.class)));
+                number, context, context.getSystemService(TelephonyManager.class)));
       } else {
         callButtonView.setTag(IntentProvider.getReturnCallIntentProvider(number));
       }
@@ -651,7 +650,7 @@
       ((TextView) callButtonView.findViewById(R.id.call_action_text))
           .setText(
               TextUtils.expandTemplate(
-                  mContext.getString(R.string.call_log_action_call),
+                  context.getString(R.string.call_log_action_call),
                   nameOrNumber == null ? "" : nameOrNumber));
 
       if (callType == Calls.VOICEMAIL_TYPE && !TextUtils.isEmpty(callTypeOrLocation)) {
@@ -661,7 +660,7 @@
       callButtonView.setVisibility(View.VISIBLE);
     }
 
-    boolean isVoicemailNumber = mCallLogCache.isVoicemailNumber(accountHandle, number);
+    boolean isVoicemailNumber = callLogCache.isVoicemailNumber(accountHandle, number);
 
     switch (callbackAction) {
       case CallbackAction.IMS_VIDEO:
@@ -672,10 +671,10 @@
         videoCallButtonView.setVisibility(View.GONE);
         break;
       case CallbackAction.VOICE:
-        Duo duo = DuoComponent.get(mContext).getDuo();
+        Duo duo = DuoComponent.get(context).getDuo();
         // For a voice call, set the secondary callback action to be an IMS video call if it is
         // available. Otherwise try to set it as a Duo call.
-        if (CallUtil.isVideoEnabled(mContext)
+        if (CallUtil.isVideoEnabled(context)
             && (hasPlacedCarrierVideoCall() || canSupportCarrierVideoCall())) {
           videoCallButtonView.setTag(IntentProvider.getReturnVideoCallIntentProvider(number));
           videoCallButtonView.setVisibility(View.VISIBLE);
@@ -687,24 +686,24 @@
         }
 
         boolean identifiedSpamCall = isSpamFeatureEnabled && isSpam;
-        if (duo.isReachable(mContext, number)) {
+        if (duo.isReachable(context, number)) {
           videoCallButtonView.setTag(IntentProvider.getDuoVideoIntentProvider(number));
           videoCallButtonView.setVisibility(View.VISIBLE);
-        } else if (duo.isActivated(mContext) && !identifiedSpamCall) {
-          if (ConfigProviderBindings.get(mContext)
+        } else if (duo.isActivated(context) && !identifiedSpamCall) {
+          if (ConfigProviderBindings.get(context)
               .getBoolean("enable_call_log_duo_invite_button", false)) {
             inviteVideoButtonView.setTag(IntentProvider.getDuoInviteIntentProvider(number));
             inviteVideoButtonView.setVisibility(View.VISIBLE);
           }
-        } else if (duo.isEnabled(mContext) && !identifiedSpamCall) {
-          if (!duo.isInstalled(mContext)) {
-            if (ConfigProviderBindings.get(mContext)
+        } else if (duo.isEnabled(context) && !identifiedSpamCall) {
+          if (!duo.isInstalled(context)) {
+            if (ConfigProviderBindings.get(context)
                 .getBoolean("enable_call_log_install_duo_button", false)) {
               setUpVideoButtonView.setTag(IntentProvider.getInstallDuoIntentProvider());
               setUpVideoButtonView.setVisibility(View.VISIBLE);
             }
           } else {
-            if (ConfigProviderBindings.get(mContext)
+            if (ConfigProviderBindings.get(context)
                 .getBoolean("enable_call_log_activate_duo_button", false)) {
               setUpVideoButtonView.setTag(IntentProvider.getSetUpDuoIntentProvider());
               setUpVideoButtonView.setVisibility(View.VISIBLE);
@@ -719,19 +718,19 @@
 
     // For voicemail calls, show the voicemail playback layout; hide otherwise.
     if (callType == Calls.VOICEMAIL_TYPE
-        && mVoicemailPlaybackPresenter != null
+        && voicemailPlaybackPresenter != null
         && !TextUtils.isEmpty(voicemailUri)) {
       voicemailPlaybackView.setVisibility(View.VISIBLE);
 
       Uri uri = Uri.parse(voicemailUri);
-      mVoicemailPlaybackPresenter.setPlaybackView(
+      voicemailPlaybackPresenter.setPlaybackView(
           voicemailPlaybackView,
           rowId,
           uri,
-          mVoicemailPrimaryActionButtonClicked,
+          voicemailPrimaryActionButtonClicked,
           sendVoicemailButtonView);
-      mVoicemailPrimaryActionButtonClicked = false;
-      CallLogAsyncTaskUtil.markVoicemailAsRead(mContext, uri);
+      voicemailPrimaryActionButtonClicked = false;
+      CallLogAsyncTaskUtil.markVoicemailAsRead(context, uri);
     } else {
       voicemailPlaybackView.setVisibility(View.GONE);
       sendVoicemailButtonView.setVisibility(View.GONE);
@@ -742,8 +741,8 @@
     } else {
       detailsButtonView.setVisibility(View.VISIBLE);
       boolean canReportCallerId =
-          mCachedNumberLookupService != null
-              && mCachedNumberLookupService.canReportAsInvalid(info.sourceType, info.objectId);
+          cachedNumberLookupService != null
+              && cachedNumberLookupService.canReportAsInvalid(info.sourceType, info.objectId);
       detailsButtonView.setTag(
           IntentProvider.getCallDetailIntentProvider(
               callDetailsEntries, buildContact(), canReportCallerId, canSupportAssistedDialing()));
@@ -773,9 +772,9 @@
       sendMessageView.setVisibility(View.GONE);
     }
 
-    mCallLogListItemHelper.setActionContentDescriptions(this);
+    callLogListItemHelper.setActionContentDescriptions(this);
 
-    boolean supportsCallSubject = mCallLogCache.doesAccountSupportCallSubject(accountHandle);
+    boolean supportsCallSubject = callLogCache.doesAccountSupportCallSubject(accountHandle);
     callWithNoteButtonView.setVisibility(
         supportsCallSubject && !isVoicemailNumber && info != null ? View.VISIBLE : View.GONE);
 
@@ -796,7 +795,7 @@
   private boolean showDuoPrimaryButton() {
     return accountHandle != null
         && accountHandle.getComponentName().equals(DuoConstants.PHONE_ACCOUNT_COMPONENT_NAME)
-        && DuoComponent.get(mContext).getDuo().isReachable(mContext, number);
+        && DuoComponent.get(context).getDuo().isReachable(context, number);
   }
 
   private static boolean hasDialableChar(CharSequence number) {
@@ -818,10 +817,10 @@
     if (accountHandle == null) {
       return false;
     }
-    if (mDefaultPhoneAccountHandle == null) {
+    if (defaultPhoneAccountHandle == null) {
       return false;
     }
-    return accountHandle.getComponentName().equals(mDefaultPhoneAccountHandle.getComponentName());
+    return accountHandle.getComponentName().equals(defaultPhoneAccountHandle.getComponentName());
   }
 
   private boolean canSupportAssistedDialing() {
@@ -829,7 +828,7 @@
   }
 
   private boolean canSupportCarrierVideoCall() {
-    return mCallLogCache.canRelyOnVideoPresence()
+    return callLogCache.canRelyOnVideoPresence()
         && info != null
         && (info.carrierPresence & Phone.CARRIER_PRESENCE_VT_CAPABLE) != 0;
   }
@@ -907,12 +906,12 @@
     quickContactView.assignContactUri(info.lookupUri);
 
     if (isSpamFeatureEnabled && isSpam) {
-      quickContactView.setImageDrawable(mContext.getDrawable(R.drawable.blocked_contact));
+      quickContactView.setImageDrawable(context.getDrawable(R.drawable.blocked_contact));
       return;
     }
 
     final String displayName = TextUtils.isEmpty(info.name) ? displayNumber : info.name;
-    ContactPhotoManager.getInstance(mContext)
+    ContactPhotoManager.getInstance(context)
         .loadDialerThumbnailOrPhoto(
             quickContactView,
             info.lookupUri,
@@ -924,10 +923,9 @@
 
   private @ContactType int getContactType() {
     return LetterTileDrawable.getContactTypeFromPrimitives(
-        mCallLogCache.isVoicemailNumber(accountHandle, number),
+        callLogCache.isVoicemailNumber(accountHandle, number),
         isSpam,
-        mCachedNumberLookupService != null
-            && mCachedNumberLookupService.isBusiness(info.sourceType),
+        cachedNumberLookupService != null && cachedNumberLookupService.isBusiness(info.sourceType),
         numberPresentation,
         false);
   }
@@ -935,19 +933,19 @@
   @Override
   public void onClick(View view) {
     if (view.getId() == R.id.primary_action_button) {
-      CallLogAsyncTaskUtil.markCallAsRead(mContext, callIds);
+      CallLogAsyncTaskUtil.markCallAsRead(context, callIds);
     }
 
     if (view.getId() == R.id.primary_action_button && !TextUtils.isEmpty(voicemailUri)) {
-      Logger.get(mContext).logImpression(DialerImpression.Type.VOICEMAIL_PLAY_AUDIO_DIRECTLY);
-      mVoicemailPrimaryActionButtonClicked = true;
-      mExpandCollapseListener.onClick(primaryActionView);
+      Logger.get(context).logImpression(DialerImpression.Type.VOICEMAIL_PLAY_AUDIO_DIRECTLY);
+      voicemailPrimaryActionButtonClicked = true;
+      expandCollapseListener.onClick(primaryActionView);
       return;
     }
 
     if (view.getId() == R.id.call_with_note_action) {
       CallSubjectDialog.start(
-          (Activity) mContext,
+          (Activity) context,
           info.photoId,
           info.photoUri,
           info.lookupUri,
@@ -962,12 +960,12 @@
     }
 
     if (view.getId() == R.id.block_report_action) {
-      Logger.get(mContext).logImpression(DialerImpression.Type.CALL_LOG_BLOCK_REPORT_SPAM);
+      Logger.get(context).logImpression(DialerImpression.Type.CALL_LOG_BLOCK_REPORT_SPAM);
       maybeShowBlockNumberMigrationDialog(
           new BlockedNumbersMigrator.Listener() {
             @Override
             public void onComplete() {
-              mBlockReportListener.onBlockReportSpam(
+              blockReportListener.onBlockReportSpam(
                   displayNumber, number, countryIso, callType, info.sourceType);
             }
           });
@@ -975,12 +973,12 @@
     }
 
     if (view.getId() == R.id.block_action) {
-      Logger.get(mContext).logImpression(DialerImpression.Type.CALL_LOG_BLOCK_NUMBER);
+      Logger.get(context).logImpression(DialerImpression.Type.CALL_LOG_BLOCK_NUMBER);
       maybeShowBlockNumberMigrationDialog(
           new BlockedNumbersMigrator.Listener() {
             @Override
             public void onComplete() {
-              mBlockReportListener.onBlock(
+              blockReportListener.onBlock(
                   displayNumber, number, countryIso, callType, info.sourceType);
             }
           });
@@ -988,23 +986,23 @@
     }
 
     if (view.getId() == R.id.unblock_action) {
-      Logger.get(mContext).logImpression(DialerImpression.Type.CALL_LOG_UNBLOCK_NUMBER);
-      mBlockReportListener.onUnblock(
+      Logger.get(context).logImpression(DialerImpression.Type.CALL_LOG_UNBLOCK_NUMBER);
+      blockReportListener.onUnblock(
           displayNumber, number, countryIso, callType, info.sourceType, isSpam, blockId);
       return;
     }
 
     if (view.getId() == R.id.report_not_spam_action) {
-      Logger.get(mContext).logImpression(DialerImpression.Type.CALL_LOG_REPORT_AS_NOT_SPAM);
-      mBlockReportListener.onReportNotSpam(
+      Logger.get(context).logImpression(DialerImpression.Type.CALL_LOG_REPORT_AS_NOT_SPAM);
+      blockReportListener.onReportNotSpam(
           displayNumber, number, countryIso, callType, info.sourceType);
       return;
     }
 
     if (view.getId() == R.id.call_compose_action) {
       LogUtil.i("CallLogListItemViewHolder.onClick", "share and call pressed");
-      Logger.get(mContext).logImpression(DialerImpression.Type.CALL_LOG_SHARE_AND_CALL);
-      Activity activity = (Activity) mContext;
+      Logger.get(context).logImpression(DialerImpression.Type.CALL_LOG_SHARE_AND_CALL);
+      Activity activity = (Activity) context;
       activity.startActivityForResult(
           CallComposerActivity.newIntent(activity, buildContact()),
           ActivityRequestCodes.DIALTACTS_CALL_COMPOSER);
@@ -1012,8 +1010,8 @@
     }
 
     if (view.getId() == R.id.share_voicemail) {
-      Logger.get(mContext).logImpression(DialerImpression.Type.VVM_SHARE_PRESSED);
-      mVoicemailPlaybackPresenter.shareVoicemail();
+      Logger.get(context).logImpression(DialerImpression.Type.VVM_SHARE_PRESSED);
+      voicemailPlaybackPresenter.shareVoicemail();
       return;
     }
 
@@ -1024,7 +1022,7 @@
       return;
     }
 
-    final Intent intent = intentProvider.getIntent(mContext);
+    final Intent intent = intentProvider.getIntent(context);
     // See IntentProvider.getCallDetailIntentProvider() for why this may be null.
     if (intent == null) {
       return;
@@ -1037,19 +1035,19 @@
       startDuoActivity(intent);
     } else if (CallDetailsActivity.isLaunchIntent(intent)) {
       PerformanceReport.recordClick(UiAction.Type.OPEN_CALL_DETAIL);
-      ((Activity) mContext)
+      ((Activity) context)
           .startActivityForResult(intent, ActivityRequestCodes.DIALTACTS_CALL_DETAILS);
     } else {
       if (Intent.ACTION_CALL.equals(intent.getAction())
           && intent.getIntExtra(TelecomManager.EXTRA_START_CALL_WITH_VIDEO_STATE, -1)
               == VideoProfile.STATE_BIDIRECTIONAL) {
-        Logger.get(mContext).logImpression(DialerImpression.Type.IMS_VIDEO_REQUESTED_FROM_CALL_LOG);
+        Logger.get(context).logImpression(DialerImpression.Type.IMS_VIDEO_REQUESTED_FROM_CALL_LOG);
       } else if (intent.getDataString() != null
           && intent.getDataString().contains(DuoConstants.PACKAGE_NAME)) {
-        Logger.get(mContext).logImpression(DialerImpression.Type.DUO_CALL_LOG_SET_UP_INSTALL);
+        Logger.get(context).logImpression(DialerImpression.Type.DUO_CALL_LOG_SET_UP_INSTALL);
       }
 
-      DialerUtils.startActivityWithErrorToast(mContext, intent);
+      DialerUtils.startActivityWithErrorToast(context, intent);
     }
   }
 
@@ -1062,14 +1060,14 @@
 
   private void startDuoActivity(Intent intent) {
     if (DuoConstants.DUO_ACTIVATE_ACTION.equals(intent.getAction())) {
-      Logger.get(mContext).logImpression(DialerImpression.Type.DUO_CALL_LOG_SET_UP_ACTIVATE);
+      Logger.get(context).logImpression(DialerImpression.Type.DUO_CALL_LOG_SET_UP_ACTIVATE);
     } else if (DuoConstants.DUO_INVITE_ACTION.equals(intent.getAction())) {
-      Logger.get(mContext).logImpression(DialerImpression.Type.DUO_CALL_LOG_INVITE);
+      Logger.get(context).logImpression(DialerImpression.Type.DUO_CALL_LOG_INVITE);
     } else if (DuoConstants.DUO_CALL_ACTION.equals(intent.getAction())) {
-      Logger.get(mContext)
+      Logger.get(context)
           .logImpression(DialerImpression.Type.LIGHTBRINGER_VIDEO_REQUESTED_FROM_CALL_LOG);
       if (isNonContactEntry(info)) {
-        Logger.get(mContext)
+        Logger.get(context)
             .logImpression(
                 DialerImpression.Type.LIGHTBRINGER_NON_CONTACT_VIDEO_REQUESTED_FROM_CALL_LOG);
       }
@@ -1079,10 +1077,10 @@
     }
 
     try {
-      Activity activity = (Activity) mContext;
+      Activity activity = (Activity) context;
       activity.startActivityForResult(intent, ActivityRequestCodes.DIALTACTS_DUO);
     } catch (ActivityNotFoundException e) {
-      Toast.makeText(mContext, R.string.activity_not_available, Toast.LENGTH_SHORT).show();
+      Toast.makeText(context, R.string.activity_not_available, Toast.LENGTH_SHORT).show();
     }
   }
 
@@ -1115,10 +1113,10 @@
     contact.setNumberLabel(numberType);
 
     /* third line of contact view. */
-    String accountLabel = mCallLogCache.getAccountLabel(accountHandle);
+    String accountLabel = callLogCache.getAccountLabel(accountHandle);
     if (!TextUtils.isEmpty(accountLabel)) {
       SimDetails.Builder simDetails = SimDetails.newBuilder().setNetwork(accountLabel);
-      simDetails.setColor(mCallLogCache.getAccountColor(accountHandle));
+      simDetails.setColor(callLogCache.getAccountColor(accountHandle));
       contact.setSimDetails(simDetails.build());
     }
     return contact.build();
@@ -1126,36 +1124,35 @@
 
   private void logCallLogAction(int id) {
     if (id == R.id.send_message_action) {
-      Logger.get(mContext).logImpression(DialerImpression.Type.CALL_LOG_SEND_MESSAGE);
+      Logger.get(context).logImpression(DialerImpression.Type.CALL_LOG_SEND_MESSAGE);
     } else if (id == R.id.add_to_existing_contact_action) {
-      Logger.get(mContext).logImpression(DialerImpression.Type.CALL_LOG_ADD_TO_CONTACT);
+      Logger.get(context).logImpression(DialerImpression.Type.CALL_LOG_ADD_TO_CONTACT);
       switch (hostUi) {
         case HostUi.CALL_HISTORY:
-          Logger.get(mContext)
+          Logger.get(context)
               .logImpression(DialerImpression.Type.ADD_TO_A_CONTACT_FROM_CALL_HISTORY);
           break;
         case HostUi.CALL_LOG:
-          Logger.get(mContext).logImpression(DialerImpression.Type.ADD_TO_A_CONTACT_FROM_CALL_LOG);
+          Logger.get(context).logImpression(DialerImpression.Type.ADD_TO_A_CONTACT_FROM_CALL_LOG);
           break;
         case HostUi.VOICEMAIL:
-          Logger.get(mContext).logImpression(DialerImpression.Type.ADD_TO_A_CONTACT_FROM_VOICEMAIL);
+          Logger.get(context).logImpression(DialerImpression.Type.ADD_TO_A_CONTACT_FROM_VOICEMAIL);
           break;
         default:
           throw Assert.createIllegalStateFailException();
       }
     } else if (id == R.id.create_new_contact_action) {
-      Logger.get(mContext).logImpression(DialerImpression.Type.CALL_LOG_CREATE_NEW_CONTACT);
+      Logger.get(context).logImpression(DialerImpression.Type.CALL_LOG_CREATE_NEW_CONTACT);
       switch (hostUi) {
         case HostUi.CALL_HISTORY:
-          Logger.get(mContext)
+          Logger.get(context)
               .logImpression(DialerImpression.Type.CREATE_NEW_CONTACT_FROM_CALL_HISTORY);
           break;
         case HostUi.CALL_LOG:
-          Logger.get(mContext)
-              .logImpression(DialerImpression.Type.CREATE_NEW_CONTACT_FROM_CALL_LOG);
+          Logger.get(context).logImpression(DialerImpression.Type.CREATE_NEW_CONTACT_FROM_CALL_LOG);
           break;
         case HostUi.VOICEMAIL:
-          Logger.get(mContext)
+          Logger.get(context)
               .logImpression(DialerImpression.Type.CREATE_NEW_CONTACT_FROM_VOICEMAIL);
           break;
         default:
@@ -1166,7 +1163,7 @@
 
   private void maybeShowBlockNumberMigrationDialog(BlockedNumbersMigrator.Listener listener) {
     if (!FilteredNumberCompat.maybeShowBlockNumberMigrationDialog(
-        mContext, ((Activity) mContext).getFragmentManager(), listener)) {
+        context, ((Activity) context).getFragmentManager(), listener)) {
       listener.onComplete();
     }
   }
@@ -1179,8 +1176,8 @@
     reportNotSpamView.setVisibility(View.GONE);
     String e164Number = PhoneNumberUtils.formatNumberToE164(number, countryIso);
     if (isVoicemailNumber
-        || !FilteredNumbersUtil.canBlockNumber(mContext, e164Number, number)
-        || !FilteredNumberCompat.canAttemptBlockOperations(mContext)) {
+        || !FilteredNumbersUtil.canBlockNumber(context, e164Number, number)
+        || !FilteredNumberCompat.canAttemptBlockOperations(context)) {
       return;
     }
     boolean isBlocked = blockId != null;
@@ -1217,7 +1214,7 @@
     }
 
     if (callType == CallLog.Calls.VOICEMAIL_TYPE) {
-      menu.setHeaderTitle(mContext.getResources().getText(R.string.voicemail));
+      menu.setHeaderTitle(context.getResources().getText(R.string.voicemail));
     } else {
       menu.setHeaderTitle(
           PhoneNumberUtilsCompat.createTtsSpannable(
@@ -1237,7 +1234,7 @@
     // 3) Number is a SIP address
 
     if (PhoneNumberHelper.canPlaceCallsTo(number, numberPresentation)
-        && !mCallLogCache.isVoicemailNumber(accountHandle, number)
+        && !callLogCache.isVoicemailNumber(accountHandle, number)
         && !PhoneNumberHelper.isSipNumber(number)) {
       menu.add(
               ContextMenu.NONE,
@@ -1258,10 +1255,10 @@
     }
 
     String e164Number = PhoneNumberUtils.formatNumberToE164(number, countryIso);
-    boolean isVoicemailNumber = mCallLogCache.isVoicemailNumber(accountHandle, number);
+    boolean isVoicemailNumber = callLogCache.isVoicemailNumber(accountHandle, number);
     if (!isVoicemailNumber
-        && FilteredNumbersUtil.canBlockNumber(mContext, e164Number, number)
-        && FilteredNumberCompat.canAttemptBlockOperations(mContext)) {
+        && FilteredNumbersUtil.canBlockNumber(context, e164Number, number)
+        && FilteredNumberCompat.canAttemptBlockOperations(context)) {
       boolean isBlocked = blockId != null;
       if (isBlocked) {
         menu.add(
@@ -1309,7 +1306,7 @@
           .setOnMenuItemClickListener(this);
     }
 
-    Logger.get(mContext).logScreenView(ScreenEvent.Type.CALL_LOG_CONTEXT_MENU, (Activity) mContext);
+    Logger.get(context).logScreenView(ScreenEvent.Type.CALL_LOG_CONTEXT_MENU, (Activity) context);
   }
 
   /** Specifies where the view holder belongs. */
diff --git a/java/com/android/dialer/app/calllog/CallLogNotificationsQueryHelper.java b/java/com/android/dialer/app/calllog/CallLogNotificationsQueryHelper.java
index 3a4bf87..d20ddd0 100644
--- a/java/com/android/dialer/app/calllog/CallLogNotificationsQueryHelper.java
+++ b/java/com/android/dialer/app/calllog/CallLogNotificationsQueryHelper.java
@@ -57,20 +57,20 @@
   static final String CONFIG_NEW_VOICEMAIL_NOTIFICATION_THRESHOLD_OFFSET =
       "new_voicemail_notification_threshold";
 
-  private final Context mContext;
-  private final NewCallsQuery mNewCallsQuery;
-  private final ContactInfoHelper mContactInfoHelper;
-  private final String mCurrentCountryIso;
+  private final Context context;
+  private final NewCallsQuery newCallsQuery;
+  private final ContactInfoHelper contactInfoHelper;
+  private final String currentCountryIso;
 
   CallLogNotificationsQueryHelper(
       Context context,
       NewCallsQuery newCallsQuery,
       ContactInfoHelper contactInfoHelper,
       String countryIso) {
-    mContext = context;
-    mNewCallsQuery = newCallsQuery;
-    mContactInfoHelper = contactInfoHelper;
-    mCurrentCountryIso = countryIso;
+    this.context = context;
+    this.newCallsQuery = newCallsQuery;
+    this.contactInfoHelper = contactInfoHelper;
+    currentCountryIso = countryIso;
   }
 
   /** Returns an instance of {@link CallLogNotificationsQueryHelper}. */
@@ -146,7 +146,7 @@
   }
 
   NewCallsQuery getNewCallsQuery() {
-    return mNewCallsQuery;
+    return newCallsQuery;
   }
 
   /**
@@ -156,10 +156,10 @@
    */
   @Nullable
   public List<NewCall> getNewVoicemails() {
-    return mNewCallsQuery.query(
+    return newCallsQuery.query(
         Calls.VOICEMAIL_TYPE,
         System.currentTimeMillis()
-            - ConfigProviderBindings.get(mContext)
+            - ConfigProviderBindings.get(context)
                 .getLong(
                     CONFIG_NEW_VOICEMAIL_NOTIFICATION_THRESHOLD_OFFSET, TimeUnit.DAYS.toMillis(7)));
   }
@@ -171,7 +171,7 @@
    */
   @Nullable
   public List<NewCall> getNewMissedCalls() {
-    return mNewCallsQuery.query(Calls.MISSED_TYPE);
+    return newCallsQuery.query(Calls.MISSED_TYPE);
   }
 
   /**
@@ -193,7 +193,7 @@
   public ContactInfo getContactInfo(
       @Nullable String number, int numberPresentation, @Nullable String countryIso) {
     if (countryIso == null) {
-      countryIso = mCurrentCountryIso;
+      countryIso = currentCountryIso;
     }
 
     number = (number == null) ? "" : number;
@@ -205,14 +205,14 @@
 
     // 1. Special number representation.
     contactInfo.name =
-        PhoneNumberDisplayUtil.getDisplayName(mContext, number, numberPresentation, false)
+        PhoneNumberDisplayUtil.getDisplayName(context, number, numberPresentation, false)
             .toString();
     if (!TextUtils.isEmpty(contactInfo.name)) {
       return contactInfo;
     }
 
     // 2. Look it up in the cache.
-    ContactInfo cachedContactInfo = mContactInfoHelper.lookupNumber(number, countryIso);
+    ContactInfo cachedContactInfo = contactInfoHelper.lookupNumber(number, countryIso);
 
     if (cachedContactInfo != null && !TextUtils.isEmpty(cachedContactInfo.name)) {
       return cachedContactInfo;
@@ -226,7 +226,7 @@
       contactInfo.name = number;
     } else {
       // 5. Otherwise, it's unknown number.
-      contactInfo.name = mContext.getResources().getString(R.string.unknown);
+      contactInfo.name = context.getResources().getString(R.string.unknown);
     }
     return contactInfo;
   }
@@ -330,12 +330,12 @@
     private static final int DATE_COLUMN_INDEX = 8;
     private static final int TRANSCRIPTION_STATE_COLUMN_INDEX = 9;
 
-    private final ContentResolver mContentResolver;
-    private final Context mContext;
+    private final ContentResolver contentResolver;
+    private final Context context;
 
     private DefaultNewCallsQuery(Context context, ContentResolver contentResolver) {
-      mContext = context;
-      mContentResolver = contentResolver;
+      this.context = context;
+      this.contentResolver = contentResolver;
     }
 
     @Override
@@ -350,7 +350,7 @@
     @TargetApi(Build.VERSION_CODES.M)
     @SuppressWarnings("MissingPermission")
     public List<NewCall> query(int type, long thresholdMillis) {
-      if (!PermissionsUtil.hasPermission(mContext, Manifest.permission.READ_CALL_LOG)) {
+      if (!PermissionsUtil.hasPermission(context, Manifest.permission.READ_CALL_LOG)) {
         LogUtil.w(
             "CallLogNotificationsQueryHelper.DefaultNewCallsQuery.query",
             "no READ_CALL_LOG permission, returning null for calls lookup.");
@@ -382,7 +382,7 @@
       }
       Selection selection = selectionBuilder.build();
       try (Cursor cursor =
-          mContentResolver.query(
+          contentResolver.query(
               Calls.CONTENT_URI_WITH_VOICEMAIL,
               (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) ? PROJECTION_O : PROJECTION,
               selection.getSelection(),
@@ -407,7 +407,7 @@
     @Nullable
     @Override
     public NewCall query(Uri callsUri) {
-      if (!PermissionsUtil.hasPermission(mContext, Manifest.permission.READ_CALL_LOG)) {
+      if (!PermissionsUtil.hasPermission(context, Manifest.permission.READ_CALL_LOG)) {
         LogUtil.w(
             "CallLogNotificationsQueryHelper.DefaultNewCallsQuery.query",
             "No READ_CALL_LOG permission, returning null for calls lookup.");
@@ -415,7 +415,7 @@
       }
       final String selection = String.format("%s = '%s'", Calls.VOICEMAIL_URI, callsUri.toString());
       try (Cursor cursor =
-          mContentResolver.query(
+          contentResolver.query(
               Calls.CONTENT_URI_WITH_VOICEMAIL,
               (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) ? PROJECTION_O : PROJECTION,
               selection,
diff --git a/java/com/android/dialer/app/calllog/DialerQuickContactBadge.java b/java/com/android/dialer/app/calllog/DialerQuickContactBadge.java
index a3aac41..81aed8b 100644
--- a/java/com/android/dialer/app/calllog/DialerQuickContactBadge.java
+++ b/java/com/android/dialer/app/calllog/DialerQuickContactBadge.java
@@ -27,7 +27,7 @@
 /** Allows us to click the contact badge for non multi select mode. */
 class DialerQuickContactBadge extends QuickContactBadge {
 
-  private View.OnClickListener mExtraOnClickListener;
+  private View.OnClickListener extraOnClickListener;
   private OnActionModeStateChangedListener onActionModeStateChangeListener;
 
   public DialerQuickContactBadge(Context context) {
@@ -44,11 +44,11 @@
 
   @Override
   public void onClick(View v) {
-    if (mExtraOnClickListener != null
+    if (extraOnClickListener != null
         && onActionModeStateChangeListener.isActionModeStateEnabled()) {
       Logger.get(v.getContext())
           .logImpression(DialerImpression.Type.MULTISELECT_SINGLE_PRESS_TAP_VIA_CONTACT_BADGE);
-      mExtraOnClickListener.onClick(v);
+      extraOnClickListener.onClick(v);
     } else {
       super.onClick(v);
     }
@@ -57,7 +57,7 @@
   public void setMulitSelectListeners(
       View.OnClickListener extraOnClickListener,
       OnActionModeStateChangedListener actionModeStateChangeListener) {
-    mExtraOnClickListener = extraOnClickListener;
+    this.extraOnClickListener = extraOnClickListener;
     onActionModeStateChangeListener = actionModeStateChangeListener;
   }
 }
diff --git a/java/com/android/dialer/app/calllog/GroupingListAdapter.java b/java/com/android/dialer/app/calllog/GroupingListAdapter.java
index d115720..29a4d4e 100644
--- a/java/com/android/dialer/app/calllog/GroupingListAdapter.java
+++ b/java/com/android/dialer/app/calllog/GroupingListAdapter.java
@@ -32,7 +32,7 @@
  */
 abstract class GroupingListAdapter extends RecyclerView.Adapter {
 
-  protected ContentObserver mChangeObserver =
+  protected ContentObserver changeObserver =
       new ContentObserver(new Handler()) {
         @Override
         public boolean deliverSelfNotifications() {
@@ -44,21 +44,21 @@
           onContentChanged();
         }
       };
-  protected DataSetObserver mDataSetObserver =
+  protected DataSetObserver dataSetObserver =
       new DataSetObserver() {
         @Override
         public void onChanged() {
           notifyDataSetChanged();
         }
       };
-  private Cursor mCursor;
+  private Cursor cursor;
   /**
    * SparseIntArray, which maps the cursor position of the first element of a group to the size of
    * the group. The index of a key in this map corresponds to the list position of that group.
    */
-  private SparseIntArray mGroupMetadata;
+  private SparseIntArray groupMetadata;
 
-  private int mItemCount;
+  private int itemCount;
 
   public GroupingListAdapter() {
     reset();
@@ -72,28 +72,28 @@
   protected abstract void onContentChanged();
 
   public void changeCursor(Cursor cursor) {
-    if (cursor == mCursor) {
+    if (cursor == this.cursor) {
       return;
     }
 
-    if (mCursor != null) {
-      mCursor.unregisterContentObserver(mChangeObserver);
-      mCursor.unregisterDataSetObserver(mDataSetObserver);
-      mCursor.close();
+    if (this.cursor != null) {
+      this.cursor.unregisterContentObserver(changeObserver);
+      this.cursor.unregisterDataSetObserver(dataSetObserver);
+      this.cursor.close();
     }
 
     // Reset whenever the cursor is changed.
     reset();
-    mCursor = cursor;
+    this.cursor = cursor;
 
     if (cursor != null) {
-      addGroups(mCursor);
+      addGroups(this.cursor);
 
       // Calculate the item count by subtracting group child counts from the cursor count.
-      mItemCount = mGroupMetadata.size();
+      itemCount = groupMetadata.size();
 
-      cursor.registerContentObserver(mChangeObserver);
-      cursor.registerDataSetObserver(mDataSetObserver);
+      cursor.registerContentObserver(changeObserver);
+      cursor.registerDataSetObserver(dataSetObserver);
       notifyDataSetChanged();
     }
   }
@@ -103,18 +103,18 @@
    * #addGroups} method.
    */
   public void addGroup(int cursorPosition, int groupSize) {
-    int lastIndex = mGroupMetadata.size() - 1;
-    if (lastIndex < 0 || cursorPosition <= mGroupMetadata.keyAt(lastIndex)) {
-      mGroupMetadata.put(cursorPosition, groupSize);
+    int lastIndex = groupMetadata.size() - 1;
+    if (lastIndex < 0 || cursorPosition <= groupMetadata.keyAt(lastIndex)) {
+      groupMetadata.put(cursorPosition, groupSize);
     } else {
       // Optimization to avoid binary search if adding groups in ascending cursor position.
-      mGroupMetadata.append(cursorPosition, groupSize);
+      groupMetadata.append(cursorPosition, groupSize);
     }
   }
 
   @Override
   public int getItemCount() {
-    return mItemCount;
+    return itemCount;
   }
 
   /**
@@ -122,11 +122,11 @@
    * position.
    */
   public int getGroupSize(int listPosition) {
-    if (listPosition < 0 || listPosition >= mGroupMetadata.size()) {
+    if (listPosition < 0 || listPosition >= groupMetadata.size()) {
       return 0;
     }
 
-    return mGroupMetadata.valueAt(listPosition);
+    return groupMetadata.valueAt(listPosition);
   }
 
   /**
@@ -134,20 +134,20 @@
    * corresponding to that position.
    */
   public Object getItem(int listPosition) {
-    if (mCursor == null || listPosition < 0 || listPosition >= mGroupMetadata.size()) {
+    if (cursor == null || listPosition < 0 || listPosition >= groupMetadata.size()) {
       return null;
     }
 
-    int cursorPosition = mGroupMetadata.keyAt(listPosition);
-    if (mCursor.moveToPosition(cursorPosition)) {
-      return mCursor;
+    int cursorPosition = groupMetadata.keyAt(listPosition);
+    if (cursor.moveToPosition(cursorPosition)) {
+      return cursor;
     } else {
       return null;
     }
   }
 
   private void reset() {
-    mItemCount = 0;
-    mGroupMetadata = new SparseIntArray();
+    itemCount = 0;
+    groupMetadata = new SparseIntArray();
   }
 }
diff --git a/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java b/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java
index 794b759..fa1f7ab 100644
--- a/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java
+++ b/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java
@@ -55,17 +55,17 @@
   /** The maximum number of icons will be shown to represent the call types in a group. */
   private static final int MAX_CALL_TYPE_ICONS = 3;
 
-  private final Context mContext;
-  private final Resources mResources;
-  private final CallLogCache mCallLogCache;
+  private final Context context;
+  private final Resources resources;
+  private final CallLogCache callLogCache;
   /** Calendar used to construct dates */
-  private final Calendar mCalendar;
+  private final Calendar calendar;
   /** The injected current time in milliseconds since the epoch. Used only by tests. */
-  private Long mCurrentTimeMillisForTest;
+  private Long currentTimeMillisForTest;
 
-  private CharSequence mPhoneTypeLabelForTest;
+  private CharSequence phoneTypeLabelForTest;
   /** List of items to be concatenated together for accessibility descriptions */
-  private ArrayList<CharSequence> mDescriptionItems = new ArrayList<>();
+  private ArrayList<CharSequence> descriptionItems = new ArrayList<>();
 
   /**
    * Creates a new instance of the helper.
@@ -75,10 +75,10 @@
    * @param resources used to look up strings
    */
   public PhoneCallDetailsHelper(Context context, Resources resources, CallLogCache callLogCache) {
-    mContext = context;
-    mResources = resources;
-    mCallLogCache = callLogCache;
-    mCalendar = Calendar.getInstance();
+    this.context = context;
+    this.resources = resources;
+    this.callLogCache = callLogCache;
+    calendar = Calendar.getInstance();
   }
 
   /** Fills the call details views with content. */
@@ -100,7 +100,7 @@
     views.callTypeIcons.setShowHd(
         (details.features & Calls.FEATURES_HD_CALL) == Calls.FEATURES_HD_CALL);
     views.callTypeIcons.setShowWifi(
-        MotorolaUtils.shouldShowWifiIconInCallLog(mContext, details.features));
+        MotorolaUtils.shouldShowWifiIconInCallLog(context, details.features));
     views.callTypeIcons.requestLayout();
     views.callTypeIcons.setVisibility(View.VISIBLE);
 
@@ -116,23 +116,23 @@
     setDetailText(views, callCount, details);
 
     // Set the account label if it exists.
-    String accountLabel = mCallLogCache.getAccountLabel(details.accountHandle);
+    String accountLabel = callLogCache.getAccountLabel(details.accountHandle);
     if (!TextUtils.isEmpty(details.viaNumber)) {
       if (!TextUtils.isEmpty(accountLabel)) {
         accountLabel =
-            mResources.getString(
+            resources.getString(
                 R.string.call_log_via_number_phone_account, accountLabel, details.viaNumber);
       } else {
-        accountLabel = mResources.getString(R.string.call_log_via_number, details.viaNumber);
+        accountLabel = resources.getString(R.string.call_log_via_number, details.viaNumber);
       }
     }
     if (!TextUtils.isEmpty(accountLabel)) {
       views.callAccountLabel.setVisibility(View.VISIBLE);
       views.callAccountLabel.setText(accountLabel);
-      int color = mCallLogCache.getAccountColor(details.accountHandle);
+      int color = callLogCache.getAccountColor(details.accountHandle);
       if (color == PhoneAccount.NO_HIGHLIGHT_COLOR) {
         int defaultColor = R.color.dialer_secondary_text_color;
-        views.callAccountLabel.setTextColor(mContext.getResources().getColor(defaultColor));
+        views.callAccountLabel.setTextColor(context.getResources().getColor(defaultColor));
       } else {
         views.callAccountLabel.setTextColor(color);
       }
@@ -171,23 +171,22 @@
           showRatingPrompt = true;
         } else if (details.transcriptionState == VoicemailCompat.TRANSCRIPTION_AVAILABLE
             || details.transcriptionState == VoicemailCompat.TRANSCRIPTION_AVAILABLE_AND_RATED) {
-          branding = mResources.getString(R.string.voicemail_transcription_branding_text);
+          branding = resources.getString(R.string.voicemail_transcription_branding_text);
         }
       } else {
         switch (details.transcriptionState) {
           case VoicemailCompat.TRANSCRIPTION_IN_PROGRESS:
-            branding = mResources.getString(R.string.voicemail_transcription_in_progress);
+            branding = resources.getString(R.string.voicemail_transcription_in_progress);
             break;
           case VoicemailCompat.TRANSCRIPTION_FAILED_NO_SPEECH_DETECTED:
-            branding = mResources.getString(R.string.voicemail_transcription_failed_no_speech);
+            branding = resources.getString(R.string.voicemail_transcription_failed_no_speech);
             break;
           case VoicemailCompat.TRANSCRIPTION_FAILED_LANGUAGE_NOT_SUPPORTED:
             branding =
-                mResources.getString(
-                    R.string.voicemail_transcription_failed_language_not_supported);
+                resources.getString(R.string.voicemail_transcription_failed_language_not_supported);
             break;
           case VoicemailCompat.TRANSCRIPTION_FAILED:
-            branding = mResources.getString(R.string.voicemail_transcription_failed);
+            branding = resources.getString(R.string.voicemail_transcription_failed);
             break;
           default:
             break; // Fall through
@@ -228,7 +227,7 @@
     views.callLocationAndDate.setTypeface(typeface);
     views.callLocationAndDate.setTextColor(
         ContextCompat.getColor(
-            mContext,
+            context,
             details.isRead ? R.color.call_log_detail_color : R.color.call_log_unread_text_color));
   }
 
@@ -236,16 +235,16 @@
       int transcriptionState, PhoneAccountHandle account) {
     // TODO(mdooley): add a configurable random element here?
     return transcriptionState == VoicemailCompat.TRANSCRIPTION_AVAILABLE
-        && VoicemailComponent.get(mContext)
+        && VoicemailComponent.get(context)
             .getVoicemailClient()
-            .isVoicemailDonationEnabled(mContext, account);
+            .isVoicemailDonationEnabled(context, account);
   }
 
   private void recordTranscriptionRating(
       TranscriptionRatingValue ratingValue, PhoneCallDetails details) {
     LogUtil.enterBlock("PhoneCallDetailsHelper.recordTranscriptionRating");
     TranscriptionRatingHelper.sendRating(
-        mContext,
+        context,
         ratingValue,
         Uri.parse(details.voicemailUri),
         this::onRatingSuccess,
@@ -256,7 +255,7 @@
   public void onRatingSuccess(Uri voicemailUri) {
     LogUtil.enterBlock("PhoneCallDetailsHelper.onRatingSuccess");
     Toast toast =
-        Toast.makeText(mContext, R.string.voicemail_transcription_rating_thanks, Toast.LENGTH_LONG);
+        Toast.makeText(context, R.string.voicemail_transcription_rating_thanks, Toast.LENGTH_LONG);
     toast.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 50);
     toast.show();
   }
@@ -274,7 +273,7 @@
    * @return The call location and date string.
    */
   public CharSequence getCallLocationAndDate(PhoneCallDetails details) {
-    mDescriptionItems.clear();
+    descriptionItems.clear();
 
     if (details.callTypes[0] != Calls.VOICEMAIL_TYPE) {
       // Get type of call (ie mobile, home, etc) if known, or the caller's location.
@@ -283,15 +282,15 @@
       // Only add the call type or location if its not empty.  It will be empty for unknown
       // callers.
       if (!TextUtils.isEmpty(callTypeOrLocation)) {
-        mDescriptionItems.add(callTypeOrLocation);
+        descriptionItems.add(callTypeOrLocation);
       }
     }
 
     // The date of this call
-    mDescriptionItems.add(getCallDate(details));
+    descriptionItems.add(getCallDate(details));
 
     // Create a comma separated list from the call type or location, and call date.
-    return DialerUtils.join(mDescriptionItems);
+    return DialerUtils.join(descriptionItems);
   }
 
   /**
@@ -304,16 +303,16 @@
    */
   public CharSequence getCallTypeOrLocation(PhoneCallDetails details) {
     if (details.isSpam) {
-      return mResources.getString(R.string.spam_number_call_log_label);
+      return resources.getString(R.string.spam_number_call_log_label);
     } else if (details.isBlocked) {
-      return mResources.getString(R.string.blocked_number_call_log_label);
+      return resources.getString(R.string.blocked_number_call_log_label);
     }
 
     CharSequence numberFormattedLabel = null;
     // Only show a label if the number is shown and it is not a SIP address.
     if (!TextUtils.isEmpty(details.number)
         && !PhoneNumberHelper.isUriNumber(details.number.toString())
-        && !mCallLogCache.isVoicemailNumber(details.accountHandle, details.number)) {
+        && !callLogCache.isVoicemailNumber(details.accountHandle, details.number)) {
 
       if (shouldShowLocation(details)) {
         numberFormattedLabel = details.geocode;
@@ -321,9 +320,9 @@
           && TextUtils.isEmpty(details.numberLabel))) {
         // Get type label only if it will not be "Custom" because of an empty number label.
         numberFormattedLabel =
-            mPhoneTypeLabelForTest != null
-                ? mPhoneTypeLabelForTest
-                : Phone.getTypeLabel(mResources, details.numberType, details.numberLabel);
+            phoneTypeLabelForTest != null
+                ? phoneTypeLabelForTest
+                : Phone.getTypeLabel(resources, details.numberType, details.numberLabel);
       }
     }
 
@@ -350,7 +349,7 @@
   }
 
   public void setPhoneTypeLabelForTest(CharSequence phoneTypeLabel) {
-    this.mPhoneTypeLabelForTest = phoneTypeLabel;
+    this.phoneTypeLabelForTest = phoneTypeLabel;
   }
 
   /**
@@ -385,10 +384,10 @@
    * @return String representing when the call occurred
    */
   public CharSequence getGranularDateTime(PhoneCallDetails details) {
-    return mResources.getString(
+    return resources.getString(
         R.string.voicemailCallLogDateTimeFormat,
         getGranularDate(details.date),
-        DateUtils.formatDateTime(mContext, details.date, DateUtils.FORMAT_SHOW_TIME));
+        DateUtils.formatDateTime(context, details.date, DateUtils.FORMAT_SHOW_TIME));
   }
 
   /**
@@ -396,10 +395,10 @@
    */
   private String getGranularDate(long date) {
     if (DateUtils.isToday(date)) {
-      return mResources.getString(R.string.voicemailCallLogToday);
+      return resources.getString(R.string.voicemailCallLogToday);
     }
     return DateUtils.formatDateTime(
-        mContext,
+        context,
         date,
         DateUtils.FORMAT_SHOW_DATE
             | DateUtils.FORMAT_ABBREV_MONTH
@@ -412,10 +411,10 @@
    * @return {@code true} if date is within the current year, {@code false} otherwise
    */
   private boolean shouldShowYear(long date) {
-    mCalendar.setTimeInMillis(getCurrentTimeMillis());
-    int currentYear = mCalendar.get(Calendar.YEAR);
-    mCalendar.setTimeInMillis(date);
-    return currentYear != mCalendar.get(Calendar.YEAR);
+    calendar.setTimeInMillis(getCurrentTimeMillis());
+    int currentYear = calendar.get(Calendar.YEAR);
+    calendar.setTimeInMillis(date);
+    return currentYear != calendar.get(Calendar.YEAR);
   }
 
   /** Sets the text of the header view for the details page of a phone call. */
@@ -426,14 +425,14 @@
     } else if (!TextUtils.isEmpty(details.displayNumber)) {
       nameText = details.displayNumber;
     } else {
-      nameText = mResources.getString(R.string.unknown);
+      nameText = resources.getString(R.string.unknown);
     }
 
     nameView.setText(nameText);
   }
 
   public void setCurrentTimeForTest(long currentTimeMillis) {
-    mCurrentTimeMillisForTest = currentTimeMillis;
+    currentTimeMillisForTest = currentTimeMillis;
   }
 
   /**
@@ -442,10 +441,10 @@
    * <p>It can be injected in tests using {@link #setCurrentTimeForTest(long)}.
    */
   private long getCurrentTimeMillis() {
-    if (mCurrentTimeMillisForTest == null) {
+    if (currentTimeMillisForTest == null) {
       return System.currentTimeMillis();
     } else {
-      return mCurrentTimeMillisForTest;
+      return currentTimeMillisForTest;
     }
   }
 
@@ -456,14 +455,14 @@
     CharSequence dateText = details.callLocationAndDate;
     final CharSequence text;
     if (callCount != null) {
-      text = mResources.getString(R.string.call_log_item_count_and_date, callCount, dateText);
+      text = resources.getString(R.string.call_log_item_count_and_date, callCount, dateText);
     } else {
       text = dateText;
     }
 
     if (details.callTypes[0] == Calls.VOICEMAIL_TYPE && details.duration > 0) {
       views.callLocationAndDate.setText(
-          mResources.getString(
+          resources.getString(
               R.string.voicemailCallLogDateTimeFormatWithDuration,
               text,
               getVoicemailDuration(details)));
@@ -478,6 +477,6 @@
     if (minutes > 99) {
       minutes = 99;
     }
-    return mResources.getString(R.string.voicemailDurationFormat, minutes, seconds);
+    return resources.getString(R.string.voicemailDurationFormat, minutes, seconds);
   }
 }
diff --git a/java/com/android/dialer/app/calllog/VisualVoicemailCallLogFragment.java b/java/com/android/dialer/app/calllog/VisualVoicemailCallLogFragment.java
index 33fcba0..d38ec57 100644
--- a/java/com/android/dialer/app/calllog/VisualVoicemailCallLogFragment.java
+++ b/java/com/android/dialer/app/calllog/VisualVoicemailCallLogFragment.java
@@ -46,11 +46,11 @@
 
 public class VisualVoicemailCallLogFragment extends CallLogFragment {
 
-  private final ContentObserver mVoicemailStatusObserver = new CustomContentObserver();
-  private VoicemailPlaybackPresenter mVoicemailPlaybackPresenter;
-  private DialerExecutor<Context> mPreSyncVoicemailStatusCheckExecutor;
+  private final ContentObserver voicemailStatusObserver = new CustomContentObserver();
+  private VoicemailPlaybackPresenter voicemailPlaybackPresenter;
+  private DialerExecutor<Context> preSyncVoicemailStatusCheckExecutor;
 
-  private VoicemailErrorManager mVoicemailErrorManager;
+  private VoicemailErrorManager voicemailErrorManager;
 
   public VisualVoicemailCallLogFragment() {
     super(CallLog.Calls.VOICEMAIL_TYPE);
@@ -58,19 +58,19 @@
 
   @Override
   protected VoicemailPlaybackPresenter getVoicemailPlaybackPresenter() {
-    return mVoicemailPlaybackPresenter;
+    return voicemailPlaybackPresenter;
   }
 
   @Override
   public void onActivityCreated(Bundle savedInstanceState) {
-    mVoicemailPlaybackPresenter =
+    voicemailPlaybackPresenter =
         VoicemailPlaybackPresenter.getInstance(getActivity(), savedInstanceState);
     if (PermissionsUtil.hasReadVoicemailPermissions(getContext())
         && PermissionsUtil.hasAddVoicemailPermissions(getContext())) {
       getActivity()
           .getContentResolver()
           .registerContentObserver(
-              VoicemailContract.Status.CONTENT_URI, true, mVoicemailStatusObserver);
+              VoicemailContract.Status.CONTENT_URI, true, voicemailStatusObserver);
     } else {
       LogUtil.w(
           "VisualVoicemailCallLogFragment.onActivityCreated",
@@ -78,7 +78,7 @@
     }
     super.onActivityCreated(savedInstanceState);
 
-    mPreSyncVoicemailStatusCheckExecutor =
+    preSyncVoicemailStatusCheckExecutor =
         DialerExecutorComponent.get(getContext())
             .dialerExecutorFactory()
             .createUiTaskBuilder(
@@ -88,8 +88,8 @@
             .onSuccess(this::onPreSyncVoicemailStatusChecked)
             .build();
 
-    mVoicemailErrorManager =
-        new VoicemailErrorManager(getContext(), getAdapter().getAlertManager(), mModalAlertManager);
+    voicemailErrorManager =
+        new VoicemailErrorManager(getContext(), getAdapter().getAlertManager(), modalAlertManager);
 
     if (PermissionsUtil.hasReadVoicemailPermissions(getContext())
         && PermissionsUtil.hasAddVoicemailPermissions(getContext())) {
@@ -98,7 +98,7 @@
           .registerContentObserver(
               VoicemailContract.Status.CONTENT_URI,
               true,
-              mVoicemailErrorManager.getContentObserver());
+              voicemailErrorManager.getContentObserver());
     } else {
       LogUtil.w(
           "VisualVoicemailCallLogFragment.onActivityCreated",
@@ -116,14 +116,14 @@
   @Override
   public void onResume() {
     super.onResume();
-    mVoicemailPlaybackPresenter.onResume();
-    mVoicemailErrorManager.onResume();
+    voicemailPlaybackPresenter.onResume();
+    voicemailErrorManager.onResume();
   }
 
   @Override
   public void onPause() {
-    mVoicemailPlaybackPresenter.onPause();
-    mVoicemailErrorManager.onPause();
+    voicemailPlaybackPresenter.onPause();
+    voicemailErrorManager.onPause();
     super.onPause();
   }
 
@@ -132,10 +132,10 @@
     if (isAdded()) {
       getActivity()
           .getContentResolver()
-          .unregisterContentObserver(mVoicemailErrorManager.getContentObserver());
-      mVoicemailPlaybackPresenter.onDestroy();
-      mVoicemailErrorManager.onDestroy();
-      getActivity().getContentResolver().unregisterContentObserver(mVoicemailStatusObserver);
+          .unregisterContentObserver(voicemailErrorManager.getContentObserver());
+      voicemailPlaybackPresenter.onDestroy();
+      voicemailErrorManager.onDestroy();
+      getActivity().getContentResolver().unregisterContentObserver(voicemailStatusObserver);
     }
     super.onDestroy();
   }
@@ -143,8 +143,8 @@
   @Override
   public void onSaveInstanceState(Bundle outState) {
     super.onSaveInstanceState(outState);
-    if (mVoicemailPlaybackPresenter != null) {
-      mVoicemailPlaybackPresenter.onSaveInstanceState(outState);
+    if (voicemailPlaybackPresenter != null) {
+      voicemailPlaybackPresenter.onSaveInstanceState(outState);
     }
   }
 
@@ -159,7 +159,7 @@
     LogUtil.enterBlock("VisualVoicemailCallLogFragment.onVisible");
     super.onVisible();
     if (getActivity() != null) {
-      mPreSyncVoicemailStatusCheckExecutor.executeParallel(getActivity());
+      preSyncVoicemailStatusCheckExecutor.executeParallel(getActivity());
       Logger.get(getActivity()).logImpression(DialerImpression.Type.VVM_TAB_VIEWED);
       getActivity().setVolumeControlStream(VoicemailAudioManager.PLAYBACK_STREAM);
     }
diff --git a/java/com/android/dialer/app/calllog/calllogcache/CallLogCache.java b/java/com/android/dialer/app/calllog/calllogcache/CallLogCache.java
index 15de143..f45537c 100644
--- a/java/com/android/dialer/app/calllog/calllogcache/CallLogCache.java
+++ b/java/com/android/dialer/app/calllog/calllogcache/CallLogCache.java
@@ -42,24 +42,24 @@
   // TODO: Dialer should be fixed so as not to check isVoicemail() so often but at the time of
   // this writing, that was a much larger undertaking than creating this cache.
 
-  protected final Context mContext;
+  protected final Context context;
 
-  private boolean mHasCheckedForVideoAvailability;
-  private int mVideoAvailability;
-  private final Map<PhoneAccountHandle, String> mPhoneAccountLabelCache = new ArrayMap<>();
-  private final Map<PhoneAccountHandle, Integer> mPhoneAccountColorCache = new ArrayMap<>();
-  private final Map<PhoneAccountHandle, Boolean> mPhoneAccountCallWithNoteCache = new ArrayMap<>();
+  private boolean hasCheckedForVideoAvailability;
+  private int videoAvailability;
+  private final Map<PhoneAccountHandle, String> phoneAccountLabelCache = new ArrayMap<>();
+  private final Map<PhoneAccountHandle, Integer> phoneAccountColorCache = new ArrayMap<>();
+  private final Map<PhoneAccountHandle, Boolean> phoneAccountCallWithNoteCache = new ArrayMap<>();
 
   public CallLogCache(Context context) {
-    mContext = context;
+    this.context = context;
   }
 
   public synchronized void reset() {
-    mPhoneAccountLabelCache.clear();
-    mPhoneAccountColorCache.clear();
-    mPhoneAccountCallWithNoteCache.clear();
-    mHasCheckedForVideoAvailability = false;
-    mVideoAvailability = 0;
+    phoneAccountLabelCache.clear();
+    phoneAccountColorCache.clear();
+    phoneAccountCallWithNoteCache.clear();
+    hasCheckedForVideoAvailability = false;
+    videoAvailability = 0;
   }
 
   /**
@@ -71,7 +71,7 @@
     if (TextUtils.isEmpty(number)) {
       return false;
     }
-    return TelecomUtil.isVoicemailNumber(mContext, accountHandle, number.toString());
+    return TelecomUtil.isVoicemailNumber(context, accountHandle, number.toString());
   }
 
   /**
@@ -79,31 +79,31 @@
    * {@link android.provider.ContactsContract.CommonDataKinds.Phone#CARRIER_PRESENCE} column.
    */
   public boolean canRelyOnVideoPresence() {
-    if (!mHasCheckedForVideoAvailability) {
-      mVideoAvailability = CallUtil.getVideoCallingAvailability(mContext);
-      mHasCheckedForVideoAvailability = true;
+    if (!hasCheckedForVideoAvailability) {
+      videoAvailability = CallUtil.getVideoCallingAvailability(context);
+      hasCheckedForVideoAvailability = true;
     }
-    return (mVideoAvailability & CallUtil.VIDEO_CALLING_PRESENCE) != 0;
+    return (videoAvailability & CallUtil.VIDEO_CALLING_PRESENCE) != 0;
   }
 
   /** Extract account label from PhoneAccount object. */
   public synchronized String getAccountLabel(PhoneAccountHandle accountHandle) {
-    if (mPhoneAccountLabelCache.containsKey(accountHandle)) {
-      return mPhoneAccountLabelCache.get(accountHandle);
+    if (phoneAccountLabelCache.containsKey(accountHandle)) {
+      return phoneAccountLabelCache.get(accountHandle);
     } else {
-      String label = PhoneAccountUtils.getAccountLabel(mContext, accountHandle);
-      mPhoneAccountLabelCache.put(accountHandle, label);
+      String label = PhoneAccountUtils.getAccountLabel(context, accountHandle);
+      phoneAccountLabelCache.put(accountHandle, label);
       return label;
     }
   }
 
   /** Extract account color from PhoneAccount object. */
   public synchronized int getAccountColor(PhoneAccountHandle accountHandle) {
-    if (mPhoneAccountColorCache.containsKey(accountHandle)) {
-      return mPhoneAccountColorCache.get(accountHandle);
+    if (phoneAccountColorCache.containsKey(accountHandle)) {
+      return phoneAccountColorCache.get(accountHandle);
     } else {
-      Integer color = PhoneAccountUtils.getAccountColor(mContext, accountHandle);
-      mPhoneAccountColorCache.put(accountHandle, color);
+      Integer color = PhoneAccountUtils.getAccountColor(context, accountHandle);
+      phoneAccountColorCache.put(accountHandle, color);
       return color;
     }
   }
@@ -116,12 +116,12 @@
    * @return {@code true} if calling with a note is supported, {@code false} otherwise.
    */
   public synchronized boolean doesAccountSupportCallSubject(PhoneAccountHandle accountHandle) {
-    if (mPhoneAccountCallWithNoteCache.containsKey(accountHandle)) {
-      return mPhoneAccountCallWithNoteCache.get(accountHandle);
+    if (phoneAccountCallWithNoteCache.containsKey(accountHandle)) {
+      return phoneAccountCallWithNoteCache.get(accountHandle);
     } else {
       Boolean supportsCallWithNote =
-          PhoneAccountUtils.getAccountSupportsCallSubject(mContext, accountHandle);
-      mPhoneAccountCallWithNoteCache.put(accountHandle, supportsCallWithNote);
+          PhoneAccountUtils.getAccountSupportsCallSubject(context, accountHandle);
+      phoneAccountCallWithNoteCache.put(accountHandle, supportsCallWithNote);
       return supportsCallWithNote;
     }
   }
diff --git a/java/com/android/dialer/app/contactinfo/ContactInfoCache.java b/java/com/android/dialer/app/contactinfo/ContactInfoCache.java
index 155a6a2..3fcf40c 100644
--- a/java/com/android/dialer/app/contactinfo/ContactInfoCache.java
+++ b/java/com/android/dialer/app/contactinfo/ContactInfoCache.java
@@ -51,14 +51,14 @@
   private static final int START_THREAD = 2;
   private static final int START_PROCESSING_REQUESTS_DELAY_MS = 1000;
 
-  private final ExpirableCache<NumberWithCountryIso, ContactInfo> mCache;
-  private final ContactInfoHelper mContactInfoHelper;
-  private final OnContactInfoChangedListener mOnContactInfoChangedListener;
-  private final BlockingQueue<ContactInfoRequest> mUpdateRequests;
-  private final Handler mHandler;
-  private CequintCallerIdManager mCequintCallerIdManager;
-  private QueryThread mContactInfoQueryThread;
-  private volatile boolean mRequestProcessingDisabled = false;
+  private final ExpirableCache<NumberWithCountryIso, ContactInfo> cache;
+  private final ContactInfoHelper contactInfoHelper;
+  private final OnContactInfoChangedListener onContactInfoChangedListener;
+  private final BlockingQueue<ContactInfoRequest> updateRequests;
+  private final Handler handler;
+  private CequintCallerIdManager cequintCallerIdManager;
+  private QueryThread contactInfoQueryThread;
+  private volatile boolean requestProcessingDisabled = false;
 
   private static class InnerHandler extends Handler {
 
@@ -76,7 +76,7 @@
       }
       switch (msg.what) {
         case REDRAW:
-          reference.mOnContactInfoChangedListener.onContactInfoChanged();
+          reference.onContactInfoChangedListener.onContactInfoChanged();
           break;
         case START_THREAD:
           reference.startRequestProcessing();
@@ -90,15 +90,15 @@
       @NonNull ExpirableCache<NumberWithCountryIso, ContactInfo> internalCache,
       @NonNull ContactInfoHelper contactInfoHelper,
       @NonNull OnContactInfoChangedListener listener) {
-    mCache = internalCache;
-    mContactInfoHelper = contactInfoHelper;
-    mOnContactInfoChangedListener = listener;
-    mUpdateRequests = new PriorityBlockingQueue<>();
-    mHandler = new InnerHandler(new WeakReference<>(this));
+    cache = internalCache;
+    this.contactInfoHelper = contactInfoHelper;
+    onContactInfoChangedListener = listener;
+    updateRequests = new PriorityBlockingQueue<>();
+    handler = new InnerHandler(new WeakReference<>(this));
   }
 
   public void setCequintCallerIdManager(CequintCallerIdManager cequintCallerIdManager) {
-    mCequintCallerIdManager = cequintCallerIdManager;
+    this.cequintCallerIdManager = cequintCallerIdManager;
   }
 
   public ContactInfo getValue(
@@ -107,14 +107,14 @@
       ContactInfo callLogContactInfo,
       boolean remoteLookupIfNotFoundLocally) {
     NumberWithCountryIso numberCountryIso = new NumberWithCountryIso(number, countryIso);
-    ExpirableCache.CachedValue<ContactInfo> cachedInfo = mCache.getCachedValue(numberCountryIso);
+    ExpirableCache.CachedValue<ContactInfo> cachedInfo = cache.getCachedValue(numberCountryIso);
     ContactInfo info = cachedInfo == null ? null : cachedInfo.getValue();
     int requestType =
         remoteLookupIfNotFoundLocally
             ? ContactInfoRequest.TYPE_LOCAL_AND_REMOTE
             : ContactInfoRequest.TYPE_LOCAL;
     if (cachedInfo == null) {
-      mCache.put(numberCountryIso, ContactInfo.EMPTY);
+      cache.put(numberCountryIso, ContactInfo.EMPTY);
       // Use the cached contact info from the call log.
       info = callLogContactInfo;
       // The db request should happen on a non-UI thread.
@@ -161,18 +161,18 @@
         request.type);
     ContactInfo info;
     if (request.isLocalRequest()) {
-      info = mContactInfoHelper.lookupNumber(request.number, request.countryIso);
+      info = contactInfoHelper.lookupNumber(request.number, request.countryIso);
       if (info != null && !info.contactExists) {
         // TODO(wangqi): Maybe skip look up if it's already available in cached number lookup
         // service.
         long start = SystemClock.elapsedRealtime();
-        mContactInfoHelper.updateFromCequintCallerId(mCequintCallerIdManager, info, request.number);
+        contactInfoHelper.updateFromCequintCallerId(cequintCallerIdManager, info, request.number);
         long time = SystemClock.elapsedRealtime() - start;
         LogUtil.d(
             "ContactInfoCache.queryContactInfo", "Cequint Caller Id look up takes %d ms", time);
       }
       if (request.type == ContactInfoRequest.TYPE_LOCAL_AND_REMOTE) {
-        if (!mContactInfoHelper.hasName(info)) {
+        if (!contactInfoHelper.hasName(info)) {
           enqueueRequest(
               request.number,
               request.countryIso,
@@ -183,7 +183,7 @@
         }
       }
     } else {
-      info = mContactInfoHelper.lookupNumberInRemoteDirectory(request.number, request.countryIso);
+      info = contactInfoHelper.lookupNumberInRemoteDirectory(request.number, request.countryIso);
     }
 
     if (info == null) {
@@ -195,7 +195,7 @@
     // view.
     NumberWithCountryIso numberCountryIso =
         new NumberWithCountryIso(request.number, request.countryIso);
-    ContactInfo existingInfo = mCache.getPossiblyExpired(numberCountryIso);
+    ContactInfo existingInfo = cache.getPossiblyExpired(numberCountryIso);
 
     final boolean isRemoteSource = info.sourceType != Type.UNKNOWN_SOURCE_TYPE;
 
@@ -210,14 +210,14 @@
 
     // Store the data in the cache so that the UI thread can use to display it. Store it
     // even if it has not changed so that it is marked as not expired.
-    mCache.put(numberCountryIso, info);
+    cache.put(numberCountryIso, info);
 
     // Update the call log even if the cache it is up-to-date: it is possible that the cache
     // contains the value from a different call log entry.
-    mContactInfoHelper.updateCallLogContactInfo(
+    contactInfoHelper.updateCallLogContactInfo(
         request.number, request.countryIso, info, request.callLogInfo);
     if (!request.isLocalRequest()) {
-      mContactInfoHelper.updateCachedNumberLookupService(info);
+      contactInfoHelper.updateCachedNumberLookupService(info);
     }
     return updated;
   }
@@ -229,9 +229,9 @@
   public void start() {
     // Schedule a thread-creation message if the thread hasn't been created yet, as an
     // optimization to queue fewer messages.
-    if (mContactInfoQueryThread == null) {
+    if (contactInfoQueryThread == null) {
       // TODO: Check whether this delay before starting to process is necessary.
-      mHandler.sendEmptyMessageDelayed(START_THREAD, START_PROCESSING_REQUESTS_DELAY_MS);
+      handler.sendEmptyMessageDelayed(START_THREAD, START_PROCESSING_REQUESTS_DELAY_MS);
     }
   }
 
@@ -249,22 +249,22 @@
    */
   private synchronized void startRequestProcessing() {
     // For unit-testing.
-    if (mRequestProcessingDisabled) {
+    if (requestProcessingDisabled) {
       return;
     }
 
     // If a thread is already started, don't start another.
-    if (mContactInfoQueryThread != null) {
+    if (contactInfoQueryThread != null) {
       return;
     }
 
-    mContactInfoQueryThread = new QueryThread();
-    mContactInfoQueryThread.setPriority(Thread.MIN_PRIORITY);
-    mContactInfoQueryThread.start();
+    contactInfoQueryThread = new QueryThread();
+    contactInfoQueryThread.setPriority(Thread.MIN_PRIORITY);
+    contactInfoQueryThread.start();
   }
 
   public void invalidate() {
-    mCache.expireAll();
+    cache.expireAll();
     stopRequestProcessing();
   }
 
@@ -274,12 +274,12 @@
    */
   private synchronized void stopRequestProcessing() {
     // Remove any pending requests to start the processing thread.
-    mHandler.removeMessages(START_THREAD);
-    if (mContactInfoQueryThread != null) {
+    handler.removeMessages(START_THREAD);
+    if (contactInfoQueryThread != null) {
       // Stop the thread; we are finished with it.
-      mContactInfoQueryThread.stopProcessing();
-      mContactInfoQueryThread.interrupt();
-      mContactInfoQueryThread = null;
+      contactInfoQueryThread.stopProcessing();
+      contactInfoQueryThread.interrupt();
+      contactInfoQueryThread = null;
     }
   }
 
@@ -299,8 +299,8 @@
       boolean immediate,
       @ContactInfoRequest.TYPE int type) {
     ContactInfoRequest request = new ContactInfoRequest(number, countryIso, callLogInfo, type);
-    if (!mUpdateRequests.contains(request)) {
-      mUpdateRequests.offer(request);
+    if (!updateRequests.contains(request)) {
+      updateRequests.offer(request);
     }
 
     if (immediate) {
@@ -318,13 +318,13 @@
 
   /** Sets whether processing of requests for contact details should be enabled. */
   public void disableRequestProcessing() {
-    mRequestProcessingDisabled = true;
+    requestProcessingDisabled = true;
   }
 
   @VisibleForTesting
   public void injectContactInfoForTest(String number, String countryIso, ContactInfo contactInfo) {
     NumberWithCountryIso numberCountryIso = new NumberWithCountryIso(number, countryIso);
-    mCache.put(numberCountryIso, contactInfo);
+    cache.put(numberCountryIso, contactInfo);
   }
 
   public interface OnContactInfoChangedListener {
@@ -337,14 +337,14 @@
    */
   private class QueryThread extends Thread {
 
-    private volatile boolean mDone = false;
+    private volatile boolean done = false;
 
     public QueryThread() {
       super("ContactInfoCache.QueryThread");
     }
 
     public void stopProcessing() {
-      mDone = true;
+      done = true;
     }
 
     @Override
@@ -352,18 +352,18 @@
       boolean shouldRedraw = false;
       while (true) {
         // Check if thread is finished, and if so return immediately.
-        if (mDone) {
+        if (done) {
           return;
         }
 
         try {
-          ContactInfoRequest request = mUpdateRequests.take();
+          ContactInfoRequest request = updateRequests.take();
           shouldRedraw |= queryContactInfo(request);
           if (shouldRedraw
-              && (mUpdateRequests.isEmpty()
-                  || (request.isLocalRequest() && !mUpdateRequests.peek().isLocalRequest()))) {
+              && (updateRequests.isEmpty()
+                  || (request.isLocalRequest() && !updateRequests.peek().isLocalRequest()))) {
             shouldRedraw = false;
-            mHandler.sendEmptyMessage(REDRAW);
+            handler.sendEmptyMessage(REDRAW);
           }
         } catch (InterruptedException e) {
           // Ignore and attempt to continue processing requests
diff --git a/java/com/android/dialer/app/contactinfo/ContactPhotoLoader.java b/java/com/android/dialer/app/contactinfo/ContactPhotoLoader.java
index 537acd0..be143bb 100644
--- a/java/com/android/dialer/app/contactinfo/ContactPhotoLoader.java
+++ b/java/com/android/dialer/app/contactinfo/ContactPhotoLoader.java
@@ -43,12 +43,12 @@
  */
 public class ContactPhotoLoader {
 
-  private final Context mContext;
-  private final ContactInfo mContactInfo;
+  private final Context context;
+  private final ContactInfo contactInfo;
 
   public ContactPhotoLoader(Context context, ContactInfo contactInfo) {
-    mContext = Objects.requireNonNull(context);
-    mContactInfo = Objects.requireNonNull(contactInfo);
+    this.context = Objects.requireNonNull(context);
+    this.contactInfo = Objects.requireNonNull(contactInfo);
   }
 
   private static Bitmap drawableToBitmap(Drawable drawable, int width, int height) {
@@ -62,7 +62,7 @@
   /** Create a contact photo icon bitmap appropriate for the ContactInfo. */
   public Bitmap loadPhotoIcon() {
     Assert.isWorkerThread();
-    int photoSize = mContext.getResources().getDimensionPixelSize(R.dimen.contact_photo_size);
+    int photoSize = context.getResources().getDimensionPixelSize(R.dimen.contact_photo_size);
     return drawableToBitmap(getIcon(), photoSize, photoSize);
   }
 
@@ -81,11 +81,11 @@
    */
   @Nullable
   private Drawable createPhotoIconDrawable() {
-    if (mContactInfo.photoUri == null) {
+    if (contactInfo.photoUri == null) {
       return null;
     }
     try {
-      InputStream input = mContext.getContentResolver().openInputStream(mContactInfo.photoUri);
+      InputStream input = context.getContentResolver().openInputStream(contactInfo.photoUri);
       if (input == null) {
         LogUtil.w(
             "ContactPhotoLoader.createPhotoIconDrawable",
@@ -102,7 +102,7 @@
         return null;
       }
       final RoundedBitmapDrawable drawable =
-          RoundedBitmapDrawableFactory.create(mContext.getResources(), bitmap);
+          RoundedBitmapDrawableFactory.create(context.getResources(), bitmap);
       drawable.setAntiAlias(true);
       drawable.setCircular(true);
       return drawable;
@@ -115,13 +115,13 @@
   /** @return a {@link LetterTileDrawable} based on the ContactInfo. */
   private Drawable createLetterTileDrawable() {
     ContactInfoHelper helper =
-        new ContactInfoHelper(mContext, GeoUtil.getCurrentCountryIso(mContext));
-    LetterTileDrawable drawable = new LetterTileDrawable(mContext.getResources());
+        new ContactInfoHelper(context, GeoUtil.getCurrentCountryIso(context));
+    LetterTileDrawable drawable = new LetterTileDrawable(context.getResources());
     drawable.setCanonicalDialerLetterTileDetails(
-        mContactInfo.name,
-        mContactInfo.lookupKey,
+        contactInfo.name,
+        contactInfo.lookupKey,
         LetterTileDrawable.SHAPE_CIRCLE,
-        helper.isBusiness(mContactInfo.sourceType)
+        helper.isBusiness(contactInfo.sourceType)
             ? LetterTileDrawable.TYPE_BUSINESS
             : LetterTileDrawable.TYPE_DEFAULT);
     return drawable;
diff --git a/java/com/android/dialer/app/filterednumber/BlockedNumbersFragment.java b/java/com/android/dialer/app/filterednumber/BlockedNumbersFragment.java
index 36afe54..cae35d5 100644
--- a/java/com/android/dialer/app/filterednumber/BlockedNumbersFragment.java
+++ b/java/com/android/dialer/app/filterednumber/BlockedNumbersFragment.java
@@ -53,11 +53,11 @@
   private BlockedNumbersMigrator blockedNumbersMigratorForTest;
   private TextView blockedNumbersText;
   private TextView footerText;
-  private BlockedNumbersAdapter mAdapter;
-  private VisualVoicemailEnabledChecker mVoicemailEnabledChecker;
-  private View mImportSettings;
-  private View mBlockedNumbersDisabledForEmergency;
-  private View mBlockedNumberListDivider;
+  private BlockedNumbersAdapter adapter;
+  private VisualVoicemailEnabledChecker voicemailEnabledChecker;
+  private View importSettings;
+  private View blockedNumbersDisabledForEmergency;
+  private View blockedNumberListDivider;
 
   @Override
   public Context getContext() {
@@ -81,27 +81,27 @@
     drawable.setIsCircular(true);
     addNumberIcon.setImageDrawable(drawable);
 
-    if (mAdapter == null) {
-      mAdapter =
+    if (adapter == null) {
+      adapter =
           BlockedNumbersAdapter.newBlockedNumbersAdapter(
               getContext(), getActivity().getFragmentManager());
     }
-    setListAdapter(mAdapter);
+    setListAdapter(adapter);
 
     blockedNumbersText = (TextView) getListView().findViewById(R.id.blocked_number_text_view);
     migratePromoView = getListView().findViewById(R.id.migrate_promo);
     getListView().findViewById(R.id.migrate_promo_allow_button).setOnClickListener(this);
-    mImportSettings = getListView().findViewById(R.id.import_settings);
-    mBlockedNumbersDisabledForEmergency =
+    importSettings = getListView().findViewById(R.id.import_settings);
+    blockedNumbersDisabledForEmergency =
         getListView().findViewById(R.id.blocked_numbers_disabled_for_emergency);
-    mBlockedNumberListDivider = getActivity().findViewById(R.id.blocked_number_list_divider);
+    blockedNumberListDivider = getActivity().findViewById(R.id.blocked_number_list_divider);
     getListView().findViewById(R.id.import_button).setOnClickListener(this);
     getListView().findViewById(R.id.view_numbers_button).setOnClickListener(this);
     getListView().findViewById(R.id.add_number_linear_layout).setOnClickListener(this);
 
     footerText = (TextView) getActivity().findViewById(R.id.blocked_number_footer_textview);
-    mVoicemailEnabledChecker = new VisualVoicemailEnabledChecker(getContext(), this);
-    mVoicemailEnabledChecker.asyncUpdate();
+    voicemailEnabledChecker = new VisualVoicemailEnabledChecker(getContext(), this);
+    voicemailEnabledChecker.asyncUpdate();
     updateActiveVoicemailProvider();
   }
 
@@ -139,11 +139,11 @@
       blockedNumbersText.setVisibility(View.GONE);
       getListView().findViewById(R.id.add_number_linear_layout).setVisibility(View.GONE);
       getListView().findViewById(R.id.add_number_linear_layout).setOnClickListener(null);
-      mBlockedNumberListDivider.setVisibility(View.GONE);
-      mImportSettings.setVisibility(View.GONE);
+      blockedNumberListDivider.setVisibility(View.GONE);
+      importSettings.setVisibility(View.GONE);
       getListView().findViewById(R.id.import_button).setOnClickListener(null);
       getListView().findViewById(R.id.view_numbers_button).setOnClickListener(null);
-      mBlockedNumbersDisabledForEmergency.setVisibility(View.GONE);
+      blockedNumbersDisabledForEmergency.setVisibility(View.GONE);
       footerText.setVisibility(View.GONE);
     } else {
       FilteredNumbersUtil.checkForSendToVoicemailContact(
@@ -152,7 +152,7 @@
             @Override
             public void onComplete(boolean hasSendToVoicemailContact) {
               final int visibility = hasSendToVoicemailContact ? View.VISIBLE : View.GONE;
-              mImportSettings.setVisibility(visibility);
+              importSettings.setVisibility(visibility);
             }
           });
     }
@@ -160,12 +160,12 @@
     // All views except migrate and the block list are hidden when new filtering is available
     if (!FilteredNumberCompat.canUseNewFiltering()
         && FilteredNumbersUtil.hasRecentEmergencyCall(getContext())) {
-      mBlockedNumbersDisabledForEmergency.setVisibility(View.VISIBLE);
+      blockedNumbersDisabledForEmergency.setVisibility(View.VISIBLE);
     } else {
-      mBlockedNumbersDisabledForEmergency.setVisibility(View.GONE);
+      blockedNumbersDisabledForEmergency.setVisibility(View.GONE);
     }
 
-    mVoicemailEnabledChecker.asyncUpdate();
+    voicemailEnabledChecker.asyncUpdate();
   }
 
   @Override
@@ -197,17 +197,17 @@
 
   @Override
   public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
-    mAdapter.swapCursor(data);
+    adapter.swapCursor(data);
     if (FilteredNumberCompat.canUseNewFiltering() || data.getCount() == 0) {
-      mBlockedNumberListDivider.setVisibility(View.INVISIBLE);
+      blockedNumberListDivider.setVisibility(View.INVISIBLE);
     } else {
-      mBlockedNumberListDivider.setVisibility(View.VISIBLE);
+      blockedNumberListDivider.setVisibility(View.VISIBLE);
     }
   }
 
   @Override
   public void onLoaderReset(Loader<Cursor> loader) {
-    mAdapter.swapCursor(null);
+    adapter.swapCursor(null);
   }
 
   @Override
@@ -228,7 +228,7 @@
           new ImportSendToVoicemailContactsListener() {
             @Override
             public void onImportComplete() {
-              mImportSettings.setVisibility(View.GONE);
+              importSettings.setVisibility(View.GONE);
             }
           });
     } else if (resId == R.id.migrate_promo_allow_button) {
@@ -259,7 +259,7 @@
     if (getActivity() == null || getActivity().isFinishing()) {
       return;
     }
-    if (mVoicemailEnabledChecker.isVisualVoicemailEnabled()) {
+    if (voicemailEnabledChecker.isVisualVoicemailEnabled()) {
       footerText.setText(R.string.block_number_footer_message_vvm);
     } else {
       footerText.setText(R.string.block_number_footer_message_no_vvm);
diff --git a/java/com/android/dialer/app/filterednumber/NumbersAdapter.java b/java/com/android/dialer/app/filterednumber/NumbersAdapter.java
index bdd6dce..3acb204 100644
--- a/java/com/android/dialer/app/filterednumber/NumbersAdapter.java
+++ b/java/com/android/dialer/app/filterednumber/NumbersAdapter.java
@@ -39,11 +39,11 @@
 /** TODO(calderwoodra): documentation */
 public class NumbersAdapter extends SimpleCursorAdapter {
 
-  private final Context mContext;
-  private final FragmentManager mFragmentManager;
-  private final ContactInfoHelper mContactInfoHelper;
-  private final BidiFormatter mBidiFormatter = BidiFormatter.getInstance();
-  private final ContactPhotoManager mContactPhotoManager;
+  private final Context context;
+  private final FragmentManager fragmentManager;
+  private final ContactInfoHelper contactInfoHelper;
+  private final BidiFormatter bidiFormatter = BidiFormatter.getInstance();
+  private final ContactPhotoManager contactPhotoManager;
 
   public NumbersAdapter(
       Context context,
@@ -51,10 +51,10 @@
       ContactInfoHelper contactInfoHelper,
       ContactPhotoManager contactPhotoManager) {
     super(context, R.layout.blocked_number_item, null, new String[] {}, new int[] {}, 0);
-    mContext = context;
-    mFragmentManager = fragmentManager;
-    mContactInfoHelper = contactInfoHelper;
-    mContactPhotoManager = contactPhotoManager;
+    this.context = context;
+    this.fragmentManager = fragmentManager;
+    this.contactInfoHelper = contactInfoHelper;
+    this.contactPhotoManager = contactPhotoManager;
   }
 
   public void updateView(View view, String number, String countryIso) {
@@ -67,7 +67,7 @@
       quickContactBadge.setPrioritizedMimeType(Phone.CONTENT_ITEM_TYPE);
     }
 
-    ContactInfo info = mContactInfoHelper.lookupNumber(number, countryIso);
+    ContactInfo info = contactInfoHelper.lookupNumber(number, countryIso);
     if (info == null) {
       info = new ContactInfo();
       info.number = number;
@@ -75,7 +75,7 @@
     final CharSequence locationOrType = getNumberTypeOrLocation(info, countryIso);
     final String displayNumber = getDisplayNumber(info);
     final String displayNumberStr =
-        mBidiFormatter.unicodeWrap(displayNumber, TextDirectionHeuristics.LTR);
+        bidiFormatter.unicodeWrap(displayNumber, TextDirectionHeuristics.LTR);
 
     String nameForDefaultImage;
     if (!TextUtils.isEmpty(info.name)) {
@@ -99,15 +99,15 @@
     final String lookupKey =
         info.lookupUri == null ? null : UriUtils.getLookupKeyFromUri(info.lookupUri);
     final int contactType =
-        mContactInfoHelper.isBusiness(info.sourceType)
+        contactInfoHelper.isBusiness(info.sourceType)
             ? LetterTileDrawable.TYPE_BUSINESS
             : LetterTileDrawable.TYPE_DEFAULT;
     final DefaultImageRequest request =
         new DefaultImageRequest(displayName, lookupKey, contactType, true /* isCircular */);
     badge.assignContactUri(info.lookupUri);
     badge.setContentDescription(
-        mContext.getResources().getString(R.string.description_contact_details, displayName));
-    mContactPhotoManager.loadDirectoryPhoto(
+        context.getResources().getString(R.string.description_contact_details, displayName));
+    contactPhotoManager.loadDirectoryPhoto(
         badge, info.photoUri, false /* darkTheme */, true /* isCircular */, request);
   }
 
@@ -124,17 +124,17 @@
   private CharSequence getNumberTypeOrLocation(ContactInfo info, String countryIso) {
     if (!TextUtils.isEmpty(info.name)) {
       return ContactsContract.CommonDataKinds.Phone.getTypeLabel(
-          mContext.getResources(), info.type, info.label);
+          context.getResources(), info.type, info.label);
     } else {
-      return PhoneNumberHelper.getGeoDescription(mContext, info.number, countryIso);
+      return PhoneNumberHelper.getGeoDescription(context, info.number, countryIso);
     }
   }
 
   protected Context getContext() {
-    return mContext;
+    return context;
   }
 
   protected FragmentManager getFragmentManager() {
-    return mFragmentManager;
+    return fragmentManager;
   }
 }
diff --git a/java/com/android/dialer/app/filterednumber/ViewNumbersToImportFragment.java b/java/com/android/dialer/app/filterednumber/ViewNumbersToImportFragment.java
index 1de7682..be3ae79 100644
--- a/java/com/android/dialer/app/filterednumber/ViewNumbersToImportFragment.java
+++ b/java/com/android/dialer/app/filterednumber/ViewNumbersToImportFragment.java
@@ -36,7 +36,7 @@
 public class ViewNumbersToImportFragment extends ListFragment
     implements LoaderManager.LoaderCallbacks<Cursor>, View.OnClickListener {
 
-  private ViewNumbersToImportAdapter mAdapter;
+  private ViewNumbersToImportAdapter adapter;
 
   @Override
   public Context getContext() {
@@ -47,12 +47,12 @@
   public void onActivityCreated(Bundle savedInstanceState) {
     super.onActivityCreated(savedInstanceState);
 
-    if (mAdapter == null) {
-      mAdapter =
+    if (adapter == null) {
+      adapter =
           ViewNumbersToImportAdapter.newViewNumbersToImportAdapter(
               getContext(), getActivity().getFragmentManager());
     }
-    setListAdapter(mAdapter);
+    setListAdapter(adapter);
   }
 
   @Override
@@ -103,12 +103,12 @@
 
   @Override
   public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
-    mAdapter.swapCursor(data);
+    adapter.swapCursor(data);
   }
 
   @Override
   public void onLoaderReset(Loader<Cursor> loader) {
-    mAdapter.swapCursor(null);
+    adapter.swapCursor(null);
   }
 
   @Override
diff --git a/java/com/android/dialer/app/list/AllContactsFragment.java b/java/com/android/dialer/app/list/AllContactsFragment.java
index 32a99e7..5076fd9 100644
--- a/java/com/android/dialer/app/list/AllContactsFragment.java
+++ b/java/com/android/dialer/app/list/AllContactsFragment.java
@@ -56,13 +56,13 @@
 
   private static final int READ_CONTACTS_PERMISSION_REQUEST_CODE = 1;
 
-  private EmptyContentView mEmptyListView;
+  private EmptyContentView emptyListView;
 
   /**
    * Listen to broadcast events about permissions in order to be notified if the READ_CONTACTS
    * permission is granted via the UI in another fragment.
    */
-  private BroadcastReceiver mReadContactsPermissionGrantedReceiver =
+  private BroadcastReceiver readContactsPermissionGrantedReceiver =
       new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
@@ -83,25 +83,25 @@
   public void onViewCreated(View view, android.os.Bundle savedInstanceState) {
     super.onViewCreated(view, savedInstanceState);
 
-    mEmptyListView = (EmptyContentView) view.findViewById(R.id.empty_list_view);
-    mEmptyListView.setImage(R.drawable.empty_contacts);
-    mEmptyListView.setDescription(R.string.all_contacts_empty);
-    mEmptyListView.setActionClickedListener(this);
-    getListView().setEmptyView(mEmptyListView);
-    mEmptyListView.setVisibility(View.GONE);
+    emptyListView = (EmptyContentView) view.findViewById(R.id.empty_list_view);
+    emptyListView.setImage(R.drawable.empty_contacts);
+    emptyListView.setDescription(R.string.all_contacts_empty);
+    emptyListView.setActionClickedListener(this);
+    getListView().setEmptyView(emptyListView);
+    emptyListView.setVisibility(View.GONE);
   }
 
   @Override
   public void onStart() {
     super.onStart();
     PermissionsUtil.registerPermissionReceiver(
-        getActivity(), mReadContactsPermissionGrantedReceiver, READ_CONTACTS);
+        getActivity(), readContactsPermissionGrantedReceiver, READ_CONTACTS);
   }
 
   @Override
   public void onStop() {
     PermissionsUtil.unregisterPermissionReceiver(
-        getActivity(), mReadContactsPermissionGrantedReceiver);
+        getActivity(), readContactsPermissionGrantedReceiver);
     super.onStop();
   }
 
@@ -109,12 +109,12 @@
   protected void startLoading() {
     if (PermissionsUtil.hasPermission(getActivity(), READ_CONTACTS)) {
       super.startLoading();
-      mEmptyListView.setDescription(R.string.all_contacts_empty);
-      mEmptyListView.setActionLabel(R.string.all_contacts_empty_add_contact_action);
+      emptyListView.setDescription(R.string.all_contacts_empty);
+      emptyListView.setActionLabel(R.string.all_contacts_empty_add_contact_action);
     } else {
-      mEmptyListView.setDescription(R.string.permission_no_contacts);
-      mEmptyListView.setActionLabel(R.string.permission_single_turn_on);
-      mEmptyListView.setVisibility(View.VISIBLE);
+      emptyListView.setDescription(R.string.permission_no_contacts);
+      emptyListView.setActionLabel(R.string.permission_single_turn_on);
+      emptyListView.setVisibility(View.VISIBLE);
     }
   }
 
@@ -123,7 +123,7 @@
     super.onLoadFinished(loader, data);
 
     if (data == null || data.getCount() == 0) {
-      mEmptyListView.setVisibility(View.VISIBLE);
+      emptyListView.setVisibility(View.VISIBLE);
     }
   }
 
diff --git a/java/com/android/dialer/app/list/BlockedListSearchAdapter.java b/java/com/android/dialer/app/list/BlockedListSearchAdapter.java
index 96d02d7..575d6e6 100644
--- a/java/com/android/dialer/app/list/BlockedListSearchAdapter.java
+++ b/java/com/android/dialer/app/list/BlockedListSearchAdapter.java
@@ -27,26 +27,26 @@
 /** List adapter to display search results for adding a blocked number. */
 public class BlockedListSearchAdapter extends RegularSearchListAdapter {
 
-  private Resources mResources;
-  private FilteredNumberAsyncQueryHandler mFilteredNumberAsyncQueryHandler;
+  private Resources resources;
+  private FilteredNumberAsyncQueryHandler filteredNumberAsyncQueryHandler;
 
   public BlockedListSearchAdapter(Context context) {
     super(context);
-    mResources = context.getResources();
+    resources = context.getResources();
     disableAllShortcuts();
     setShortcutEnabled(SHORTCUT_BLOCK_NUMBER, true);
 
-    mFilteredNumberAsyncQueryHandler = new FilteredNumberAsyncQueryHandler(context);
+    filteredNumberAsyncQueryHandler = new FilteredNumberAsyncQueryHandler(context);
   }
 
   @Override
   protected boolean isChanged(boolean showNumberShortcuts) {
-    return setShortcutEnabled(SHORTCUT_BLOCK_NUMBER, showNumberShortcuts || mIsQuerySipAddress);
+    return setShortcutEnabled(SHORTCUT_BLOCK_NUMBER, showNumberShortcuts || isQuerySipAddress);
   }
 
   public void setViewBlocked(ContactListItemView view, Integer id) {
     view.setTag(R.id.block_id, id);
-    final int textColor = mResources.getColor(R.color.blocked_number_block_color);
+    final int textColor = resources.getColor(R.color.blocked_number_block_color);
     view.getDataView().setTextColor(textColor);
     view.getLabelView().setTextColor(textColor);
     //TODO: Add icon
@@ -54,7 +54,7 @@
 
   public void setViewUnblocked(ContactListItemView view) {
     view.setTag(R.id.block_id, null);
-    final int textColor = mResources.getColor(R.color.dialer_secondary_text_color);
+    final int textColor = resources.getColor(R.color.dialer_secondary_text_color);
     view.getDataView().setTextColor(textColor);
     view.getLabelView().setTextColor(textColor);
     //TODO: Remove icon
@@ -79,6 +79,6 @@
             }
           }
         };
-    mFilteredNumberAsyncQueryHandler.isBlockedNumber(onCheckListener, number, countryIso);
+    filteredNumberAsyncQueryHandler.isBlockedNumber(onCheckListener, number, countryIso);
   }
 }
diff --git a/java/com/android/dialer/app/list/BlockedListSearchFragment.java b/java/com/android/dialer/app/list/BlockedListSearchFragment.java
index bef5af7..de9dbae 100644
--- a/java/com/android/dialer/app/list/BlockedListSearchFragment.java
+++ b/java/com/android/dialer/app/list/BlockedListSearchFragment.java
@@ -44,7 +44,7 @@
 public class BlockedListSearchFragment extends RegularSearchFragment
     implements BlockNumberDialogFragment.Callback {
 
-  private final TextWatcher mPhoneSearchQueryTextListener =
+  private final TextWatcher phoneSearchQueryTextListener =
       new TextWatcher() {
         @Override
         public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@@ -57,7 +57,7 @@
         @Override
         public void afterTextChanged(Editable s) {}
       };
-  private final SearchEditTextLayout.Callback mSearchLayoutCallback =
+  private final SearchEditTextLayout.Callback searchLayoutCallback =
       new SearchEditTextLayout.Callback() {
         @Override
         public void onBackButtonClicked() {
@@ -67,8 +67,8 @@
         @Override
         public void onSearchViewClicked() {}
       };
-  private FilteredNumberAsyncQueryHandler mFilteredNumberAsyncQueryHandler;
-  private EditText mSearchView;
+  private FilteredNumberAsyncQueryHandler filteredNumberAsyncQueryHandler;
+  private EditText searchView;
 
   @Override
   public void onCreate(Bundle savedInstanceState) {
@@ -83,7 +83,7 @@
      * query, which results in showing an empty view
      */
     setQueryString(getQueryString() == null ? "" : getQueryString());
-    mFilteredNumberAsyncQueryHandler = new FilteredNumberAsyncQueryHandler(getContext());
+    filteredNumberAsyncQueryHandler = new FilteredNumberAsyncQueryHandler(getContext());
   }
 
   @Override
@@ -99,23 +99,23 @@
     final SearchEditTextLayout searchEditTextLayout =
         (SearchEditTextLayout) actionBar.getCustomView().findViewById(R.id.search_view_container);
     searchEditTextLayout.expand(false, true);
-    searchEditTextLayout.setCallback(mSearchLayoutCallback);
+    searchEditTextLayout.setCallback(searchLayoutCallback);
     searchEditTextLayout.setBackgroundDrawable(null);
 
-    mSearchView = (EditText) searchEditTextLayout.findViewById(R.id.search_view);
-    mSearchView.addTextChangedListener(mPhoneSearchQueryTextListener);
-    mSearchView.setHint(R.string.block_number_search_hint);
+    searchView = (EditText) searchEditTextLayout.findViewById(R.id.search_view);
+    searchView.addTextChangedListener(phoneSearchQueryTextListener);
+    searchView.setHint(R.string.block_number_search_hint);
 
     searchEditTextLayout
         .findViewById(R.id.search_box_expanded)
         .setBackgroundColor(getContext().getResources().getColor(android.R.color.white));
 
     if (!TextUtils.isEmpty(getQueryString())) {
-      mSearchView.setText(getQueryString());
+      searchView.setText(getQueryString());
     }
 
     // TODO: Don't set custom text size; use default search text size.
-    mSearchView.setTextSize(
+    searchView.setTextSize(
         TypedValue.COMPLEX_UNIT_PX,
         getResources().getDimension(R.dimen.blocked_number_search_text_size));
   }
@@ -195,7 +195,7 @@
             }
           }
         };
-    mFilteredNumberAsyncQueryHandler.isBlockedNumber(onCheckListener, number, countryIso);
+    filteredNumberAsyncQueryHandler.isBlockedNumber(onCheckListener, number, countryIso);
   }
 
   @Override
diff --git a/java/com/android/dialer/app/list/ContentChangedFilter.java b/java/com/android/dialer/app/list/ContentChangedFilter.java
index 663846d..8c532ba 100644
--- a/java/com/android/dialer/app/list/ContentChangedFilter.java
+++ b/java/com/android/dialer/app/list/ContentChangedFilter.java
@@ -29,12 +29,12 @@
  */
 public class ContentChangedFilter extends AccessibilityDelegate {
 
-  //the view we don't want TYPE_WINDOW_CONTENT_CHANGED to fire.
-  private View mView;
+  // the view we don't want TYPE_WINDOW_CONTENT_CHANGED to fire.
+  private View view;
 
   private ContentChangedFilter(View view) {
     super();
-    mView = view;
+    this.view = view;
   }
 
   /** Add this delegate to the parent of @param view to filter out TYPE_WINDOW_CONTENT_CHANGED */
@@ -46,7 +46,7 @@
   @Override
   public boolean onRequestSendAccessibilityEvent(
       ViewGroup host, View child, AccessibilityEvent event) {
-    if (child == mView) {
+    if (child == view) {
       if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED) {
         return false;
       }
diff --git a/java/com/android/dialer/app/list/DialerPhoneNumberListAdapter.java b/java/com/android/dialer/app/list/DialerPhoneNumberListAdapter.java
index fc0bd3c..3711e6e 100644
--- a/java/com/android/dialer/app/list/DialerPhoneNumberListAdapter.java
+++ b/java/com/android/dialer/app/list/DialerPhoneNumberListAdapter.java
@@ -49,16 +49,16 @@
   public static final int SHORTCUT_BLOCK_NUMBER = 5;
   public static final int SHORTCUT_COUNT = 6;
 
-  private final boolean[] mShortcutEnabled = new boolean[SHORTCUT_COUNT];
-  private final BidiFormatter mBidiFormatter = BidiFormatter.getInstance();
-  private final String mCountryIso;
+  private final boolean[] shortcutEnabled = new boolean[SHORTCUT_COUNT];
+  private final BidiFormatter bidiFormatter = BidiFormatter.getInstance();
+  private final String countryIso;
 
-  private String mFormattedQueryString;
+  private String formattedQueryString;
 
   public DialerPhoneNumberListAdapter(Context context) {
     super(context);
 
-    mCountryIso = GeoUtil.getCurrentCountryIso(context);
+    countryIso = GeoUtil.getCurrentCountryIso(context);
   }
 
   @Override
@@ -69,8 +69,8 @@
   /** @return The number of enabled shortcuts. Ranges from 0 to a maximum of SHORTCUT_COUNT */
   public int getShortcutCount() {
     int count = 0;
-    for (int i = 0; i < mShortcutEnabled.length; i++) {
-      if (mShortcutEnabled[i]) {
+    for (int i = 0; i < shortcutEnabled.length; i++) {
+      if (shortcutEnabled[i]) {
         count++;
       }
     }
@@ -78,8 +78,8 @@
   }
 
   public void disableAllShortcuts() {
-    for (int i = 0; i < mShortcutEnabled.length; i++) {
-      mShortcutEnabled[i] = false;
+    for (int i = 0; i < shortcutEnabled.length; i++) {
+      shortcutEnabled[i] = false;
     }
   }
 
@@ -137,8 +137,8 @@
     if (shortcutCount >= 0) {
       // Iterate through the array of shortcuts, looking only for shortcuts where
       // mShortcutEnabled[i] is true
-      for (int i = 0; shortcutCount >= 0 && i < mShortcutEnabled.length; i++) {
-        if (mShortcutEnabled[i]) {
+      for (int i = 0; shortcutCount >= 0 && i < shortcutEnabled.length; i++) {
+        if (shortcutEnabled[i]) {
           shortcutCount--;
           if (shortcutCount < 0) {
             return i;
@@ -177,7 +177,7 @@
             ContactDisplayUtils.getTtsSpannedPhoneNumber(
                 resources,
                 R.string.search_shortcut_call_number,
-                mBidiFormatter.unicodeWrap(number, TextDirectionHeuristics.LTR));
+                bidiFormatter.unicodeWrap(number, TextDirectionHeuristics.LTR));
         drawable = ContextCompat.getDrawable(getContext(), R.drawable.quantum_ic_call_vd_theme_24);
         break;
       case SHORTCUT_CREATE_NEW_CONTACT:
@@ -216,19 +216,19 @@
 
   /** @return True if the shortcut state (disabled vs enabled) was changed by this operation */
   public boolean setShortcutEnabled(int shortcutType, boolean visible) {
-    final boolean changed = mShortcutEnabled[shortcutType] != visible;
-    mShortcutEnabled[shortcutType] = visible;
+    final boolean changed = shortcutEnabled[shortcutType] != visible;
+    shortcutEnabled[shortcutType] = visible;
     return changed;
   }
 
   public String getFormattedQueryString() {
-    return mFormattedQueryString;
+    return formattedQueryString;
   }
 
   @Override
   public void setQueryString(String queryString) {
-    mFormattedQueryString =
-        PhoneNumberUtils.formatNumber(PhoneNumberUtils.normalizeNumber(queryString), mCountryIso);
+    formattedQueryString =
+        PhoneNumberUtils.formatNumber(PhoneNumberUtils.normalizeNumber(queryString), countryIso);
     super.setQueryString(queryString);
   }
 }
diff --git a/java/com/android/dialer/app/list/DragDropController.java b/java/com/android/dialer/app/list/DragDropController.java
index c22dd13..458e31e 100644
--- a/java/com/android/dialer/app/list/DragDropController.java
+++ b/java/com/android/dialer/app/list/DragDropController.java
@@ -28,12 +28,12 @@
  */
 public class DragDropController {
 
-  private final List<OnDragDropListener> mOnDragDropListeners = new ArrayList<OnDragDropListener>();
-  private final DragItemContainer mDragItemContainer;
-  private final int[] mLocationOnScreen = new int[2];
+  private final List<OnDragDropListener> onDragDropListeners = new ArrayList<OnDragDropListener>();
+  private final DragItemContainer dragItemContainer;
+  private final int[] locationOnScreen = new int[2];
 
   public DragDropController(DragItemContainer dragItemContainer) {
-    mDragItemContainer = dragItemContainer;
+    this.dragItemContainer = dragItemContainer;
   }
 
   /** @return True if the drag is started, false if the drag is cancelled for some reason. */
@@ -43,54 +43,53 @@
     // The coordinates in dragEvent of DragEvent.ACTION_DRAG_STARTED before NYC is window-related.
     // This is fixed in NYC.
     if (VERSION.SDK_INT >= VERSION_CODES.N) {
-      v.getLocationOnScreen(mLocationOnScreen);
-      screenX = x + mLocationOnScreen[0];
-      screenY = y + mLocationOnScreen[1];
+      v.getLocationOnScreen(locationOnScreen);
+      screenX = x + locationOnScreen[0];
+      screenY = y + locationOnScreen[1];
     }
     final PhoneFavoriteSquareTileView tileView =
-        mDragItemContainer.getViewForLocation(screenX, screenY);
+        dragItemContainer.getViewForLocation(screenX, screenY);
     if (tileView == null) {
       return false;
     }
-    for (int i = 0; i < mOnDragDropListeners.size(); i++) {
-      mOnDragDropListeners.get(i).onDragStarted(screenX, screenY, tileView);
+    for (int i = 0; i < onDragDropListeners.size(); i++) {
+      onDragDropListeners.get(i).onDragStarted(screenX, screenY, tileView);
     }
 
     return true;
   }
 
   public void handleDragHovered(View v, int x, int y) {
-    v.getLocationOnScreen(mLocationOnScreen);
-    final int screenX = x + mLocationOnScreen[0];
-    final int screenY = y + mLocationOnScreen[1];
-    final PhoneFavoriteSquareTileView view =
-        mDragItemContainer.getViewForLocation(screenX, screenY);
-    for (int i = 0; i < mOnDragDropListeners.size(); i++) {
-      mOnDragDropListeners.get(i).onDragHovered(screenX, screenY, view);
+    v.getLocationOnScreen(locationOnScreen);
+    final int screenX = x + locationOnScreen[0];
+    final int screenY = y + locationOnScreen[1];
+    final PhoneFavoriteSquareTileView view = dragItemContainer.getViewForLocation(screenX, screenY);
+    for (int i = 0; i < onDragDropListeners.size(); i++) {
+      onDragDropListeners.get(i).onDragHovered(screenX, screenY, view);
     }
   }
 
   public void handleDragFinished(int x, int y, boolean isRemoveView) {
     if (isRemoveView) {
-      for (int i = 0; i < mOnDragDropListeners.size(); i++) {
-        mOnDragDropListeners.get(i).onDroppedOnRemove();
+      for (int i = 0; i < onDragDropListeners.size(); i++) {
+        onDragDropListeners.get(i).onDroppedOnRemove();
       }
     }
 
-    for (int i = 0; i < mOnDragDropListeners.size(); i++) {
-      mOnDragDropListeners.get(i).onDragFinished(x, y);
+    for (int i = 0; i < onDragDropListeners.size(); i++) {
+      onDragDropListeners.get(i).onDragFinished(x, y);
     }
   }
 
   public void addOnDragDropListener(OnDragDropListener listener) {
-    if (!mOnDragDropListeners.contains(listener)) {
-      mOnDragDropListeners.add(listener);
+    if (!onDragDropListeners.contains(listener)) {
+      onDragDropListeners.add(listener);
     }
   }
 
   public void removeOnDragDropListener(OnDragDropListener listener) {
-    if (mOnDragDropListeners.contains(listener)) {
-      mOnDragDropListeners.remove(listener);
+    if (onDragDropListeners.contains(listener)) {
+      onDragDropListeners.remove(listener);
     }
   }
 
diff --git a/java/com/android/dialer/app/list/ListsFragment.java b/java/com/android/dialer/app/list/ListsFragment.java
index 05c647a..7c24cc0 100644
--- a/java/com/android/dialer/app/list/ListsFragment.java
+++ b/java/com/android/dialer/app/list/ListsFragment.java
@@ -63,21 +63,21 @@
 
   private static final String TAG = "ListsFragment";
 
-  private DialerViewPager mViewPager;
-  private ViewPagerTabs mViewPagerTabs;
-  private DialtactsPagerAdapter mAdapter;
-  private RemoveView mRemoveView;
-  private View mRemoveViewContent;
-  private Fragment mCurrentPage;
-  private SharedPreferences mPrefs;
-  private boolean mHasFetchedVoicemailStatus;
-  private boolean mShowVoicemailTabAfterVoicemailStatusIsFetched;
-  private final ArrayList<OnPageChangeListener> mOnPageChangeListeners = new ArrayList<>();
+  private DialerViewPager viewPager;
+  private ViewPagerTabs viewPagerTabs;
+  private DialtactsPagerAdapter adapter;
+  private RemoveView removeView;
+  private View removeViewContent;
+  private Fragment currentPage;
+  private SharedPreferences prefs;
+  private boolean hasFetchedVoicemailStatus;
+  private boolean showVoicemailTabAfterVoicemailStatusIsFetched;
+  private final ArrayList<OnPageChangeListener> onPageChangeListeners = new ArrayList<>();
   /** The position of the currently selected tab. */
-  private int mTabIndex = DialtactsPagerAdapter.TAB_INDEX_SPEED_DIAL;
+  private int tabIndex = DialtactsPagerAdapter.TAB_INDEX_SPEED_DIAL;
 
-  private boolean mPaused;
-  private CallLogQueryHandler mCallLogQueryHandler;
+  private boolean paused;
+  private CallLogQueryHandler callLogQueryHandler;
 
   private UiAction.Type[] actionTypeList;
   private final DialerImpression.Type[] swipeImpressionList =
@@ -88,12 +88,12 @@
   // Only for detecting page selected by swiping or clicking.
   private boolean onPageScrolledBeforeScrollStateSettling;
 
-  private final ContentObserver mVoicemailStatusObserver =
+  private final ContentObserver voicemailStatusObserver =
       new ContentObserver(new Handler()) {
         @Override
         public void onChange(boolean selfChange) {
           super.onChange(selfChange);
-          mCallLogQueryHandler.fetchVoicemailStatus();
+          callLogQueryHandler.fetchVoicemailStatus();
         }
       };
 
@@ -102,7 +102,7 @@
     LogUtil.d("ListsFragment.onCreate", null);
     Trace.beginSection(TAG + " onCreate");
     super.onCreate(savedInstanceState);
-    mPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext());
+    prefs = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext());
     Trace.endSection();
   }
 
@@ -112,19 +112,19 @@
     Trace.beginSection(TAG + " onResume");
     super.onResume();
 
-    mPaused = false;
+    paused = false;
 
     if (getUserVisibleHint()) {
       sendScreenViewForCurrentPosition();
     }
 
     // Fetch voicemail status to determine if we should show the voicemail tab.
-    mCallLogQueryHandler =
+    callLogQueryHandler =
         new CallLogQueryHandler(getActivity(), getActivity().getContentResolver(), this);
-    mCallLogQueryHandler.fetchVoicemailStatus();
-    mCallLogQueryHandler.fetchMissedCallsUnreadCount();
+    callLogQueryHandler.fetchVoicemailStatus();
+    callLogQueryHandler.fetchMissedCallsUnreadCount();
     Trace.endSection();
-    mCurrentPage = mAdapter.getItem(mViewPager.getCurrentItem());
+    currentPage = adapter.getItem(viewPager.getCurrentItem());
   }
 
   @Override
@@ -132,13 +132,13 @@
     LogUtil.enterBlock("ListsFragment.onPause");
     super.onPause();
 
-    mPaused = true;
+    paused = true;
   }
 
   @Override
   public void onDestroyView() {
     super.onDestroyView();
-    mViewPager.removeOnPageChangeListener(this);
+    viewPager.removeOnPageChangeListener(this);
   }
 
   @Override
@@ -194,36 +194,36 @@
     tabIcons[DialtactsPagerAdapter.TAB_INDEX_ALL_CONTACTS] = R.drawable.quantum_ic_people_white_24;
     tabIcons[DialtactsPagerAdapter.TAB_INDEX_VOICEMAIL] = R.drawable.quantum_ic_voicemail_white_24;
 
-    mViewPager = (DialerViewPager) parentView.findViewById(R.id.lists_pager);
-    mAdapter =
+    viewPager = (DialerViewPager) parentView.findViewById(R.id.lists_pager);
+    adapter =
         new DialtactsPagerAdapter(
             getContext(),
             getChildFragmentManager(),
             tabTitles,
-            mPrefs.getBoolean(
+            prefs.getBoolean(
                 VisualVoicemailEnabledChecker.PREF_KEY_HAS_ACTIVE_VOICEMAIL_PROVIDER, false));
-    mViewPager.setAdapter(mAdapter);
+    viewPager.setAdapter(adapter);
 
     // This is deliberate. See cl/172018946 for the app startup implications of using 1 here
     // versus loading more fragments upfront.
-    mViewPager.setOffscreenPageLimit(1);
+    viewPager.setOffscreenPageLimit(1);
 
-    mViewPager.addOnPageChangeListener(this);
+    viewPager.addOnPageChangeListener(this);
     showTab(DialtactsPagerAdapter.TAB_INDEX_SPEED_DIAL);
 
-    mViewPagerTabs = (ViewPagerTabs) parentView.findViewById(R.id.lists_pager_header);
-    mViewPagerTabs.configureTabIcons(tabIcons);
-    mViewPagerTabs.setViewPager(mViewPager);
-    addOnPageChangeListener(mViewPagerTabs);
-    mRemoveView = (RemoveView) parentView.findViewById(R.id.remove_view);
-    mRemoveViewContent = parentView.findViewById(R.id.remove_view_content);
+    viewPagerTabs = (ViewPagerTabs) parentView.findViewById(R.id.lists_pager_header);
+    viewPagerTabs.configureTabIcons(tabIcons);
+    viewPagerTabs.setViewPager(viewPager);
+    addOnPageChangeListener(viewPagerTabs);
+    removeView = (RemoveView) parentView.findViewById(R.id.remove_view);
+    removeViewContent = parentView.findViewById(R.id.remove_view_content);
 
     if (PermissionsUtil.hasReadVoicemailPermissions(getContext())
         && PermissionsUtil.hasAddVoicemailPermissions(getContext())) {
       getActivity()
           .getContentResolver()
           .registerContentObserver(
-              VoicemailContract.Status.CONTENT_URI, true, mVoicemailStatusObserver);
+              VoicemailContract.Status.CONTENT_URI, true, voicemailStatusObserver);
     } else {
       LogUtil.w("ListsFragment.onCreateView", "no voicemail read permissions");
     }
@@ -235,13 +235,13 @@
 
   @Override
   public void onDestroy() {
-    getActivity().getContentResolver().unregisterContentObserver(mVoicemailStatusObserver);
+    getActivity().getContentResolver().unregisterContentObserver(voicemailStatusObserver);
     super.onDestroy();
   }
 
   public void addOnPageChangeListener(OnPageChangeListener onPageChangeListener) {
-    if (!mOnPageChangeListeners.contains(onPageChangeListener)) {
-      mOnPageChangeListeners.add(onPageChangeListener);
+    if (!onPageChangeListeners.contains(onPageChangeListener)) {
+      onPageChangeListeners.add(onPageChangeListener);
     }
   }
 
@@ -252,15 +252,14 @@
    */
   public void showTab(int index) {
     if (index == DialtactsPagerAdapter.TAB_INDEX_VOICEMAIL) {
-      if (mAdapter.hasActiveVoicemailProvider()) {
-        mViewPager.setCurrentItem(
-            mAdapter.getRtlPosition(DialtactsPagerAdapter.TAB_INDEX_VOICEMAIL));
-      } else if (!mHasFetchedVoicemailStatus) {
+      if (adapter.hasActiveVoicemailProvider()) {
+        viewPager.setCurrentItem(adapter.getRtlPosition(DialtactsPagerAdapter.TAB_INDEX_VOICEMAIL));
+      } else if (!hasFetchedVoicemailStatus) {
         // Try to show the voicemail tab after the voicemail status returns.
-        mShowVoicemailTabAfterVoicemailStatusIsFetched = true;
+        showVoicemailTabAfterVoicemailStatusIsFetched = true;
       }
     } else if (index < getTabCount()) {
-      mViewPager.setCurrentItem(mAdapter.getRtlPosition(index));
+      viewPager.setCurrentItem(adapter.getRtlPosition(index));
     }
   }
 
@@ -271,11 +270,11 @@
     if (positionOffsetPixels != 0) {
       onPageScrolledBeforeScrollStateSettling = true;
     }
-    mTabIndex = mAdapter.getRtlPosition(position);
+    tabIndex = adapter.getRtlPosition(position);
 
-    final int count = mOnPageChangeListeners.size();
+    final int count = onPageChangeListeners.size();
     for (int i = 0; i < count; i++) {
-      mOnPageChangeListeners.get(i).onPageScrolled(position, positionOffset, positionOffsetPixels);
+      onPageChangeListeners.get(i).onPageScrolled(position, positionOffset, positionOffsetPixels);
     }
   }
 
@@ -294,23 +293,23 @@
     PerformanceReport.recordClick(actionTypeList[position]);
 
     LogUtil.i("ListsFragment.onPageSelected", "position: %d", position);
-    mTabIndex = mAdapter.getRtlPosition(position);
+    tabIndex = adapter.getRtlPosition(position);
 
     // Show the tab which has been selected instead.
-    mShowVoicemailTabAfterVoicemailStatusIsFetched = false;
+    showVoicemailTabAfterVoicemailStatusIsFetched = false;
 
-    final int count = mOnPageChangeListeners.size();
+    final int count = onPageChangeListeners.size();
     for (int i = 0; i < count; i++) {
-      mOnPageChangeListeners.get(i).onPageSelected(position);
+      onPageChangeListeners.get(i).onPageSelected(position);
     }
     sendScreenViewForCurrentPosition();
 
-    if (mCurrentPage instanceof CallLogFragment) {
-      ((CallLogFragment) mCurrentPage).onNotVisible();
+    if (currentPage instanceof CallLogFragment) {
+      ((CallLogFragment) currentPage).onNotVisible();
     }
-    mCurrentPage = mAdapter.getItem(position);
-    if (mCurrentPage instanceof CallLogFragment) {
-      ((CallLogFragment) mCurrentPage).onVisible();
+    currentPage = adapter.getItem(position);
+    if (currentPage instanceof CallLogFragment) {
+      ((CallLogFragment) currentPage).onVisible();
     }
   }
 
@@ -320,17 +319,17 @@
       onPageScrolledBeforeScrollStateSettling = false;
     }
 
-    final int count = mOnPageChangeListeners.size();
+    final int count = onPageChangeListeners.size();
     for (int i = 0; i < count; i++) {
-      mOnPageChangeListeners.get(i).onPageScrollStateChanged(state);
+      onPageChangeListeners.get(i).onPageScrollStateChanged(state);
     }
   }
 
   @Override
   public void onVoicemailStatusFetched(Cursor statusCursor) {
-    mHasFetchedVoicemailStatus = true;
+    hasFetchedVoicemailStatus = true;
 
-    if (getActivity() == null || mPaused) {
+    if (getActivity() == null || paused) {
       return;
     }
 
@@ -340,19 +339,19 @@
     // Update hasActiveVoicemailProvider, which controls the number of tabs displayed.
     boolean hasActiveVoicemailProvider =
         VoicemailStatusHelper.getNumberActivityVoicemailSources(statusCursor) > 0;
-    if (hasActiveVoicemailProvider != mAdapter.hasActiveVoicemailProvider()) {
-      mAdapter.setHasActiveVoicemailProvider(hasActiveVoicemailProvider);
-      mAdapter.notifyDataSetChanged();
+    if (hasActiveVoicemailProvider != adapter.hasActiveVoicemailProvider()) {
+      adapter.setHasActiveVoicemailProvider(hasActiveVoicemailProvider);
+      adapter.notifyDataSetChanged();
 
       if (hasActiveVoicemailProvider) {
         Logger.get(getContext()).logImpression(DialerImpression.Type.VVM_TAB_VISIBLE);
-        mViewPagerTabs.updateTab(DialtactsPagerAdapter.TAB_INDEX_VOICEMAIL);
+        viewPagerTabs.updateTab(DialtactsPagerAdapter.TAB_INDEX_VOICEMAIL);
       } else {
-        mViewPagerTabs.removeTab(DialtactsPagerAdapter.TAB_INDEX_VOICEMAIL);
-        mAdapter.removeVoicemailFragment(getChildFragmentManager());
+        viewPagerTabs.removeTab(DialtactsPagerAdapter.TAB_INDEX_VOICEMAIL);
+        adapter.removeVoicemailFragment(getChildFragmentManager());
       }
 
-      mPrefs
+      prefs
           .edit()
           .putBoolean(
               VisualVoicemailEnabledChecker.PREF_KEY_HAS_ACTIVE_VOICEMAIL_PROVIDER,
@@ -361,11 +360,11 @@
     }
 
     if (hasActiveVoicemailProvider) {
-      mCallLogQueryHandler.fetchVoicemailUnreadCount();
+      callLogQueryHandler.fetchVoicemailUnreadCount();
     }
 
-    if (mAdapter.hasActiveVoicemailProvider() && mShowVoicemailTabAfterVoicemailStatusIsFetched) {
-      mShowVoicemailTabAfterVoicemailStatusIsFetched = false;
+    if (adapter.hasActiveVoicemailProvider() && showVoicemailTabAfterVoicemailStatusIsFetched) {
+      showVoicemailTabAfterVoicemailStatusIsFetched = false;
       showTab(DialtactsPagerAdapter.TAB_INDEX_VOICEMAIL);
     }
   }
@@ -383,8 +382,8 @@
       cursor.close();
     }
 
-    mViewPagerTabs.setUnreadCount(count, DialtactsPagerAdapter.TAB_INDEX_VOICEMAIL);
-    mViewPagerTabs.updateTab(DialtactsPagerAdapter.TAB_INDEX_VOICEMAIL);
+    viewPagerTabs.setUnreadCount(count, DialtactsPagerAdapter.TAB_INDEX_VOICEMAIL);
+    viewPagerTabs.updateTab(DialtactsPagerAdapter.TAB_INDEX_VOICEMAIL);
   }
 
   @Override
@@ -400,8 +399,8 @@
       cursor.close();
     }
 
-    mViewPagerTabs.setUnreadCount(count, DialtactsPagerAdapter.TAB_INDEX_HISTORY);
-    mViewPagerTabs.updateTab(DialtactsPagerAdapter.TAB_INDEX_HISTORY);
+    viewPagerTabs.setUnreadCount(count, DialtactsPagerAdapter.TAB_INDEX_HISTORY);
+    viewPagerTabs.updateTab(DialtactsPagerAdapter.TAB_INDEX_HISTORY);
   }
 
   @Override
@@ -411,13 +410,13 @@
   }
 
   public int getCurrentTabIndex() {
-    return mTabIndex;
+    return tabIndex;
   }
 
   public boolean shouldShowFab() {
     // If the VVM TOS is visible, don't show the fab
-    if (mCurrentPage instanceof VisualVoicemailCallLogFragment
-        && ((VisualVoicemailCallLogFragment) mCurrentPage).isModalAlertVisible()) {
+    if (currentPage instanceof VisualVoicemailCallLogFragment
+        && ((VisualVoicemailCallLogFragment) currentPage).isModalAlertVisible()) {
       return false;
     }
 
@@ -429,47 +428,47 @@
    * voicemail in the call log or when the user expands an unread call in the call history tab.
    */
   public void updateTabUnreadCounts() {
-    if (mCallLogQueryHandler != null) {
-      mCallLogQueryHandler.fetchMissedCallsUnreadCount();
-      if (mAdapter.hasActiveVoicemailProvider()) {
-        mCallLogQueryHandler.fetchVoicemailUnreadCount();
+    if (callLogQueryHandler != null) {
+      callLogQueryHandler.fetchMissedCallsUnreadCount();
+      if (adapter.hasActiveVoicemailProvider()) {
+        callLogQueryHandler.fetchVoicemailUnreadCount();
       }
     }
   }
 
   /** External method to mark all missed calls as read. */
   public void markMissedCallsAsReadAndRemoveNotifications() {
-    if (mCallLogQueryHandler != null) {
-      mCallLogQueryHandler.markMissedCallsAsRead();
+    if (callLogQueryHandler != null) {
+      callLogQueryHandler.markMissedCallsAsRead();
       CallLogNotificationsService.cancelAllMissedCalls(getContext());
     }
   }
 
   public void showRemoveView(boolean show) {
-    mRemoveViewContent.setVisibility(show ? View.VISIBLE : View.GONE);
-    mRemoveView.setAlpha(show ? 0 : 1);
-    mRemoveView.animate().alpha(show ? 1 : 0).start();
+    removeViewContent.setVisibility(show ? View.VISIBLE : View.GONE);
+    removeView.setAlpha(show ? 0 : 1);
+    removeView.animate().alpha(show ? 1 : 0).start();
   }
 
   public void showMultiSelectRemoveView(boolean show) {
-    mViewPagerTabs.setVisibility(show ? View.GONE : View.VISIBLE);
-    mViewPager.setEnableSwipingPages(!show);
+    viewPagerTabs.setVisibility(show ? View.GONE : View.VISIBLE);
+    viewPager.setEnableSwipingPages(!show);
   }
 
   public boolean hasFrequents() {
     Fragment page =
-        mAdapter.getItem(mAdapter.getRtlPosition(DialtactsPagerAdapter.TAB_INDEX_SPEED_DIAL));
+        adapter.getItem(adapter.getRtlPosition(DialtactsPagerAdapter.TAB_INDEX_SPEED_DIAL));
     return page instanceof OldSpeedDialFragment
         ? ((OldSpeedDialFragment) page).hasFrequents()
         : ((SpeedDialFragment) page).hasFrequents();
   }
 
   public RemoveView getRemoveView() {
-    return mRemoveView;
+    return removeView;
   }
 
   public int getTabCount() {
-    return mAdapter.getCount();
+    return adapter.getCount();
   }
 
   public void sendScreenViewForCurrentPosition() {
diff --git a/java/com/android/dialer/app/list/OldSpeedDialFragment.java b/java/com/android/dialer/app/list/OldSpeedDialFragment.java
index afc7c13..1b366c1 100644
--- a/java/com/android/dialer/app/list/OldSpeedDialFragment.java
+++ b/java/com/android/dialer/app/list/OldSpeedDialFragment.java
@@ -81,22 +81,22 @@
   /** Used with LoaderManager. */
   private static final int LOADER_ID_CONTACT_TILE = 1;
 
-  private final LongSparseArray<Integer> mItemIdTopMap = new LongSparseArray<>();
-  private final LongSparseArray<Integer> mItemIdLeftMap = new LongSparseArray<>();
-  private final ContactTileView.Listener mContactTileAdapterListener =
+  private final LongSparseArray<Integer> itemIdTopMap = new LongSparseArray<>();
+  private final LongSparseArray<Integer> itemIdLeftMap = new LongSparseArray<>();
+  private final ContactTileView.Listener contactTileAdapterListener =
       new ContactTileAdapterListener();
-  private final LoaderManager.LoaderCallbacks<Cursor> mContactTileLoaderListener =
+  private final LoaderManager.LoaderCallbacks<Cursor> contactTileLoaderListener =
       new ContactTileLoaderListener();
-  private final ScrollListener mScrollListener = new ScrollListener();
-  private int mAnimationDuration;
-  private OnPhoneNumberPickerActionListener mPhoneNumberPickerActionListener;
-  private OnListFragmentScrolledListener mActivityScrollListener;
-  private PhoneFavoritesTileAdapter mContactTileAdapter;
-  private View mParentView;
-  private PhoneFavoriteListView mListView;
-  private View mContactTileFrame;
+  private final ScrollListener scrollListener = new ScrollListener();
+  private int animationDuration;
+  private OnPhoneNumberPickerActionListener phoneNumberPickerActionListener;
+  private OnListFragmentScrolledListener activityScrollListener;
+  private PhoneFavoritesTileAdapter contactTileAdapter;
+  private View parentView;
+  private PhoneFavoriteListView listView;
+  private View contactTileFrame;
   /** Layout used when there are no favorites. */
-  private EmptyContentView mEmptyView;
+  private EmptyContentView emptyView;
 
   @Override
   public void onCreate(Bundle savedState) {
@@ -109,10 +109,10 @@
     // Construct two base adapters which will become part of PhoneFavoriteMergedAdapter.
     // We don't construct the resultant adapter at this moment since it requires LayoutInflater
     // that will be available on onCreateView().
-    mContactTileAdapter =
-        new PhoneFavoritesTileAdapter(getActivity(), mContactTileAdapterListener, this);
-    mContactTileAdapter.setPhotoLoader(ContactPhotoManager.getInstance(getActivity()));
-    mAnimationDuration = getResources().getInteger(R.integer.fade_duration);
+    contactTileAdapter =
+        new PhoneFavoritesTileAdapter(getActivity(), contactTileAdapterListener, this);
+    contactTileAdapter.setPhotoLoader(ContactPhotoManager.getInstance(getActivity()));
+    animationDuration = getResources().getInteger(R.integer.fade_duration);
     Trace.endSection();
   }
 
@@ -120,22 +120,22 @@
   public void onResume() {
     Trace.beginSection(TAG + " onResume");
     super.onResume();
-    if (mContactTileAdapter != null) {
-      mContactTileAdapter.refreshContactsPreferences();
+    if (contactTileAdapter != null) {
+      contactTileAdapter.refreshContactsPreferences();
     }
     if (PermissionsUtil.hasContactsReadPermissions(getActivity())) {
       if (getLoaderManager().getLoader(LOADER_ID_CONTACT_TILE) == null) {
-        getLoaderManager().initLoader(LOADER_ID_CONTACT_TILE, null, mContactTileLoaderListener);
+        getLoaderManager().initLoader(LOADER_ID_CONTACT_TILE, null, contactTileLoaderListener);
 
       } else {
         getLoaderManager().getLoader(LOADER_ID_CONTACT_TILE).forceLoad();
       }
 
-      mEmptyView.setDescription(R.string.speed_dial_empty);
-      mEmptyView.setActionLabel(R.string.speed_dial_empty_add_favorite_action);
+      emptyView.setDescription(R.string.speed_dial_empty);
+      emptyView.setActionLabel(R.string.speed_dial_empty_add_favorite_action);
     } else {
-      mEmptyView.setDescription(R.string.permission_no_speeddial);
-      mEmptyView.setActionLabel(R.string.permission_single_turn_on);
+      emptyView.setDescription(R.string.permission_no_speeddial);
+      emptyView.setActionLabel(R.string.permission_single_turn_on);
     }
     Trace.endSection();
   }
@@ -144,62 +144,62 @@
   public View onCreateView(
       LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
     Trace.beginSection(TAG + " onCreateView");
-    mParentView = inflater.inflate(R.layout.speed_dial_fragment, container, false);
+    parentView = inflater.inflate(R.layout.speed_dial_fragment, container, false);
 
-    mListView = (PhoneFavoriteListView) mParentView.findViewById(R.id.contact_tile_list);
-    mListView.setOnItemClickListener(this);
-    mListView.setVerticalScrollBarEnabled(false);
-    mListView.setVerticalScrollbarPosition(View.SCROLLBAR_POSITION_RIGHT);
-    mListView.setScrollBarStyle(ListView.SCROLLBARS_OUTSIDE_OVERLAY);
-    mListView.getDragDropController().addOnDragDropListener(mContactTileAdapter);
+    listView = (PhoneFavoriteListView) parentView.findViewById(R.id.contact_tile_list);
+    listView.setOnItemClickListener(this);
+    listView.setVerticalScrollBarEnabled(false);
+    listView.setVerticalScrollbarPosition(View.SCROLLBAR_POSITION_RIGHT);
+    listView.setScrollBarStyle(ListView.SCROLLBARS_OUTSIDE_OVERLAY);
+    listView.getDragDropController().addOnDragDropListener(contactTileAdapter);
 
     final ImageView dragShadowOverlay =
         (ImageView) getActivity().findViewById(R.id.contact_tile_drag_shadow_overlay);
-    mListView.setDragShadowOverlay(dragShadowOverlay);
+    listView.setDragShadowOverlay(dragShadowOverlay);
 
-    mEmptyView = (EmptyContentView) mParentView.findViewById(R.id.empty_list_view);
-    mEmptyView.setImage(R.drawable.empty_speed_dial);
-    mEmptyView.setActionClickedListener(this);
+    emptyView = (EmptyContentView) parentView.findViewById(R.id.empty_list_view);
+    emptyView.setImage(R.drawable.empty_speed_dial);
+    emptyView.setActionClickedListener(this);
 
-    mContactTileFrame = mParentView.findViewById(R.id.contact_tile_frame);
+    contactTileFrame = parentView.findViewById(R.id.contact_tile_frame);
 
     final LayoutAnimationController controller =
         new LayoutAnimationController(
             AnimationUtils.loadAnimation(getActivity(), android.R.anim.fade_in));
     controller.setDelay(0);
-    mListView.setLayoutAnimation(controller);
-    mListView.setAdapter(mContactTileAdapter);
+    listView.setLayoutAnimation(controller);
+    listView.setAdapter(contactTileAdapter);
 
-    mListView.setOnScrollListener(mScrollListener);
-    mListView.setFastScrollEnabled(false);
-    mListView.setFastScrollAlwaysVisible(false);
+    listView.setOnScrollListener(scrollListener);
+    listView.setFastScrollEnabled(false);
+    listView.setFastScrollAlwaysVisible(false);
 
-    //prevent content changes of the list from firing accessibility events.
-    mListView.setAccessibilityLiveRegion(View.ACCESSIBILITY_LIVE_REGION_NONE);
-    ContentChangedFilter.addToParent(mListView);
+    // prevent content changes of the list from firing accessibility events.
+    listView.setAccessibilityLiveRegion(View.ACCESSIBILITY_LIVE_REGION_NONE);
+    ContentChangedFilter.addToParent(listView);
 
     Trace.endSection();
-    return mParentView;
+    return parentView;
   }
 
   public boolean hasFrequents() {
-    if (mContactTileAdapter == null) {
+    if (contactTileAdapter == null) {
       return false;
     }
-    return mContactTileAdapter.getNumFrequents() > 0;
+    return contactTileAdapter.getNumFrequents() > 0;
   }
 
   /* package */ void setEmptyViewVisibility(final boolean visible) {
-    final int previousVisibility = mEmptyView.getVisibility();
+    final int previousVisibility = emptyView.getVisibility();
     final int emptyViewVisibility = visible ? View.VISIBLE : View.GONE;
     final int listViewVisibility = visible ? View.GONE : View.VISIBLE;
 
     if (previousVisibility != emptyViewVisibility) {
-      final FrameLayout.LayoutParams params = (LayoutParams) mContactTileFrame.getLayoutParams();
+      final FrameLayout.LayoutParams params = (LayoutParams) contactTileFrame.getLayoutParams();
       params.height = visible ? LayoutParams.WRAP_CONTENT : LayoutParams.MATCH_PARENT;
-      mContactTileFrame.setLayoutParams(params);
-      mEmptyView.setVisibility(emptyViewVisibility);
-      mListView.setVisibility(listViewVisibility);
+      contactTileFrame.setLayoutParams(params);
+      emptyView.setVisibility(emptyViewVisibility);
+      listView.setVisibility(listViewVisibility);
     }
   }
 
@@ -210,7 +210,7 @@
     final Activity activity = getActivity();
 
     try {
-      mActivityScrollListener = (OnListFragmentScrolledListener) activity;
+      activityScrollListener = (OnListFragmentScrolledListener) activity;
     } catch (ClassCastException e) {
       throw new ClassCastException(
           activity.toString() + " must implement OnListFragmentScrolledListener");
@@ -218,15 +218,15 @@
 
     try {
       OnDragDropListener listener = (OnDragDropListener) activity;
-      mListView.getDragDropController().addOnDragDropListener(listener);
-      ((HostInterface) activity).setDragDropController(mListView.getDragDropController());
+      listView.getDragDropController().addOnDragDropListener(listener);
+      ((HostInterface) activity).setDragDropController(listView.getDragDropController());
     } catch (ClassCastException e) {
       throw new ClassCastException(
           activity.toString() + " must implement OnDragDropListener and HostInterface");
     }
 
     try {
-      mPhoneNumberPickerActionListener = (OnPhoneNumberPickerActionListener) activity;
+      phoneNumberPickerActionListener = (OnPhoneNumberPickerActionListener) activity;
     } catch (ClassCastException e) {
       throw new ClassCastException(
           activity.toString() + " must implement PhoneFavoritesFragment.listener");
@@ -236,7 +236,7 @@
     // This method call implicitly assures ContactTileLoaderListener's onLoadFinished() will
     // be called, on which we'll check if "all" contacts should be reloaded again or not.
     if (PermissionsUtil.hasContactsReadPermissions(activity)) {
-      getLoaderManager().initLoader(LOADER_ID_CONTACT_TILE, null, mContactTileLoaderListener);
+      getLoaderManager().initLoader(LOADER_ID_CONTACT_TILE, null, contactTileLoaderListener);
     } else {
       setEmptyViewVisibility(true);
     }
@@ -245,12 +245,12 @@
   /**
    * {@inheritDoc}
    *
-   * <p>This is only effective for elements provided by {@link #mContactTileAdapter}. {@link
-   * #mContactTileAdapter} has its own logic for click events.
+   * <p>This is only effective for elements provided by {@link #contactTileAdapter}. {@link
+   * #contactTileAdapter} has its own logic for click events.
    */
   @Override
   public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-    final int contactTileAdapterCount = mContactTileAdapter.getCount();
+    final int contactTileAdapterCount = contactTileAdapter.getCount();
     if (position <= contactTileAdapterCount) {
       LogUtil.e(
           "OldSpeedDialFragment.onItemClick",
@@ -267,36 +267,36 @@
    * are sliding into their new positions.
    */
   private void saveOffsets(int removedItemHeight) {
-    final int firstVisiblePosition = mListView.getFirstVisiblePosition();
+    final int firstVisiblePosition = listView.getFirstVisiblePosition();
     if (DEBUG) {
-      LogUtil.d("OldSpeedDialFragment.saveOffsets", "Child count : " + mListView.getChildCount());
+      LogUtil.d("OldSpeedDialFragment.saveOffsets", "Child count : " + listView.getChildCount());
     }
-    for (int i = 0; i < mListView.getChildCount(); i++) {
-      final View child = mListView.getChildAt(i);
+    for (int i = 0; i < listView.getChildCount(); i++) {
+      final View child = listView.getChildAt(i);
       final int position = firstVisiblePosition + i;
       // Since we are getting the position from mListView and then querying
       // mContactTileAdapter, its very possible that things are out of sync
       // and we might index out of bounds.  Let's make sure that this doesn't happen.
-      if (!mContactTileAdapter.isIndexInBound(position)) {
+      if (!contactTileAdapter.isIndexInBound(position)) {
         continue;
       }
-      final long itemId = mContactTileAdapter.getItemId(position);
+      final long itemId = contactTileAdapter.getItemId(position);
       if (DEBUG) {
         LogUtil.d(
             "OldSpeedDialFragment.saveOffsets",
             "Saving itemId: " + itemId + " for listview child " + i + " Top: " + child.getTop());
       }
-      mItemIdTopMap.put(itemId, child.getTop());
-      mItemIdLeftMap.put(itemId, child.getLeft());
+      itemIdTopMap.put(itemId, child.getTop());
+      itemIdLeftMap.put(itemId, child.getLeft());
     }
-    mItemIdTopMap.put(KEY_REMOVED_ITEM_HEIGHT, removedItemHeight);
+    itemIdTopMap.put(KEY_REMOVED_ITEM_HEIGHT, removedItemHeight);
   }
 
   /*
    * Performs animations for the gridView
    */
   private void animateGridView(final long... idsInPlace) {
-    if (mItemIdTopMap.size() == 0) {
+    if (itemIdTopMap.size() == 0) {
       // Don't do animations if the database is being queried for the first time and
       // the previous item offsets have not been cached, or the user hasn't done anything
       // (dragging, swiping etc) that requires an animation.
@@ -304,34 +304,34 @@
     }
 
     ViewUtil.doOnPreDraw(
-        mListView,
+        listView,
         true,
         new Runnable() {
           @Override
           public void run() {
 
-            final int firstVisiblePosition = mListView.getFirstVisiblePosition();
+            final int firstVisiblePosition = listView.getFirstVisiblePosition();
             final AnimatorSet animSet = new AnimatorSet();
             final ArrayList<Animator> animators = new ArrayList<Animator>();
-            for (int i = 0; i < mListView.getChildCount(); i++) {
-              final View child = mListView.getChildAt(i);
+            for (int i = 0; i < listView.getChildCount(); i++) {
+              final View child = listView.getChildAt(i);
               int position = firstVisiblePosition + i;
 
               // Since we are getting the position from mListView and then querying
               // mContactTileAdapter, its very possible that things are out of sync
               // and we might index out of bounds.  Let's make sure that this doesn't happen.
-              if (!mContactTileAdapter.isIndexInBound(position)) {
+              if (!contactTileAdapter.isIndexInBound(position)) {
                 continue;
               }
 
-              final long itemId = mContactTileAdapter.getItemId(position);
+              final long itemId = contactTileAdapter.getItemId(position);
 
               if (containsId(idsInPlace, itemId)) {
                 animators.add(ObjectAnimator.ofFloat(child, "alpha", 0.0f, 1.0f));
                 break;
               } else {
-                Integer startTop = mItemIdTopMap.get(itemId);
-                Integer startLeft = mItemIdLeftMap.get(itemId);
+                Integer startTop = itemIdTopMap.get(itemId);
+                Integer startLeft = itemIdLeftMap.get(itemId);
                 final int top = child.getTop();
                 final int left = child.getLeft();
                 int deltaX = 0;
@@ -367,12 +367,12 @@
             }
 
             if (animators.size() > 0) {
-              animSet.setDuration(mAnimationDuration).playTogether(animators);
+              animSet.setDuration(animationDuration).playTogether(animators);
               animSet.start();
             }
 
-            mItemIdTopMap.clear();
-            mItemIdLeftMap.clear();
+            itemIdTopMap.clear();
+            itemIdLeftMap.clear();
           }
         });
   }
@@ -451,8 +451,8 @@
       if (DEBUG) {
         LogUtil.d("ContactTileLoaderListener.onLoadFinished", null);
       }
-      mContactTileAdapter.setContactCursor(data);
-      setEmptyViewVisibility(mContactTileAdapter.getCount() == 0);
+      contactTileAdapter.setContactCursor(data);
+      setEmptyViewVisibility(contactTileAdapter.getCount() == 0);
     }
 
     @Override
@@ -468,16 +468,16 @@
     @Override
     public void onContactSelected(
         Uri contactUri, Rect targetRect, CallSpecificAppData callSpecificAppData) {
-      if (mPhoneNumberPickerActionListener != null) {
-        mPhoneNumberPickerActionListener.onPickDataUri(
+      if (phoneNumberPickerActionListener != null) {
+        phoneNumberPickerActionListener.onPickDataUri(
             contactUri, false /* isVideoCall */, callSpecificAppData);
       }
     }
 
     @Override
     public void onCallNumberDirectly(String phoneNumber, CallSpecificAppData callSpecificAppData) {
-      if (mPhoneNumberPickerActionListener != null) {
-        mPhoneNumberPickerActionListener.onPickPhoneNumber(
+      if (phoneNumberPickerActionListener != null) {
+        phoneNumberPickerActionListener.onPickPhoneNumber(
             phoneNumber, false /* isVideoCall */, callSpecificAppData);
       }
     }
@@ -488,15 +488,15 @@
     @Override
     public void onScroll(
         AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
-      if (mActivityScrollListener != null) {
-        mActivityScrollListener.onListFragmentScroll(
+      if (activityScrollListener != null) {
+        activityScrollListener.onListFragmentScroll(
             firstVisibleItem, visibleItemCount, totalItemCount);
       }
     }
 
     @Override
     public void onScrollStateChanged(AbsListView view, int scrollState) {
-      mActivityScrollListener.onListFragmentScrollStateChange(scrollState);
+      activityScrollListener.onListFragmentScrollStateChange(scrollState);
     }
   }
 }
diff --git a/java/com/android/dialer/app/list/PhoneFavoriteListView.java b/java/com/android/dialer/app/list/PhoneFavoriteListView.java
index f4f395f..ff867f9 100644
--- a/java/com/android/dialer/app/list/PhoneFavoriteListView.java
+++ b/java/com/android/dialer/app/list/PhoneFavoriteListView.java
@@ -38,58 +38,58 @@
     implements OnDragDropListener, DragItemContainer {
 
   public static final String LOG_TAG = PhoneFavoriteListView.class.getSimpleName();
-  final int[] mLocationOnScreen = new int[2];
+  final int[] locationOnScreen = new int[2];
   private static final long SCROLL_HANDLER_DELAY_MILLIS = 5;
   private static final int DRAG_SCROLL_PX_UNIT = 25;
   private static final float DRAG_SHADOW_ALPHA = 0.7f;
   /**
-   * {@link #mTopScrollBound} and {@link mBottomScrollBound} will be offseted to the top / bottom by
+   * {@link #topScrollBound} and {@link bottomScrollBound} will be offseted to the top / bottom by
    * {@link #getHeight} * {@link #BOUND_GAP_RATIO} pixels.
    */
   private static final float BOUND_GAP_RATIO = 0.2f;
 
-  private float mTouchSlop;
-  private int mTopScrollBound;
-  private int mBottomScrollBound;
-  private int mLastDragY;
-  private Handler mScrollHandler;
-  private final Runnable mDragScroller =
+  private float touchSlop;
+  private int topScrollBound;
+  private int bottomScrollBound;
+  private int lastDragY;
+  private Handler scrollHandler;
+  private final Runnable dragScroller =
       new Runnable() {
         @Override
         public void run() {
-          if (mLastDragY <= mTopScrollBound) {
+          if (lastDragY <= topScrollBound) {
             smoothScrollBy(-DRAG_SCROLL_PX_UNIT, (int) SCROLL_HANDLER_DELAY_MILLIS);
-          } else if (mLastDragY >= mBottomScrollBound) {
+          } else if (lastDragY >= bottomScrollBound) {
             smoothScrollBy(DRAG_SCROLL_PX_UNIT, (int) SCROLL_HANDLER_DELAY_MILLIS);
           }
-          mScrollHandler.postDelayed(this, SCROLL_HANDLER_DELAY_MILLIS);
+          scrollHandler.postDelayed(this, SCROLL_HANDLER_DELAY_MILLIS);
         }
       };
-  private boolean mIsDragScrollerRunning = false;
-  private int mTouchDownForDragStartY;
-  private Bitmap mDragShadowBitmap;
-  private ImageView mDragShadowOverlay;
-  private final AnimatorListenerAdapter mDragShadowOverAnimatorListener =
+  private boolean isDragScrollerRunning = false;
+  private int touchDownForDragStartY;
+  private Bitmap dragShadowBitmap;
+  private ImageView dragShadowOverlay;
+  private final AnimatorListenerAdapter dragShadowOverAnimatorListener =
       new AnimatorListenerAdapter() {
         @Override
         public void onAnimationEnd(Animator animation) {
-          if (mDragShadowBitmap != null) {
-            mDragShadowBitmap.recycle();
-            mDragShadowBitmap = null;
+          if (dragShadowBitmap != null) {
+            dragShadowBitmap.recycle();
+            dragShadowBitmap = null;
           }
-          mDragShadowOverlay.setVisibility(GONE);
-          mDragShadowOverlay.setImageBitmap(null);
+          dragShadowOverlay.setVisibility(GONE);
+          dragShadowOverlay.setImageBitmap(null);
         }
       };
-  private View mDragShadowParent;
-  private int mAnimationDuration;
+  private View dragShadowParent;
+  private int animationDuration;
   // X and Y offsets inside the item from where the user grabbed to the
   // child's left coordinate. This is used to aid in the drawing of the drag shadow.
-  private int mTouchOffsetToChildLeft;
-  private int mTouchOffsetToChildTop;
-  private int mDragShadowLeft;
-  private int mDragShadowTop;
-  private DragDropController mDragDropController = new DragDropController(this);
+  private int touchOffsetToChildLeft;
+  private int touchOffsetToChildTop;
+  private int dragShadowLeft;
+  private int dragShadowTop;
+  private DragDropController dragDropController = new DragDropController(this);
 
   public PhoneFavoriteListView(Context context) {
     this(context, null);
@@ -101,15 +101,15 @@
 
   public PhoneFavoriteListView(Context context, AttributeSet attrs, int defStyle) {
     super(context, attrs, defStyle);
-    mAnimationDuration = context.getResources().getInteger(R.integer.fade_duration);
-    mTouchSlop = ViewConfiguration.get(context).getScaledPagingTouchSlop();
-    mDragDropController.addOnDragDropListener(this);
+    animationDuration = context.getResources().getInteger(R.integer.fade_duration);
+    touchSlop = ViewConfiguration.get(context).getScaledPagingTouchSlop();
+    dragDropController.addOnDragDropListener(this);
   }
 
   @Override
   protected void onConfigurationChanged(Configuration newConfig) {
     super.onConfigurationChanged(newConfig);
-    mTouchSlop = ViewConfiguration.get(getContext()).getScaledPagingTouchSlop();
+    touchSlop = ViewConfiguration.get(getContext()).getScaledPagingTouchSlop();
   }
 
   /**
@@ -119,7 +119,7 @@
   @Override
   public boolean onInterceptTouchEvent(MotionEvent ev) {
     if (ev.getAction() == MotionEvent.ACTION_DOWN) {
-      mTouchDownForDragStartY = (int) ev.getY();
+      touchDownForDragStartY = (int) ev.getY();
     }
 
     return super.onInterceptTouchEvent(ev);
@@ -138,38 +138,38 @@
             // on a {@link PhoneFavoriteTileView}
             return false;
           }
-          if (!mDragDropController.handleDragStarted(this, eX, eY)) {
+          if (!dragDropController.handleDragStarted(this, eX, eY)) {
             return false;
           }
           break;
         }
       case DragEvent.ACTION_DRAG_LOCATION:
-        mLastDragY = eY;
-        mDragDropController.handleDragHovered(this, eX, eY);
+        lastDragY = eY;
+        dragDropController.handleDragHovered(this, eX, eY);
         // Kick off {@link #mScrollHandler} if it's not started yet.
-        if (!mIsDragScrollerRunning
+        if (!isDragScrollerRunning
             &&
             // And if the distance traveled while dragging exceeds the touch slop
-            (Math.abs(mLastDragY - mTouchDownForDragStartY) >= 4 * mTouchSlop)) {
-          mIsDragScrollerRunning = true;
+            (Math.abs(lastDragY - touchDownForDragStartY) >= 4 * touchSlop)) {
+          isDragScrollerRunning = true;
           ensureScrollHandler();
-          mScrollHandler.postDelayed(mDragScroller, SCROLL_HANDLER_DELAY_MILLIS);
+          scrollHandler.postDelayed(dragScroller, SCROLL_HANDLER_DELAY_MILLIS);
         }
         break;
       case DragEvent.ACTION_DRAG_ENTERED:
         final int boundGap = (int) (getHeight() * BOUND_GAP_RATIO);
-        mTopScrollBound = (getTop() + boundGap);
-        mBottomScrollBound = (getBottom() - boundGap);
+        topScrollBound = (getTop() + boundGap);
+        bottomScrollBound = (getBottom() - boundGap);
         break;
       case DragEvent.ACTION_DRAG_EXITED:
       case DragEvent.ACTION_DRAG_ENDED:
       case DragEvent.ACTION_DROP:
         ensureScrollHandler();
-        mScrollHandler.removeCallbacks(mDragScroller);
-        mIsDragScrollerRunning = false;
+        scrollHandler.removeCallbacks(dragScroller);
+        isDragScrollerRunning = false;
         // Either a successful drop or it's ended with out drop.
         if (action == DragEvent.ACTION_DROP || action == DragEvent.ACTION_DRAG_ENDED) {
-          mDragDropController.handleDragFinished(eX, eY, false);
+          dragDropController.handleDragFinished(eX, eY, false);
         }
         break;
       default:
@@ -180,8 +180,8 @@
   }
 
   public void setDragShadowOverlay(ImageView overlay) {
-    mDragShadowOverlay = overlay;
-    mDragShadowParent = (View) mDragShadowOverlay.getParent();
+    dragShadowOverlay = overlay;
+    dragShadowParent = (View) dragShadowOverlay.getParent();
   }
 
   /** Find the view under the pointer. */
@@ -201,73 +201,73 @@
   }
 
   private void ensureScrollHandler() {
-    if (mScrollHandler == null) {
-      mScrollHandler = getHandler();
+    if (scrollHandler == null) {
+      scrollHandler = getHandler();
     }
   }
 
   public DragDropController getDragDropController() {
-    return mDragDropController;
+    return dragDropController;
   }
 
   @Override
   public void onDragStarted(int x, int y, PhoneFavoriteSquareTileView tileView) {
-    if (mDragShadowOverlay == null) {
+    if (dragShadowOverlay == null) {
       return;
     }
 
-    mDragShadowOverlay.clearAnimation();
-    mDragShadowBitmap = createDraggedChildBitmap(tileView);
-    if (mDragShadowBitmap == null) {
+    dragShadowOverlay.clearAnimation();
+    dragShadowBitmap = createDraggedChildBitmap(tileView);
+    if (dragShadowBitmap == null) {
       return;
     }
 
-    tileView.getLocationOnScreen(mLocationOnScreen);
-    mDragShadowLeft = mLocationOnScreen[0];
-    mDragShadowTop = mLocationOnScreen[1];
+    tileView.getLocationOnScreen(locationOnScreen);
+    dragShadowLeft = locationOnScreen[0];
+    dragShadowTop = locationOnScreen[1];
 
     // x and y are the coordinates of the on-screen touch event. Using these
     // and the on-screen location of the tileView, calculate the difference between
     // the position of the user's finger and the position of the tileView. These will
     // be used to offset the location of the drag shadow so that it appears that the
     // tileView is positioned directly under the user's finger.
-    mTouchOffsetToChildLeft = x - mDragShadowLeft;
-    mTouchOffsetToChildTop = y - mDragShadowTop;
+    touchOffsetToChildLeft = x - dragShadowLeft;
+    touchOffsetToChildTop = y - dragShadowTop;
 
-    mDragShadowParent.getLocationOnScreen(mLocationOnScreen);
-    mDragShadowLeft -= mLocationOnScreen[0];
-    mDragShadowTop -= mLocationOnScreen[1];
+    dragShadowParent.getLocationOnScreen(locationOnScreen);
+    dragShadowLeft -= locationOnScreen[0];
+    dragShadowTop -= locationOnScreen[1];
 
-    mDragShadowOverlay.setImageBitmap(mDragShadowBitmap);
-    mDragShadowOverlay.setVisibility(VISIBLE);
-    mDragShadowOverlay.setAlpha(DRAG_SHADOW_ALPHA);
+    dragShadowOverlay.setImageBitmap(dragShadowBitmap);
+    dragShadowOverlay.setVisibility(VISIBLE);
+    dragShadowOverlay.setAlpha(DRAG_SHADOW_ALPHA);
 
-    mDragShadowOverlay.setX(mDragShadowLeft);
-    mDragShadowOverlay.setY(mDragShadowTop);
+    dragShadowOverlay.setX(dragShadowLeft);
+    dragShadowOverlay.setY(dragShadowTop);
   }
 
   @Override
   public void onDragHovered(int x, int y, PhoneFavoriteSquareTileView tileView) {
     // Update the drag shadow location.
-    mDragShadowParent.getLocationOnScreen(mLocationOnScreen);
-    mDragShadowLeft = x - mTouchOffsetToChildLeft - mLocationOnScreen[0];
-    mDragShadowTop = y - mTouchOffsetToChildTop - mLocationOnScreen[1];
+    dragShadowParent.getLocationOnScreen(locationOnScreen);
+    dragShadowLeft = x - touchOffsetToChildLeft - locationOnScreen[0];
+    dragShadowTop = y - touchOffsetToChildTop - locationOnScreen[1];
     // Draw the drag shadow at its last known location if the drag shadow exists.
-    if (mDragShadowOverlay != null) {
-      mDragShadowOverlay.setX(mDragShadowLeft);
-      mDragShadowOverlay.setY(mDragShadowTop);
+    if (dragShadowOverlay != null) {
+      dragShadowOverlay.setX(dragShadowLeft);
+      dragShadowOverlay.setY(dragShadowTop);
     }
   }
 
   @Override
   public void onDragFinished(int x, int y) {
-    if (mDragShadowOverlay != null) {
-      mDragShadowOverlay.clearAnimation();
-      mDragShadowOverlay
+    if (dragShadowOverlay != null) {
+      dragShadowOverlay.clearAnimation();
+      dragShadowOverlay
           .animate()
           .alpha(0.0f)
-          .setDuration(mAnimationDuration)
-          .setListener(mDragShadowOverAnimatorListener)
+          .setDuration(animationDuration)
+          .setListener(dragShadowOverAnimatorListener)
           .start();
     }
   }
@@ -297,10 +297,10 @@
 
   @Override
   public PhoneFavoriteSquareTileView getViewForLocation(int x, int y) {
-    getLocationOnScreen(mLocationOnScreen);
+    getLocationOnScreen(locationOnScreen);
     // Calculate the X and Y coordinates of the drag event relative to the view
-    final int viewX = x - mLocationOnScreen[0];
-    final int viewY = y - mLocationOnScreen[1];
+    final int viewX = x - locationOnScreen[0];
+    final int viewY = y - locationOnScreen[1];
     final View child = getViewAtPosition(viewX, viewY);
 
     if (!(child instanceof PhoneFavoriteSquareTileView)) {
diff --git a/java/com/android/dialer/app/list/PhoneFavoriteSquareTileView.java b/java/com/android/dialer/app/list/PhoneFavoriteSquareTileView.java
index 40f23ea..330a361 100644
--- a/java/com/android/dialer/app/list/PhoneFavoriteSquareTileView.java
+++ b/java/com/android/dialer/app/list/PhoneFavoriteSquareTileView.java
@@ -34,16 +34,16 @@
 
   private static final String TAG = PhoneFavoriteSquareTileView.class.getSimpleName();
 
-  private final float mHeightToWidthRatio;
+  private final float heightToWidthRatio;
 
-  private ImageButton mSecondaryButton;
+  private ImageButton secondaryButton;
 
-  private ContactEntry mContactEntry;
+  private ContactEntry contactEntry;
 
   public PhoneFavoriteSquareTileView(Context context, AttributeSet attrs) {
     super(context, attrs);
 
-    mHeightToWidthRatio =
+    heightToWidthRatio =
         getResources().getFraction(R.dimen.contact_tile_height_to_width_ratio, 1, 1);
   }
 
@@ -54,7 +54,7 @@
     nameView.setElegantTextHeight(false);
     final TextView phoneTypeView = (TextView) findViewById(R.id.contact_tile_phone_type);
     phoneTypeView.setElegantTextHeight(false);
-    mSecondaryButton = (ImageButton) findViewById(R.id.contact_tile_secondary_button);
+    secondaryButton = (ImageButton) findViewById(R.id.contact_tile_secondary_button);
   }
 
   @Override
@@ -85,7 +85,7 @@
   public void loadFromContact(ContactEntry entry) {
     super.loadFromContact(entry);
     if (entry != null) {
-      mSecondaryButton.setOnClickListener(
+      secondaryButton.setOnClickListener(
           new OnClickListener() {
             @Override
             public void onClick(View v) {
@@ -95,13 +95,13 @@
             }
           });
     }
-    mContactEntry = entry;
+    contactEntry = entry;
   }
 
   @Override
   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
     final int width = MeasureSpec.getSize(widthMeasureSpec);
-    final int height = (int) (mHeightToWidthRatio * width);
+    final int height = (int) (heightToWidthRatio * width);
     final int count = getChildCount();
     for (int i = 0; i < count; i++) {
       getChildAt(i)
@@ -118,6 +118,6 @@
   }
 
   public ContactEntry getContactEntry() {
-    return mContactEntry;
+    return contactEntry;
   }
 }
diff --git a/java/com/android/dialer/app/list/PhoneFavoriteTileView.java b/java/com/android/dialer/app/list/PhoneFavoriteTileView.java
index e0961be..3b27d31 100644
--- a/java/com/android/dialer/app/list/PhoneFavoriteTileView.java
+++ b/java/com/android/dialer/app/list/PhoneFavoriteTileView.java
@@ -60,9 +60,10 @@
   // don't crash with an NPE if the drag shadow is released in their bounds
   private static final ClipData EMPTY_CLIP_DATA = ClipData.newPlainText("", "");
   /** View that contains the transparent shadow that is overlaid on top of the contact image. */
-  private View mShadowOverlay;
+  private View shadowOverlay;
   /** Users' most frequent phone number. */
-  private String mPhoneNumberString;
+  private String phoneNumberString;
+
   private boolean isPinned;
   private boolean isStarred;
   private int position = -1;
@@ -74,7 +75,7 @@
   @Override
   protected void onFinishInflate() {
     super.onFinishInflate();
-    mShadowOverlay = findViewById(R.id.shadow_overlay);
+    shadowOverlay = findViewById(R.id.shadow_overlay);
 
     setOnLongClickListener(
         new OnLongClickListener() {
@@ -93,13 +94,13 @@
   public void loadFromContact(ContactEntry entry) {
     super.loadFromContact(entry);
     // Set phone number to null in case we're reusing the view.
-    mPhoneNumberString = null;
+    phoneNumberString = null;
     isPinned = (entry.pinned != PinnedPositions.UNPINNED);
     isStarred = entry.isFavorite;
     if (entry != null) {
       sendViewNotification(getContext(), entry.lookupUri);
       // Grab the phone-number to call directly. See {@link onClick()}.
-      mPhoneNumberString = entry.phoneNumber;
+      phoneNumberString = entry.phoneNumber;
 
       // If this is a blank entry, don't show anything. For this to truly look like an empty row
       // the entire ContactTileRow needs to be hidden.
@@ -141,7 +142,7 @@
           callSpecificAppData.addSpeedDialContactType(SpeedDialContactType.Type.PINNED_CONTACT);
         }
 
-        if (TextUtils.isEmpty(mPhoneNumberString)) {
+        if (TextUtils.isEmpty(phoneNumberString)) {
           // Don't set performance report now, since user may spend some time on picking a number
 
           // Copy "superclass" implementation
@@ -156,7 +157,7 @@
           // call them at the number that you usually talk to them
           // at (i.e. the one displayed in the UI), regardless of
           // whether that's their default number.
-          mListener.onCallNumberDirectly(mPhoneNumberString, callSpecificAppData.build());
+          mListener.onCallNumberDirectly(phoneNumberString, callSpecificAppData.build());
         }
       }
     };
@@ -176,8 +177,8 @@
   @Override
   protected void configureViewForImage(boolean isDefaultImage) {
     // Hide the shadow overlay if the image is a default image (i.e. colored letter tile)
-    if (mShadowOverlay != null) {
-      mShadowOverlay.setVisibility(isDefaultImage ? View.GONE : View.VISIBLE);
+    if (shadowOverlay != null) {
+      shadowOverlay.setVisibility(isDefaultImage ? View.GONE : View.VISIBLE);
     }
   }
 
diff --git a/java/com/android/dialer/app/list/PhoneFavoritesTileAdapter.java b/java/com/android/dialer/app/list/PhoneFavoritesTileAdapter.java
index cd5843c..ed64f7a 100644
--- a/java/com/android/dialer/app/list/PhoneFavoritesTileAdapter.java
+++ b/java/com/android/dialer/app/list/PhoneFavoritesTileAdapter.java
@@ -68,17 +68,17 @@
    */
   private static final int TILES_SOFT_LIMIT = 20;
   /** Contact data stored in cache. This is used to populate the associated view. */
-  private ArrayList<ContactEntry> mContactEntries = null;
+  private ArrayList<ContactEntry> contactEntries = null;
 
-  private int mNumFrequents;
-  private int mNumStarred;
+  private int numFrequents;
+  private int numStarred;
 
-  private ContactTileView.Listener mListener;
-  private OnDataSetChangedForAnimationListener mDataSetChangedListener;
-  private Context mContext;
-  private Resources mResources;
-  private ContactsPreferences mContactsPreferences;
-  private final Comparator<ContactEntry> mContactEntryComparator =
+  private ContactTileView.Listener listener;
+  private OnDataSetChangedForAnimationListener dataSetChangedListener;
+  private Context context;
+  private Resources resources;
+  private ContactsPreferences contactsPreferences;
+  private final Comparator<ContactEntry> contactEntryComparator =
       new Comparator<ContactEntry>() {
         @Override
         public int compare(ContactEntry lhs, ContactEntry rhs) {
@@ -89,7 +89,7 @@
         }
 
         private String getPreferredSortName(ContactEntry contactEntry) {
-          if (mContactsPreferences.getSortOrder() == ContactsPreferences.SORT_ORDER_PRIMARY
+          if (contactsPreferences.getSortOrder() == ContactsPreferences.SORT_ORDER_PRIMARY
               || TextUtils.isEmpty(contactEntry.nameAlternative)) {
             return contactEntry.namePrimary;
           }
@@ -97,36 +97,36 @@
         }
       };
   /** Back up of the temporarily removed Contact during dragging. */
-  private ContactEntry mDraggedEntry = null;
+  private ContactEntry draggedEntry = null;
   /** Position of the temporarily removed contact in the cache. */
-  private int mDraggedEntryIndex = -1;
+  private int draggedEntryIndex = -1;
   /** New position of the temporarily removed contact in the cache. */
-  private int mDropEntryIndex = -1;
+  private int dropEntryIndex = -1;
   /** New position of the temporarily entered contact in the cache. */
-  private int mDragEnteredEntryIndex = -1;
+  private int dragEnteredEntryIndex = -1;
 
-  private boolean mAwaitingRemove = false;
-  private boolean mDelayCursorUpdates = false;
-  private ContactPhotoManager mPhotoManager;
+  private boolean awaitingRemove = false;
+  private boolean delayCursorUpdates = false;
+  private ContactPhotoManager photoManager;
 
   /** Indicates whether a drag is in process. */
-  private boolean mInDragging = false;
+  private boolean inDragging = false;
 
   public PhoneFavoritesTileAdapter(
       Context context,
       ContactTileView.Listener listener,
       OnDataSetChangedForAnimationListener dataSetChangedListener) {
-    mDataSetChangedListener = dataSetChangedListener;
-    mListener = listener;
-    mContext = context;
-    mResources = context.getResources();
-    mContactsPreferences = new ContactsPreferences(mContext);
-    mNumFrequents = 0;
-    mContactEntries = new ArrayList<>();
+    this.dataSetChangedListener = dataSetChangedListener;
+    this.listener = listener;
+    this.context = context;
+    resources = context.getResources();
+    contactsPreferences = new ContactsPreferences(this.context);
+    numFrequents = 0;
+    contactEntries = new ArrayList<>();
   }
 
   void setPhotoLoader(ContactPhotoManager photoLoader) {
-    mPhotoManager = photoLoader;
+    photoManager = photoLoader;
   }
 
   /**
@@ -135,13 +135,13 @@
    * @param inDragging Boolean variable indicating whether there is a drag in process.
    */
   private void setInDragging(boolean inDragging) {
-    mDelayCursorUpdates = inDragging;
-    mInDragging = inDragging;
+    delayCursorUpdates = inDragging;
+    this.inDragging = inDragging;
   }
 
   void refreshContactsPreferences() {
-    mContactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
-    mContactsPreferences.refreshValue(ContactsPreferences.SORT_ORDER_KEY);
+    contactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
+    contactsPreferences.refreshValue(ContactsPreferences.SORT_ORDER_KEY);
   }
 
   /**
@@ -152,7 +152,7 @@
    * @param cursor The cursor to get number of frequents from.
    */
   private void saveNumFrequentsFromCursor(Cursor cursor) {
-    mNumFrequents = cursor.getCount() - mNumStarred;
+    numFrequents = cursor.getCount() - numStarred;
   }
 
   /**
@@ -161,10 +161,10 @@
    * <p>Else use {@link ContactTileLoaderFactory}
    */
   void setContactCursor(Cursor cursor) {
-    if (!mDelayCursorUpdates && cursor != null && !cursor.isClosed()) {
-      mNumStarred = getNumStarredContacts(cursor);
-      if (mAwaitingRemove) {
-        mDataSetChangedListener.cacheOffsetsForDatasetChange();
+    if (!delayCursorUpdates && cursor != null && !cursor.isClosed()) {
+      numStarred = getNumStarredContacts(cursor);
+      if (awaitingRemove) {
+        dataSetChangedListener.cacheOffsetsForDatasetChange();
       }
 
       saveNumFrequentsFromCursor(cursor);
@@ -172,7 +172,7 @@
       // cause a refresh of any views that rely on this data
       notifyDataSetChanged();
       // about to start redraw
-      mDataSetChangedListener.onDataSetChangedForAnimation();
+      dataSetChangedListener.onDataSetChangedForAnimation();
     }
   }
 
@@ -183,7 +183,7 @@
    *     view.
    */
   private void saveCursorToCache(Cursor cursor) {
-    mContactEntries.clear();
+    contactEntries.clear();
 
     if (cursor == null) {
       return;
@@ -250,12 +250,12 @@
 
         contact.id = id;
         contact.namePrimary =
-            (!TextUtils.isEmpty(name)) ? name : mResources.getString(R.string.missing_name);
+            (!TextUtils.isEmpty(name)) ? name : resources.getString(R.string.missing_name);
         contact.nameAlternative =
             (!TextUtils.isEmpty(nameAlternative))
                 ? nameAlternative
-                : mResources.getString(R.string.missing_name);
-        contact.nameDisplayOrder = mContactsPreferences.getDisplayOrder();
+                : resources.getString(R.string.missing_name);
+        contact.nameDisplayOrder = contactsPreferences.getDisplayOrder();
         contact.photoUri = (photoUri != null ? Uri.parse(photoUri) : null);
         contact.lookupKey = lookupKey;
         contact.lookupUri =
@@ -268,11 +268,11 @@
         final int phoneNumberType = cursor.getInt(phoneTypeColumn);
         final String phoneNumberCustomLabel = cursor.getString(phoneLabelColumn);
         contact.phoneLabel =
-            (String) Phone.getTypeLabel(mResources, phoneNumberType, phoneNumberCustomLabel);
+            (String) Phone.getTypeLabel(resources, phoneNumberType, phoneNumberCustomLabel);
         contact.phoneNumber = cursor.getString(phoneNumberColumn);
 
         contact.pinned = pinned;
-        mContactEntries.add(contact);
+        contactEntries.add(contact);
 
         // Set counts for logging
         if (isStarred) {
@@ -296,23 +296,23 @@
       } while (cursor.moveToNext());
     }
 
-    mAwaitingRemove = false;
+    awaitingRemove = false;
 
-    arrangeContactsByPinnedPosition(mContactEntries);
+    arrangeContactsByPinnedPosition(contactEntries);
 
-    ShortcutRefresher.refresh(mContext, mContactEntries);
+    ShortcutRefresher.refresh(context, contactEntries);
     notifyDataSetChanged();
 
-    Duo duo = DuoComponent.get(mContext).getDuo();
-    for (ContactEntry contact : mContactEntries) {
+    Duo duo = DuoComponent.get(context).getDuo();
+    for (ContactEntry contact : contactEntries) {
       if (contact.phoneNumber == null) {
         multipleNumbersContactsCount++;
-      } else if (duo.isReachable(mContext, contact.phoneNumber)) {
+      } else if (duo.isReachable(context, contact.phoneNumber)) {
         lightbringerReachableContactsCount++;
       }
     }
 
-    Logger.get(mContext)
+    Logger.get(context)
         .logSpeedDialContactComposition(
             counter,
             starredContactsCount,
@@ -366,16 +366,16 @@
 
   /** Returns the number of frequents that will be displayed in the list. */
   int getNumFrequents() {
-    return mNumFrequents;
+    return numFrequents;
   }
 
   @Override
   public int getCount() {
-    if (mContactEntries == null) {
+    if (contactEntries == null) {
       return 0;
     }
 
-    return mContactEntries.size();
+    return contactEntries.size();
   }
 
   /**
@@ -384,7 +384,7 @@
    */
   @Override
   public ContactEntry getItem(int position) {
-    return mContactEntries.get(position);
+    return contactEntries.get(position);
   }
 
   /**
@@ -435,10 +435,10 @@
 
     if (tileView == null) {
       tileView =
-          (PhoneFavoriteTileView) View.inflate(mContext, R.layout.phone_favorite_tile_view, null);
+          (PhoneFavoriteTileView) View.inflate(context, R.layout.phone_favorite_tile_view, null);
     }
-    tileView.setPhotoManager(mPhotoManager);
-    tileView.setListener(mListener);
+    tileView.setPhotoManager(photoManager);
+    tileView.setListener(listener);
     tileView.loadFromContact(getItem(position));
     tileView.setPosition(position);
     return tileView;
@@ -462,37 +462,37 @@
    */
   private void popContactEntry(int index) {
     if (isIndexInBound(index)) {
-      mDraggedEntry = mContactEntries.get(index);
-      mDraggedEntryIndex = index;
-      mDragEnteredEntryIndex = index;
-      markDropArea(mDragEnteredEntryIndex);
+      draggedEntry = contactEntries.get(index);
+      draggedEntryIndex = index;
+      dragEnteredEntryIndex = index;
+      markDropArea(dragEnteredEntryIndex);
     }
   }
 
   /**
-   * @param itemIndex Position of the contact in {@link #mContactEntries}.
-   * @return True if the given index is valid for {@link #mContactEntries}.
+   * @param itemIndex Position of the contact in {@link #contactEntries}.
+   * @return True if the given index is valid for {@link #contactEntries}.
    */
   boolean isIndexInBound(int itemIndex) {
-    return itemIndex >= 0 && itemIndex < mContactEntries.size();
+    return itemIndex >= 0 && itemIndex < contactEntries.size();
   }
 
   /**
-   * Mark the tile as drop area by given the item index in {@link #mContactEntries}.
+   * Mark the tile as drop area by given the item index in {@link #contactEntries}.
    *
-   * @param itemIndex Position of the contact in {@link #mContactEntries}.
+   * @param itemIndex Position of the contact in {@link #contactEntries}.
    */
   private void markDropArea(int itemIndex) {
-    if (mDraggedEntry != null
-        && isIndexInBound(mDragEnteredEntryIndex)
+    if (draggedEntry != null
+        && isIndexInBound(dragEnteredEntryIndex)
         && isIndexInBound(itemIndex)) {
-      mDataSetChangedListener.cacheOffsetsForDatasetChange();
+      dataSetChangedListener.cacheOffsetsForDatasetChange();
       // Remove the old placeholder item and place the new placeholder item.
-      mContactEntries.remove(mDragEnteredEntryIndex);
-      mDragEnteredEntryIndex = itemIndex;
-      mContactEntries.add(mDragEnteredEntryIndex, ContactEntry.BLANK_ENTRY);
-      ContactEntry.BLANK_ENTRY.id = mDraggedEntry.id;
-      mDataSetChangedListener.onDataSetChangedForAnimation();
+      contactEntries.remove(dragEnteredEntryIndex);
+      dragEnteredEntryIndex = itemIndex;
+      contactEntries.add(dragEnteredEntryIndex, ContactEntry.BLANK_ENTRY);
+      ContactEntry.BLANK_ENTRY.id = draggedEntry.id;
+      dataSetChangedListener.onDataSetChangedForAnimation();
       notifyDataSetChanged();
     }
   }
@@ -500,38 +500,38 @@
   /** Drops the temporarily removed contact to the desired location in the list. */
   private void handleDrop() {
     boolean changed = false;
-    if (mDraggedEntry != null) {
-      if (isIndexInBound(mDragEnteredEntryIndex) && mDragEnteredEntryIndex != mDraggedEntryIndex) {
+    if (draggedEntry != null) {
+      if (isIndexInBound(dragEnteredEntryIndex) && dragEnteredEntryIndex != draggedEntryIndex) {
         // Don't add the ContactEntry here (to prevent a double animation from occuring).
         // When we receive a new cursor the list of contact entries will automatically be
         // populated with the dragged ContactEntry at the correct spot.
-        mDropEntryIndex = mDragEnteredEntryIndex;
-        mContactEntries.set(mDropEntryIndex, mDraggedEntry);
-        mDataSetChangedListener.cacheOffsetsForDatasetChange();
+        dropEntryIndex = dragEnteredEntryIndex;
+        contactEntries.set(dropEntryIndex, draggedEntry);
+        dataSetChangedListener.cacheOffsetsForDatasetChange();
         changed = true;
-      } else if (isIndexInBound(mDraggedEntryIndex)) {
+      } else if (isIndexInBound(draggedEntryIndex)) {
         // If {@link #mDragEnteredEntryIndex} is invalid,
         // falls back to the original position of the contact.
-        mContactEntries.remove(mDragEnteredEntryIndex);
-        mContactEntries.add(mDraggedEntryIndex, mDraggedEntry);
-        mDropEntryIndex = mDraggedEntryIndex;
+        contactEntries.remove(dragEnteredEntryIndex);
+        contactEntries.add(draggedEntryIndex, draggedEntry);
+        dropEntryIndex = draggedEntryIndex;
         notifyDataSetChanged();
       }
 
-      if (changed && mDropEntryIndex < PIN_LIMIT) {
+      if (changed && dropEntryIndex < PIN_LIMIT) {
         final ArrayList<ContentProviderOperation> operations =
-            getReflowedPinningOperations(mContactEntries, mDraggedEntryIndex, mDropEntryIndex);
+            getReflowedPinningOperations(contactEntries, draggedEntryIndex, dropEntryIndex);
         if (!operations.isEmpty()) {
           // update the database here with the new pinned positions
           try {
-            mContext.getContentResolver().applyBatch(ContactsContract.AUTHORITY, operations);
-            Logger.get(mContext).logInteraction(InteractionEvent.Type.SPEED_DIAL_PIN_CONTACT);
+            context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, operations);
+            Logger.get(context).logInteraction(InteractionEvent.Type.SPEED_DIAL_PIN_CONTACT);
           } catch (RemoteException | OperationApplicationException e) {
             LogUtil.e(TAG, "Exception thrown when pinning contacts", e);
           }
         }
       }
-      mDraggedEntry = null;
+      draggedEntry = null;
     }
   }
 
@@ -543,7 +543,7 @@
     final ContentValues values = new ContentValues(2);
     values.put(Contacts.STARRED, false);
     values.put(Contacts.PINNED, PinnedPositions.DEMOTED);
-    mContext.getContentResolver().update(contactUri, values, null, null);
+    context.getContentResolver().update(contactUri, values, null, null);
   }
 
   /**
@@ -559,7 +559,7 @@
   @VisibleForTesting
   private void arrangeContactsByPinnedPosition(ArrayList<ContactEntry> toArrange) {
     final PriorityQueue<ContactEntry> pinnedQueue =
-        new PriorityQueue<>(PIN_LIMIT, mContactEntryComparator);
+        new PriorityQueue<>(PIN_LIMIT, contactEntryComparator);
 
     final List<ContactEntry> unpinnedContacts = new LinkedList<>();
 
@@ -643,7 +643,7 @@
   @Override
   public void onDragStarted(int x, int y, PhoneFavoriteSquareTileView view) {
     setInDragging(true);
-    final int itemIndex = mContactEntries.indexOf(view.getContactEntry());
+    final int itemIndex = contactEntries.indexOf(view.getContactEntry());
     popContactEntry(itemIndex);
   }
 
@@ -654,9 +654,9 @@
       // anything here.
       return;
     }
-    final int itemIndex = mContactEntries.indexOf(view.getContactEntry());
-    if (mInDragging
-        && mDragEnteredEntryIndex != itemIndex
+    final int itemIndex = contactEntries.indexOf(view.getContactEntry());
+    if (inDragging
+        && dragEnteredEntryIndex != itemIndex
         && isIndexInBound(itemIndex)
         && itemIndex < PIN_LIMIT
         && itemIndex >= 0) {
@@ -670,17 +670,17 @@
     // A contact has been dragged to the RemoveView in order to be unstarred,  so simply wait
     // for the new contact cursor which will cause the UI to be refreshed without the unstarred
     // contact.
-    if (!mAwaitingRemove) {
+    if (!awaitingRemove) {
       handleDrop();
     }
   }
 
   @Override
   public void onDroppedOnRemove() {
-    if (mDraggedEntry != null) {
-      unstarAndUnpinContact(mDraggedEntry.lookupUri);
-      mAwaitingRemove = true;
-      Logger.get(mContext).logInteraction(InteractionEvent.Type.SPEED_DIAL_REMOVE_CONTACT);
+    if (draggedEntry != null) {
+      unstarAndUnpinContact(draggedEntry.lookupUri);
+      awaitingRemove = true;
+      Logger.get(context).logInteraction(InteractionEvent.Type.SPEED_DIAL_REMOVE_CONTACT);
     }
   }
 
diff --git a/java/com/android/dialer/app/list/RegularSearchFragment.java b/java/com/android/dialer/app/list/RegularSearchFragment.java
index 48f77dc..d1927f0 100644
--- a/java/com/android/dialer/app/list/RegularSearchFragment.java
+++ b/java/com/android/dialer/app/list/RegularSearchFragment.java
@@ -48,7 +48,7 @@
   public static final int PERMISSION_REQUEST_CODE = 1;
 
   private static final int SEARCH_DIRECTORY_RESULT_LIMIT = 5;
-  protected String mPermissionToRequest;
+  protected String permissionToRequest;
 
   private DialerExecutor<CachedContactInfo> addContactTask;
 
@@ -104,7 +104,7 @@
 
   @Override
   protected void setupEmptyView() {
-    if (mEmptyView != null && getActivity() != null) {
+    if (emptyView != null && getActivity() != null) {
       final int imageResource;
       final int actionLabelResource;
       final int descriptionResource;
@@ -114,20 +114,20 @@
         actionLabelResource = R.string.permission_single_turn_on;
         descriptionResource = R.string.permission_no_search;
         listener = this;
-        mPermissionToRequest = READ_CONTACTS;
+        permissionToRequest = READ_CONTACTS;
       } else {
         imageResource = EmptyContentView.NO_IMAGE;
         actionLabelResource = EmptyContentView.NO_LABEL;
         descriptionResource = EmptyContentView.NO_LABEL;
         listener = null;
-        mPermissionToRequest = null;
+        permissionToRequest = null;
       }
 
-      mEmptyView.setImage(imageResource);
-      mEmptyView.setActionLabel(actionLabelResource);
-      mEmptyView.setDescription(descriptionResource);
+      emptyView.setImage(imageResource);
+      emptyView.setActionLabel(actionLabelResource);
+      emptyView.setDescription(descriptionResource);
       if (listener != null) {
-        mEmptyView.setActionClickedListener(listener);
+        emptyView.setActionClickedListener(listener);
       }
     }
   }
@@ -139,7 +139,7 @@
       return;
     }
 
-    if (READ_CONTACTS.equals(mPermissionToRequest)) {
+    if (READ_CONTACTS.equals(permissionToRequest)) {
       String[] deniedPermissions =
           PermissionsUtil.getPermissionsCurrentlyDenied(
               getContext(), PermissionsUtil.allContactsGroupPermissionsUsedInDialer);
diff --git a/java/com/android/dialer/app/list/RegularSearchListAdapter.java b/java/com/android/dialer/app/list/RegularSearchListAdapter.java
index 94544d2..aee68ae 100644
--- a/java/com/android/dialer/app/list/RegularSearchListAdapter.java
+++ b/java/com/android/dialer/app/list/RegularSearchListAdapter.java
@@ -31,7 +31,7 @@
 /** List adapter to display regular search results. */
 public class RegularSearchListAdapter extends DialerPhoneNumberListAdapter {
 
-  protected boolean mIsQuerySipAddress;
+  protected boolean isQuerySipAddress;
 
   public RegularSearchListAdapter(Context context) {
     super(context);
@@ -82,7 +82,7 @@
 
   @Override
   public String getFormattedQueryString() {
-    if (mIsQuerySipAddress) {
+    if (isQuerySipAddress) {
       // Return unnormalized SIP address
       return getQueryString();
     }
@@ -94,7 +94,7 @@
     // Don't show actions if the query string contains a letter.
     final boolean showNumberShortcuts =
         !TextUtils.isEmpty(getFormattedQueryString()) && hasDigitsInQueryString();
-    mIsQuerySipAddress = PhoneNumberHelper.isUriNumber(queryString);
+    isQuerySipAddress = PhoneNumberHelper.isUriNumber(queryString);
 
     if (isChanged(showNumberShortcuts)) {
       notifyDataSetChanged();
@@ -104,7 +104,7 @@
 
   protected boolean isChanged(boolean showNumberShortcuts) {
     boolean changed = false;
-    changed |= setShortcutEnabled(SHORTCUT_DIRECT_CALL, showNumberShortcuts || mIsQuerySipAddress);
+    changed |= setShortcutEnabled(SHORTCUT_DIRECT_CALL, showNumberShortcuts || isQuerySipAddress);
     changed |= setShortcutEnabled(SHORTCUT_SEND_SMS_MESSAGE, showNumberShortcuts);
     changed |=
         setShortcutEnabled(
diff --git a/java/com/android/dialer/app/list/RemoveView.java b/java/com/android/dialer/app/list/RemoveView.java
index 244f2da..ed133d4 100644
--- a/java/com/android/dialer/app/list/RemoveView.java
+++ b/java/com/android/dialer/app/list/RemoveView.java
@@ -29,12 +29,12 @@
 
 public class RemoveView extends FrameLayout {
 
-  DragDropController mDragDropController;
-  TextView mRemoveText;
-  ImageView mRemoveIcon;
-  int mUnhighlightedColor;
-  int mHighlightedColor;
-  Drawable mRemoveDrawable;
+  DragDropController dragDropController;
+  TextView removeText;
+  ImageView removeIcon;
+  int unhighlightedColor;
+  int highlightedColor;
+  Drawable removeDrawable;
 
   public RemoveView(Context context) {
     super(context);
@@ -50,16 +50,16 @@
 
   @Override
   protected void onFinishInflate() {
-    mRemoveText = (TextView) findViewById(R.id.remove_view_text);
-    mRemoveIcon = (ImageView) findViewById(R.id.remove_view_icon);
+    removeText = (TextView) findViewById(R.id.remove_view_text);
+    removeIcon = (ImageView) findViewById(R.id.remove_view_icon);
     final Resources r = getResources();
-    mUnhighlightedColor = r.getColor(R.color.remove_text_color);
-    mHighlightedColor = r.getColor(R.color.remove_highlighted_text_color);
-    mRemoveDrawable = r.getDrawable(R.drawable.ic_remove);
+    unhighlightedColor = r.getColor(R.color.remove_text_color);
+    highlightedColor = r.getColor(R.color.remove_highlighted_text_color);
+    removeDrawable = r.getDrawable(R.drawable.ic_remove);
   }
 
   public void setDragDropController(DragDropController controller) {
-    mDragDropController = controller;
+    dragDropController = controller;
   }
 
   @Override
@@ -76,14 +76,14 @@
         setAppearanceNormal();
         break;
       case DragEvent.ACTION_DRAG_LOCATION:
-        if (mDragDropController != null) {
-          mDragDropController.handleDragHovered(this, (int) event.getX(), (int) event.getY());
+        if (dragDropController != null) {
+          dragDropController.handleDragHovered(this, (int) event.getX(), (int) event.getY());
         }
         break;
       case DragEvent.ACTION_DROP:
         sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT);
-        if (mDragDropController != null) {
-          mDragDropController.handleDragFinished((int) event.getX(), (int) event.getY(), true);
+        if (dragDropController != null) {
+          dragDropController.handleDragFinished((int) event.getX(), (int) event.getY(), true);
         }
         setAppearanceNormal();
         break;
@@ -92,14 +92,14 @@
   }
 
   private void setAppearanceNormal() {
-    mRemoveText.setTextColor(mUnhighlightedColor);
-    mRemoveIcon.setColorFilter(mUnhighlightedColor);
+    removeText.setTextColor(unhighlightedColor);
+    removeIcon.setColorFilter(unhighlightedColor);
     invalidate();
   }
 
   private void setAppearanceHighlighted() {
-    mRemoveText.setTextColor(mHighlightedColor);
-    mRemoveIcon.setColorFilter(mHighlightedColor);
+    removeText.setTextColor(highlightedColor);
+    removeIcon.setColorFilter(highlightedColor);
     invalidate();
   }
 }
diff --git a/java/com/android/dialer/app/list/SearchFragment.java b/java/com/android/dialer/app/list/SearchFragment.java
index 9330fc8..afb6789 100644
--- a/java/com/android/dialer/app/list/SearchFragment.java
+++ b/java/com/android/dialer/app/list/SearchFragment.java
@@ -51,28 +51,28 @@
 
 public class SearchFragment extends PhoneNumberPickerFragment {
 
-  protected EmptyContentView mEmptyView;
-  private OnListFragmentScrolledListener mActivityScrollListener;
-  private View.OnTouchListener mActivityOnTouchListener;
+  protected EmptyContentView emptyView;
+  private OnListFragmentScrolledListener activityScrollListener;
+  private View.OnTouchListener activityOnTouchListener;
   /*
    * Stores the untouched user-entered string that is used to populate the add to contacts
    * intent.
    */
-  private String mAddToContactNumber;
-  private int mActionBarHeight;
-  private int mShadowHeight;
-  private int mPaddingTop;
-  private int mShowDialpadDuration;
-  private int mHideDialpadDuration;
+  private String addToContactNumber;
+  private int actionBarHeight;
+  private int shadowHeight;
+  private int paddingTop;
+  private int showDialpadDuration;
+  private int hideDialpadDuration;
   /**
    * Used to resize the list view containing search results so that it fits the available space
    * above the dialpad. Does not have a user-visible effect in regular touch usage (since the
    * dialpad hides that portion of the ListView anyway), but improves usability in accessibility
    * mode.
    */
-  private Space mSpacer;
+  private Space spacer;
 
-  private HostInterface mActivity;
+  private HostInterface activity;
 
   @Override
   public void onAttach(Activity activity) {
@@ -84,7 +84,7 @@
     setUseCallableUri(true);
 
     try {
-      mActivityScrollListener = (OnListFragmentScrolledListener) activity;
+      activityScrollListener = (OnListFragmentScrolledListener) activity;
     } catch (ClassCastException e) {
       LogUtil.v(
           "SearchFragment.onAttach",
@@ -99,25 +99,25 @@
     LogUtil.d("SearchFragment.onStart", "");
     super.onStart();
 
-    mActivity = (HostInterface) getActivity();
+    activity = (HostInterface) getActivity();
 
     final Resources res = getResources();
-    mActionBarHeight = mActivity.getActionBarHeight();
-    mShadowHeight = res.getDrawable(R.drawable.search_shadow).getIntrinsicHeight();
-    mPaddingTop = res.getDimensionPixelSize(R.dimen.search_list_padding_top);
-    mShowDialpadDuration = res.getInteger(R.integer.dialpad_slide_in_duration);
-    mHideDialpadDuration = res.getInteger(R.integer.dialpad_slide_out_duration);
+    actionBarHeight = activity.getActionBarHeight();
+    shadowHeight = res.getDrawable(R.drawable.search_shadow).getIntrinsicHeight();
+    paddingTop = res.getDimensionPixelSize(R.dimen.search_list_padding_top);
+    showDialpadDuration = res.getInteger(R.integer.dialpad_slide_in_duration);
+    hideDialpadDuration = res.getInteger(R.integer.dialpad_slide_out_duration);
 
     final ListView listView = getListView();
 
-    if (mEmptyView == null) {
+    if (emptyView == null) {
       if (this instanceof SmartDialSearchFragment) {
-        mEmptyView = new DialpadSearchEmptyContentView(getActivity());
+        emptyView = new DialpadSearchEmptyContentView(getActivity());
       } else {
-        mEmptyView = new EmptyContentView(getActivity());
+        emptyView = new EmptyContentView(getActivity());
       }
-      ((ViewGroup) getListView().getParent()).addView(mEmptyView);
-      getListView().setEmptyView(mEmptyView);
+      ((ViewGroup) getListView().getParent()).addView(emptyView);
+      getListView().setEmptyView(emptyView);
       setupEmptyView();
     }
 
@@ -133,8 +133,8 @@
         new OnScrollListener() {
           @Override
           public void onScrollStateChanged(AbsListView view, int scrollState) {
-            if (mActivityScrollListener != null) {
-              mActivityScrollListener.onListFragmentScrollStateChange(scrollState);
+            if (activityScrollListener != null) {
+              activityScrollListener.onListFragmentScrollStateChange(scrollState);
             }
           }
 
@@ -142,8 +142,8 @@
           public void onScroll(
               AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {}
         });
-    if (mActivityOnTouchListener != null) {
-      listView.setOnTouchListener(mActivityOnTouchListener);
+    if (activityOnTouchListener != null) {
+      listView.setOnTouchListener(activityOnTouchListener);
     }
 
     updatePosition(false /* animate */);
@@ -170,7 +170,7 @@
   }
 
   public void setAddToContactNumber(String addToContactNumber) {
-    mAddToContactNumber = addToContactNumber;
+    this.addToContactNumber = addToContactNumber;
   }
 
   /**
@@ -241,9 +241,9 @@
               .logImpression(DialerImpression.Type.CREATE_NEW_CONTACT_FROM_DIALPAD);
         }
         number =
-            TextUtils.isEmpty(mAddToContactNumber)
+            TextUtils.isEmpty(addToContactNumber)
                 ? adapter.getFormattedQueryString()
-                : mAddToContactNumber;
+                : addToContactNumber;
         intent = IntentUtil.getNewContactIntent(number);
         DialerUtils.startActivityWithErrorToast(getActivity(), intent);
         break;
@@ -253,24 +253,24 @@
               .logImpression(DialerImpression.Type.ADD_TO_A_CONTACT_FROM_DIALPAD);
         }
         number =
-            TextUtils.isEmpty(mAddToContactNumber)
+            TextUtils.isEmpty(addToContactNumber)
                 ? adapter.getFormattedQueryString()
-                : mAddToContactNumber;
+                : addToContactNumber;
         intent = IntentUtil.getAddToExistingContactIntent(number);
         DialerUtils.startActivityWithErrorToast(
             getActivity(), intent, R.string.add_contact_not_available);
         break;
       case DialerPhoneNumberListAdapter.SHORTCUT_SEND_SMS_MESSAGE:
         number =
-            TextUtils.isEmpty(mAddToContactNumber)
+            TextUtils.isEmpty(addToContactNumber)
                 ? adapter.getFormattedQueryString()
-                : mAddToContactNumber;
+                : addToContactNumber;
         intent = IntentUtil.getSendSmsIntent(number);
         DialerUtils.startActivityWithErrorToast(getActivity(), intent);
         break;
       case DialerPhoneNumberListAdapter.SHORTCUT_MAKE_VIDEO_CALL:
         number =
-            TextUtils.isEmpty(mAddToContactNumber) ? adapter.getQueryString() : mAddToContactNumber;
+            TextUtils.isEmpty(addToContactNumber) ? adapter.getQueryString() : addToContactNumber;
         listener = getOnPhoneNumberPickerListener();
         if (listener != null && !checkForProhibitedPhoneNumber(number)) {
           CallSpecificAppData callSpecificAppData =
@@ -296,25 +296,25 @@
    */
   public void updatePosition(boolean animate) {
     LogUtil.d("SearchFragment.updatePosition", "animate: %b", animate);
-    if (mActivity == null) {
+    if (activity == null) {
       // Activity will be set in onStart, and this method will be called again
       return;
     }
 
     // Use negative shadow height instead of 0 to account for the 9-patch's shadow.
     int startTranslationValue =
-        mActivity.isDialpadShown() ? mActionBarHeight - mShadowHeight : -mShadowHeight;
+        activity.isDialpadShown() ? actionBarHeight - shadowHeight : -shadowHeight;
     int endTranslationValue = 0;
     // Prevents ListView from being translated down after a rotation when the ActionBar is up.
-    if (animate || mActivity.isActionBarShowing()) {
-      endTranslationValue = mActivity.isDialpadShown() ? 0 : mActionBarHeight - mShadowHeight;
+    if (animate || activity.isActionBarShowing()) {
+      endTranslationValue = activity.isDialpadShown() ? 0 : actionBarHeight - shadowHeight;
     }
     if (animate) {
       // If the dialpad will be shown, then this animation involves sliding the list up.
-      final boolean slideUp = mActivity.isDialpadShown();
+      final boolean slideUp = activity.isDialpadShown();
 
       Interpolator interpolator = slideUp ? AnimUtils.EASE_IN : AnimUtils.EASE_OUT;
-      int duration = slideUp ? mShowDialpadDuration : mHideDialpadDuration;
+      int duration = slideUp ? showDialpadDuration : hideDialpadDuration;
       getView().setTranslationY(startTranslationValue);
       getView()
           .animate()
@@ -344,7 +344,7 @@
     }
 
     // There is padding which should only be applied when the dialpad is not shown.
-    int paddingTop = mActivity.isDialpadShown() ? 0 : mPaddingTop;
+    int paddingTop = activity.isDialpadShown() ? 0 : this.paddingTop;
     final ListView listView = getListView();
     listView.setPaddingRelative(
         listView.getPaddingStart(),
@@ -354,21 +354,21 @@
   }
 
   public void resizeListView() {
-    if (mSpacer == null) {
+    if (spacer == null) {
       return;
     }
-    int spacerHeight = mActivity.isDialpadShown() ? mActivity.getDialpadHeight() : 0;
+    int spacerHeight = activity.isDialpadShown() ? activity.getDialpadHeight() : 0;
     LogUtil.d(
         "SearchFragment.resizeListView",
         "spacerHeight: %d -> %d, isDialpadShown: %b, dialpad height: %d",
-        mSpacer.getHeight(),
+        spacer.getHeight(),
         spacerHeight,
-        mActivity.isDialpadShown(),
-        mActivity.getDialpadHeight());
-    if (spacerHeight != mSpacer.getHeight()) {
-      final LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mSpacer.getLayoutParams();
+        activity.isDialpadShown(),
+        activity.getDialpadHeight());
+    if (spacerHeight != spacer.getHeight()) {
+      final LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) spacer.getLayoutParams();
       lp.height = spacerHeight;
-      mSpacer.setLayoutParams(lp);
+      spacer.setLayoutParams(lp);
     }
   }
 
@@ -395,7 +395,7 @@
   }
 
   public void setOnTouchListener(View.OnTouchListener onTouchListener) {
-    mActivityOnTouchListener = onTouchListener;
+    activityOnTouchListener = onTouchListener;
   }
 
   @Override
@@ -403,9 +403,9 @@
     final LinearLayout parent = (LinearLayout) super.inflateView(inflater, container);
     final int orientation = getResources().getConfiguration().orientation;
     if (orientation == Configuration.ORIENTATION_PORTRAIT) {
-      mSpacer = new Space(getActivity());
+      spacer = new Space(getActivity());
       parent.addView(
-          mSpacer, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0));
+          spacer, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0));
     }
     return parent;
   }
diff --git a/java/com/android/dialer/app/list/SmartDialNumberListAdapter.java b/java/com/android/dialer/app/list/SmartDialNumberListAdapter.java
index 1d2cda3..c84bff7 100644
--- a/java/com/android/dialer/app/list/SmartDialNumberListAdapter.java
+++ b/java/com/android/dialer/app/list/SmartDialNumberListAdapter.java
@@ -34,13 +34,13 @@
   private static final String TAG = SmartDialNumberListAdapter.class.getSimpleName();
   private static final boolean DEBUG = false;
 
-  private final Context mContext;
-  @NonNull private final SmartDialNameMatcher mNameMatcher;
+  private final Context context;
+  @NonNull private final SmartDialNameMatcher nameMatcher;
 
   public SmartDialNumberListAdapter(Context context) {
     super(context);
-    mContext = context;
-    mNameMatcher = new SmartDialNameMatcher("");
+    this.context = context;
+    nameMatcher = new SmartDialNameMatcher("");
     setShortcutEnabled(SmartDialNumberListAdapter.SHORTCUT_DIRECT_CALL, false);
 
     if (DEBUG) {
@@ -56,10 +56,10 @@
 
     if (getQueryString() == null) {
       loader.configureQuery("");
-      mNameMatcher.setQuery("");
+      nameMatcher.setQuery("");
     } else {
       loader.configureQuery(getQueryString());
-      mNameMatcher.setQuery(PhoneNumberUtils.normalizeNumber(getQueryString()));
+      nameMatcher.setQuery(PhoneNumberUtils.normalizeNumber(getQueryString()));
     }
   }
 
@@ -73,8 +73,8 @@
   protected void setHighlight(ContactListItemView view, Cursor cursor) {
     view.clearHighlightSequences();
 
-    if (mNameMatcher.matches(mContext, cursor.getString(PhoneQuery.DISPLAY_NAME))) {
-      final ArrayList<SmartDialMatchPosition> nameMatches = mNameMatcher.getMatchPositions();
+    if (nameMatcher.matches(context, cursor.getString(PhoneQuery.DISPLAY_NAME))) {
+      final ArrayList<SmartDialMatchPosition> nameMatches = nameMatcher.getMatchPositions();
       for (SmartDialMatchPosition match : nameMatches) {
         view.addNameHighlightSequence(match.start, match.end);
         if (DEBUG) {
@@ -82,7 +82,7 @@
               TAG,
               cursor.getString(PhoneQuery.DISPLAY_NAME)
                   + " "
-                  + mNameMatcher.getQuery()
+                  + nameMatcher.getQuery()
                   + " "
                   + String.valueOf(match.start));
         }
@@ -90,7 +90,7 @@
     }
 
     final SmartDialMatchPosition numberMatch =
-        mNameMatcher.matchesNumber(mContext, cursor.getString(PhoneQuery.PHONE_NUMBER));
+        nameMatcher.matchesNumber(context, cursor.getString(PhoneQuery.PHONE_NUMBER));
     if (numberMatch != null) {
       view.addNumberHighlightSequence(numberMatch.start, numberMatch.end);
     }
@@ -113,6 +113,6 @@
   }
 
   public void setShowEmptyListForNullQuery(boolean show) {
-    mNameMatcher.setShouldMatchEmptyQuery(!show);
+    nameMatcher.setShouldMatchEmptyQuery(!show);
   }
 }
diff --git a/java/com/android/dialer/app/list/SmartDialSearchFragment.java b/java/com/android/dialer/app/list/SmartDialSearchFragment.java
index 1a7f195..fdf0b5a 100644
--- a/java/com/android/dialer/app/list/SmartDialSearchFragment.java
+++ b/java/com/android/dialer/app/list/SmartDialSearchFragment.java
@@ -43,7 +43,7 @@
 
   private static final int CALL_PHONE_PERMISSION_REQUEST_CODE = 1;
 
-  private final BroadcastReceiver mSmartDialUpdatedReceiver =
+  private final BroadcastReceiver smartDialUpdatedReceiver =
       new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
@@ -87,16 +87,16 @@
 
   @Override
   protected void setupEmptyView() {
-    if (mEmptyView != null && getActivity() != null) {
+    if (emptyView != null && getActivity() != null) {
       if (!PermissionsUtil.hasPermission(getActivity(), CALL_PHONE)) {
-        mEmptyView.setImage(R.drawable.empty_contacts);
-        mEmptyView.setActionLabel(R.string.permission_single_turn_on);
-        mEmptyView.setDescription(R.string.permission_place_call);
-        mEmptyView.setActionClickedListener(this);
+        emptyView.setImage(R.drawable.empty_contacts);
+        emptyView.setActionLabel(R.string.permission_single_turn_on);
+        emptyView.setDescription(R.string.permission_place_call);
+        emptyView.setActionClickedListener(this);
       } else {
-        mEmptyView.setImage(EmptyContentView.NO_IMAGE);
-        mEmptyView.setActionLabel(EmptyContentView.NO_LABEL);
-        mEmptyView.setDescription(EmptyContentView.NO_LABEL);
+        emptyView.setImage(EmptyContentView.NO_IMAGE);
+        emptyView.setActionLabel(EmptyContentView.NO_LABEL);
+        emptyView.setDescription(EmptyContentView.NO_LABEL);
       }
     }
   }
@@ -109,7 +109,7 @@
 
     getActivity()
         .registerReceiver(
-            mSmartDialUpdatedReceiver,
+            smartDialUpdatedReceiver,
             new IntentFilter(DialerDatabaseHelper.ACTION_SMART_DIAL_UPDATED));
   }
 
@@ -119,7 +119,7 @@
 
     LogUtil.i("SmartDialSearchFragment.onStop", "unregistering smart dial update receiver");
 
-    getActivity().unregisterReceiver(mSmartDialUpdatedReceiver);
+    getActivity().unregisterReceiver(smartDialUpdatedReceiver);
   }
 
   @Override
@@ -155,7 +155,7 @@
   }
 
   public boolean isShowingPermissionRequest() {
-    return mEmptyView != null && mEmptyView.isShowingContent();
+    return emptyView != null && emptyView.isShowingContent();
   }
 
   @Override
diff --git a/java/com/android/dialer/app/settings/AppCompatPreferenceActivity.java b/java/com/android/dialer/app/settings/AppCompatPreferenceActivity.java
index e8e4256..b2cb03e 100644
--- a/java/com/android/dialer/app/settings/AppCompatPreferenceActivity.java
+++ b/java/com/android/dialer/app/settings/AppCompatPreferenceActivity.java
@@ -30,16 +30,16 @@
  */
 public class AppCompatPreferenceActivity extends PreferenceActivity {
 
-  private AppCompatDelegate mDelegate;
+  private AppCompatDelegate delegate;
 
-  private boolean mIsSafeToCommitTransactions;
+  private boolean isSafeToCommitTransactions;
 
   @Override
   protected void onCreate(Bundle savedInstanceState) {
     getDelegate().installViewFactory();
     getDelegate().onCreate(savedInstanceState);
     super.onCreate(savedInstanceState);
-    mIsSafeToCommitTransactions = true;
+    isSafeToCommitTransactions = true;
   }
 
   @Override
@@ -113,28 +113,28 @@
   }
 
   private AppCompatDelegate getDelegate() {
-    if (mDelegate == null) {
-      mDelegate = AppCompatDelegate.create(this, null);
+    if (delegate == null) {
+      delegate = AppCompatDelegate.create(this, null);
     }
-    return mDelegate;
+    return delegate;
   }
 
   @Override
   protected void onStart() {
     super.onStart();
-    mIsSafeToCommitTransactions = true;
+    isSafeToCommitTransactions = true;
   }
 
   @Override
   protected void onResume() {
     super.onResume();
-    mIsSafeToCommitTransactions = true;
+    isSafeToCommitTransactions = true;
   }
 
   @Override
   protected void onSaveInstanceState(Bundle outState) {
     super.onSaveInstanceState(outState);
-    mIsSafeToCommitTransactions = false;
+    isSafeToCommitTransactions = false;
   }
 
   /**
@@ -145,6 +145,6 @@
    * outState)} (if that method is overridden), so the flag is properly set.
    */
   public boolean isSafeToCommitTransactions() {
-    return mIsSafeToCommitTransactions;
+    return isSafeToCommitTransactions;
   }
 }
diff --git a/java/com/android/dialer/app/settings/DialerSettingsActivity.java b/java/com/android/dialer/app/settings/DialerSettingsActivity.java
index fc56fa7..cbd9e79 100644
--- a/java/com/android/dialer/app/settings/DialerSettingsActivity.java
+++ b/java/com/android/dialer/app/settings/DialerSettingsActivity.java
@@ -50,7 +50,7 @@
 @UsedByReflection(value = "AndroidManifest-app.xml")
 public class DialerSettingsActivity extends AppCompatPreferenceActivity {
 
-  protected SharedPreferences mPreferences;
+  protected SharedPreferences preferences;
   private boolean migrationStatusOnBuildHeaders;
   private List<Header> headers;
 
@@ -58,7 +58,7 @@
   protected void onCreate(Bundle savedInstanceState) {
     LogUtil.enterBlock("DialerSettingsActivity.onCreate");
     super.onCreate(savedInstanceState);
-    mPreferences = PreferenceManager.getDefaultSharedPreferences(this.getApplicationContext());
+    preferences = PreferenceManager.getDefaultSharedPreferences(this.getApplicationContext());
 
     Intent intent = getIntent();
     Uri data = intent.getData();
diff --git a/java/com/android/dialer/app/settings/SoundSettingsFragment.java b/java/com/android/dialer/app/settings/SoundSettingsFragment.java
index dcfb7a5..19cddbc 100644
--- a/java/com/android/dialer/app/settings/SoundSettingsFragment.java
+++ b/java/com/android/dialer/app/settings/SoundSettingsFragment.java
@@ -49,28 +49,28 @@
 
   private static final int MSG_UPDATE_RINGTONE_SUMMARY = 1;
 
-  private Preference mRingtonePreference;
-  private final Handler mRingtoneLookupComplete =
+  private Preference ringtonePreference;
+  private final Handler ringtoneLookupComplete =
       new Handler() {
         @Override
         public void handleMessage(Message msg) {
           switch (msg.what) {
             case MSG_UPDATE_RINGTONE_SUMMARY:
-              mRingtonePreference.setSummary((CharSequence) msg.obj);
+              ringtonePreference.setSummary((CharSequence) msg.obj);
               break;
           }
         }
       };
-  private final Runnable mRingtoneLookupRunnable =
+  private final Runnable ringtoneLookupRunnable =
       new Runnable() {
         @Override
         public void run() {
           updateRingtonePreferenceSummary();
         }
       };
-  private SwitchPreference mVibrateWhenRinging;
-  private SwitchPreference mPlayDtmfTone;
-  private ListPreference mDtmfToneLength;
+  private SwitchPreference vibrateWhenRinging;
+  private SwitchPreference playDtmfTone;
+  private ListPreference dtmfToneLength;
 
   @Override
   public Context getContext() {
@@ -85,39 +85,39 @@
 
     Context context = getActivity();
 
-    mRingtonePreference = findPreference(context.getString(R.string.ringtone_preference_key));
-    mVibrateWhenRinging =
+    ringtonePreference = findPreference(context.getString(R.string.ringtone_preference_key));
+    vibrateWhenRinging =
         (SwitchPreference) findPreference(context.getString(R.string.vibrate_on_preference_key));
-    mPlayDtmfTone =
+    playDtmfTone =
         (SwitchPreference) findPreference(context.getString(R.string.play_dtmf_preference_key));
-    mDtmfToneLength =
+    dtmfToneLength =
         (ListPreference)
             findPreference(context.getString(R.string.dtmf_tone_length_preference_key));
 
     if (hasVibrator()) {
-      mVibrateWhenRinging.setOnPreferenceChangeListener(this);
+      vibrateWhenRinging.setOnPreferenceChangeListener(this);
     } else {
-      getPreferenceScreen().removePreference(mVibrateWhenRinging);
-      mVibrateWhenRinging = null;
+      getPreferenceScreen().removePreference(vibrateWhenRinging);
+      vibrateWhenRinging = null;
     }
 
-    mPlayDtmfTone.setOnPreferenceChangeListener(this);
-    mPlayDtmfTone.setChecked(shouldPlayDtmfTone());
+    playDtmfTone.setOnPreferenceChangeListener(this);
+    playDtmfTone.setChecked(shouldPlayDtmfTone());
 
     TelephonyManager telephonyManager =
         (TelephonyManager) getActivity().getSystemService(Context.TELEPHONY_SERVICE);
     if (SdkVersionOverride.getSdkVersion(Build.VERSION_CODES.M) >= Build.VERSION_CODES.M
         && telephonyManager.canChangeDtmfToneLength()
         && (telephonyManager.isWorldPhone() || !shouldHideCarrierSettings())) {
-      mDtmfToneLength.setOnPreferenceChangeListener(this);
-      mDtmfToneLength.setValueIndex(
+      dtmfToneLength.setOnPreferenceChangeListener(this);
+      dtmfToneLength.setValueIndex(
           Settings.System.getInt(
               context.getContentResolver(),
               Settings.System.DTMF_TONE_TYPE_WHEN_DIALING,
               DTMF_TONE_TYPE_NORMAL));
     } else {
-      getPreferenceScreen().removePreference(mDtmfToneLength);
-      mDtmfToneLength = null;
+      getPreferenceScreen().removePreference(dtmfToneLength);
+      dtmfToneLength = null;
     }
   }
 
@@ -132,12 +132,12 @@
       return;
     }
 
-    if (mVibrateWhenRinging != null) {
-      mVibrateWhenRinging.setChecked(shouldVibrateWhenRinging());
+    if (vibrateWhenRinging != null) {
+      vibrateWhenRinging.setChecked(shouldVibrateWhenRinging());
     }
 
     // Lookup the ringtone name asynchronously.
-    new Thread(mRingtoneLookupRunnable).start();
+    new Thread(ringtoneLookupRunnable).start();
   }
 
   /**
@@ -157,14 +157,14 @@
           .show();
       return true;
     }
-    if (preference == mVibrateWhenRinging) {
+    if (preference == vibrateWhenRinging) {
       boolean doVibrate = (Boolean) objValue;
       Settings.System.putInt(
           getActivity().getContentResolver(),
           Settings.System.VIBRATE_WHEN_RINGING,
           doVibrate ? DO_VIBRATION_FOR_CALLS : NO_VIBRATION_FOR_CALLS);
-    } else if (preference == mDtmfToneLength) {
-      int index = mDtmfToneLength.findIndexOfValue((String) objValue);
+    } else if (preference == dtmfToneLength) {
+      int index = dtmfToneLength.findIndexOfValue((String) objValue);
       Settings.System.putInt(
           getActivity().getContentResolver(), Settings.System.DTMF_TONE_TYPE_WHEN_DIALING, index);
     }
@@ -182,11 +182,11 @@
           .show();
       return true;
     }
-    if (preference == mPlayDtmfTone) {
+    if (preference == playDtmfTone) {
       Settings.System.putInt(
           getActivity().getContentResolver(),
           Settings.System.DTMF_TONE_WHEN_DIALING,
-          mPlayDtmfTone.isChecked() ? PLAY_DTMF_TONE : NO_DTMF_TONE);
+          playDtmfTone.isChecked() ? PLAY_DTMF_TONE : NO_DTMF_TONE);
     }
     return true;
   }
@@ -195,9 +195,9 @@
   private void updateRingtonePreferenceSummary() {
     SettingsUtil.updateRingtoneName(
         getActivity(),
-        mRingtoneLookupComplete,
+        ringtoneLookupComplete,
         RingtoneManager.TYPE_RINGTONE,
-        mRingtonePreference.getKey(),
+        ringtonePreference.getKey(),
         MSG_UPDATE_RINGTONE_SUMMARY);
   }
 
diff --git a/java/com/android/dialer/app/voicemail/VoicemailAudioManager.java b/java/com/android/dialer/app/voicemail/VoicemailAudioManager.java
index d3c3820..79716cb 100644
--- a/java/com/android/dialer/app/voicemail/VoicemailAudioManager.java
+++ b/java/com/android/dialer/app/voicemail/VoicemailAudioManager.java
@@ -32,28 +32,28 @@
 
   public static final int PLAYBACK_STREAM = AudioManager.STREAM_VOICE_CALL;
 
-  private AudioManager mAudioManager;
-  private VoicemailPlaybackPresenter mVoicemailPlaybackPresenter;
-  private WiredHeadsetManager mWiredHeadsetManager;
-  private boolean mWasSpeakerOn;
-  private CallAudioState mCallAudioState;
-  private boolean mBluetoothScoEnabled;
+  private AudioManager audioManager;
+  private VoicemailPlaybackPresenter voicemailPlaybackPresenter;
+  private WiredHeadsetManager wiredHeadsetManager;
+  private boolean wasSpeakerOn;
+  private CallAudioState callAudioState;
+  private boolean bluetoothScoEnabled;
 
   public VoicemailAudioManager(
       Context context, VoicemailPlaybackPresenter voicemailPlaybackPresenter) {
-    mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
-    mVoicemailPlaybackPresenter = voicemailPlaybackPresenter;
-    mWiredHeadsetManager = new WiredHeadsetManager(context);
-    mWiredHeadsetManager.setListener(this);
+    audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
+    this.voicemailPlaybackPresenter = voicemailPlaybackPresenter;
+    wiredHeadsetManager = new WiredHeadsetManager(context);
+    wiredHeadsetManager.setListener(this);
 
-    mCallAudioState = getInitialAudioState();
+    callAudioState = getInitialAudioState();
     LogUtil.i(
-        "VoicemailAudioManager.VoicemailAudioManager", "Initial audioState = " + mCallAudioState);
+        "VoicemailAudioManager.VoicemailAudioManager", "Initial audioState = " + callAudioState);
   }
 
   public void requestAudioFocus() {
     int result =
-        mAudioManager.requestAudioFocus(
+        audioManager.requestAudioFocus(
             this, PLAYBACK_STREAM, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
     if (result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
       throw new RejectedExecutionException("Could not capture audio focus.");
@@ -63,13 +63,13 @@
 
   public void abandonAudioFocus() {
     updateBluetoothScoState(false);
-    mAudioManager.abandonAudioFocus(this);
+    audioManager.abandonAudioFocus(this);
   }
 
   @Override
   public void onAudioFocusChange(int focusChange) {
     LogUtil.d("VoicemailAudioManager.onAudioFocusChange", "focusChange=" + focusChange);
-    mVoicemailPlaybackPresenter.onAudioFocusChange(focusChange == AudioManager.AUDIOFOCUS_GAIN);
+    voicemailPlaybackPresenter.onAudioFocusChange(focusChange == AudioManager.AUDIOFOCUS_GAIN);
   }
 
   @Override
@@ -82,19 +82,19 @@
       return;
     }
 
-    int newRoute = mCallAudioState.getRoute(); // start out with existing route
+    int newRoute = callAudioState.getRoute(); // start out with existing route
     if (newIsPluggedIn) {
       newRoute = CallAudioState.ROUTE_WIRED_HEADSET;
     } else {
-      mVoicemailPlaybackPresenter.pausePlayback();
-      if (mWasSpeakerOn) {
+      voicemailPlaybackPresenter.pausePlayback();
+      if (wasSpeakerOn) {
         newRoute = CallAudioState.ROUTE_SPEAKER;
       } else {
         newRoute = CallAudioState.ROUTE_EARPIECE;
       }
     }
 
-    mVoicemailPlaybackPresenter.setSpeakerphoneOn(newRoute == CallAudioState.ROUTE_SPEAKER);
+    voicemailPlaybackPresenter.setSpeakerphoneOn(newRoute == CallAudioState.ROUTE_SPEAKER);
 
     // We need to call this every time even if we do not change the route because the supported
     // routes changed either to include or not include WIRED_HEADSET.
@@ -107,16 +107,16 @@
   }
 
   public boolean isWiredHeadsetPluggedIn() {
-    return mWiredHeadsetManager.isPluggedIn();
+    return wiredHeadsetManager.isPluggedIn();
   }
 
   public void registerReceivers() {
     // Receivers is plural because we expect to add bluetooth support.
-    mWiredHeadsetManager.registerReceiver();
+    wiredHeadsetManager.registerReceiver();
   }
 
   public void unregisterReceivers() {
-    mWiredHeadsetManager.unregisterReceiver();
+    wiredHeadsetManager.unregisterReceiver();
   }
 
   /**
@@ -127,34 +127,34 @@
   private void updateBluetoothScoState(boolean hasAudioFocus) {
     if (hasAudioFocus) {
       if (hasMediaAudioCapability()) {
-        mBluetoothScoEnabled = false;
+        bluetoothScoEnabled = false;
       } else {
-        mBluetoothScoEnabled = true;
+        bluetoothScoEnabled = true;
         LogUtil.i(
             "VoicemailAudioManager.updateBluetoothScoState",
             "bluetooth device doesn't support media, using SCO instead");
       }
     } else {
-      mBluetoothScoEnabled = false;
+      bluetoothScoEnabled = false;
     }
     applyBluetoothScoState();
   }
 
   private void applyBluetoothScoState() {
-    if (mBluetoothScoEnabled) {
-      mAudioManager.startBluetoothSco();
+    if (bluetoothScoEnabled) {
+      audioManager.startBluetoothSco();
       // The doc for startBluetoothSco() states it could take seconds to establish the SCO
       // connection, so we should probably resume the playback after we've acquired SCO.
       // In practice the delay is unnoticeable so this is ignored for simplicity.
-      mAudioManager.setBluetoothScoOn(true);
+      audioManager.setBluetoothScoOn(true);
     } else {
-      mAudioManager.setBluetoothScoOn(false);
-      mAudioManager.stopBluetoothSco();
+      audioManager.setBluetoothScoOn(false);
+      audioManager.stopBluetoothSco();
     }
   }
 
   private boolean hasMediaAudioCapability() {
-    for (AudioDeviceInfo info : mAudioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS)) {
+    for (AudioDeviceInfo info : audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS)) {
       if (info.getType() == AudioDeviceInfo.TYPE_BLUETOOTH_A2DP) {
         return true;
       }
@@ -173,10 +173,10 @@
         "route: " + CallAudioState.audioRouteToString(route));
 
     // Change ROUTE_WIRED_OR_EARPIECE to a single entry.
-    int newRoute = selectWiredOrEarpiece(route, mCallAudioState.getSupportedRouteMask());
+    int newRoute = selectWiredOrEarpiece(route, callAudioState.getSupportedRouteMask());
 
     // If route is unsupported, do nothing.
-    if ((mCallAudioState.getSupportedRouteMask() | newRoute) == 0) {
+    if ((callAudioState.getSupportedRouteMask() | newRoute) == 0) {
       LogUtil.w(
           "VoicemailAudioManager.setAudioRoute",
           "Asking to set to a route that is unsupported: " + newRoute);
@@ -185,9 +185,9 @@
 
     // Remember the new speaker state so it can be restored when the user plugs and unplugs
     // a headset.
-    mWasSpeakerOn = newRoute == CallAudioState.ROUTE_SPEAKER;
+    wasSpeakerOn = newRoute == CallAudioState.ROUTE_SPEAKER;
     setSystemAudioState(
-        new CallAudioState(false /* muted */, newRoute, mCallAudioState.getSupportedRouteMask()));
+        new CallAudioState(false /* muted */, newRoute, callAudioState.getSupportedRouteMask()));
   }
 
   private CallAudioState getInitialAudioState() {
@@ -198,7 +198,7 @@
 
   private int calculateSupportedRoutes() {
     int routeMask = CallAudioState.ROUTE_SPEAKER;
-    if (mWiredHeadsetManager.isPluggedIn()) {
+    if (wiredHeadsetManager.isPluggedIn()) {
       routeMask |= CallAudioState.ROUTE_WIRED_HEADSET;
     } else {
       routeMask |= CallAudioState.ROUTE_EARPIECE;
@@ -224,18 +224,18 @@
   }
 
   private void setSystemAudioState(CallAudioState callAudioState) {
-    CallAudioState oldAudioState = mCallAudioState;
-    mCallAudioState = callAudioState;
+    CallAudioState oldAudioState = this.callAudioState;
+    this.callAudioState = callAudioState;
 
     LogUtil.i(
         "VoicemailAudioManager.setSystemAudioState",
-        "changing from " + oldAudioState + " to " + mCallAudioState);
+        "changing from " + oldAudioState + " to " + this.callAudioState);
 
     // Audio route.
-    if (mCallAudioState.getRoute() == CallAudioState.ROUTE_SPEAKER) {
+    if (this.callAudioState.getRoute() == CallAudioState.ROUTE_SPEAKER) {
       turnOnSpeaker(true);
-    } else if (mCallAudioState.getRoute() == CallAudioState.ROUTE_EARPIECE
-        || mCallAudioState.getRoute() == CallAudioState.ROUTE_WIRED_HEADSET) {
+    } else if (this.callAudioState.getRoute() == CallAudioState.ROUTE_EARPIECE
+        || this.callAudioState.getRoute() == CallAudioState.ROUTE_WIRED_HEADSET) {
       // Just handle turning off the speaker, the system will handle switching between wired
       // headset and earpiece.
       turnOnSpeaker(false);
@@ -245,9 +245,9 @@
   }
 
   private void turnOnSpeaker(boolean on) {
-    if (mAudioManager.isSpeakerphoneOn() != on) {
+    if (audioManager.isSpeakerphoneOn() != on) {
       LogUtil.i("VoicemailAudioManager.turnOnSpeaker", "turning speaker phone on: " + on);
-      mAudioManager.setSpeakerphoneOn(on);
+      audioManager.setSpeakerphoneOn(on);
     }
   }
 }
diff --git a/java/com/android/dialer/app/voicemail/VoicemailPlaybackLayout.java b/java/com/android/dialer/app/voicemail/VoicemailPlaybackLayout.java
index 9c1e446..010f55f 100644
--- a/java/com/android/dialer/app/voicemail/VoicemailPlaybackLayout.java
+++ b/java/com/android/dialer/app/voicemail/VoicemailPlaybackLayout.java
@@ -58,27 +58,27 @@
   private static final String TAG = VoicemailPlaybackLayout.class.getSimpleName();
   private static final int VOICEMAIL_DELETE_DELAY_MS = 3000;
 
-  private Context mContext;
-  private CallLogListItemViewHolder mViewHolder;
-  private VoicemailPlaybackPresenter mPresenter;
+  private Context context;
+  private CallLogListItemViewHolder viewHolder;
+  private VoicemailPlaybackPresenter presenter;
   /** Click listener to toggle speakerphone. */
-  private final View.OnClickListener mSpeakerphoneListener =
+  private final View.OnClickListener speakerphoneListener =
       new View.OnClickListener() {
         @Override
         public void onClick(View v) {
-          if (mPresenter != null) {
-            mPresenter.toggleSpeakerphone();
+          if (presenter != null) {
+            presenter.toggleSpeakerphone();
           }
         }
       };
 
-  private Uri mVoicemailUri;
-  private final View.OnClickListener mDeleteButtonListener =
+  private Uri voicemailUri;
+  private final View.OnClickListener deleteButtonListener =
       new View.OnClickListener() {
         @Override
         public void onClick(View view) {
-          Logger.get(mContext).logImpression(DialerImpression.Type.VOICEMAIL_DELETE_ENTRY);
-          if (mPresenter == null) {
+          Logger.get(context).logImpression(DialerImpression.Type.VOICEMAIL_DELETE_ENTRY);
+          if (presenter == null) {
             return;
           }
 
@@ -86,19 +86,19 @@
           // we hide the view it is binded to something else, and the layout is not updated for
           // hidden items. copy the adapter position so we can update the view upon undo.
           // TODO(twyen): refactor this so the view holder will always be valid.
-          final int adapterPosition = mViewHolder.getAdapterPosition();
+          final int adapterPosition = viewHolder.getAdapterPosition();
 
-          mPresenter.pausePlayback();
-          mPresenter.onVoicemailDeleted(mViewHolder);
+          presenter.pausePlayback();
+          presenter.onVoicemailDeleted(viewHolder);
 
-          final Uri deleteUri = mVoicemailUri;
+          final Uri deleteUri = voicemailUri;
           final Runnable deleteCallback =
               new Runnable() {
                 @Override
                 public void run() {
-                  if (Objects.equals(deleteUri, mVoicemailUri)) {
+                  if (Objects.equals(deleteUri, voicemailUri)) {
                     CallLogAsyncTaskUtil.deleteVoicemail(
-                        mContext, deleteUri, VoicemailPlaybackLayout.this);
+                        context, deleteUri, VoicemailPlaybackLayout.this);
                   }
                 }
               };
@@ -118,56 +118,56 @@
                   new View.OnClickListener() {
                     @Override
                     public void onClick(View view) {
-                      mPresenter.onVoicemailDeleteUndo(adapterPosition);
+                      presenter.onVoicemailDeleteUndo(adapterPosition);
                       handler.removeCallbacks(deleteCallback);
                     }
                   })
               .setActionTextColor(
-                  mContext.getResources().getColor(R.color.dialer_snackbar_action_text_color))
+                  context.getResources().getColor(R.color.dialer_snackbar_action_text_color))
               .show();
         }
       };
-  private boolean mIsPlaying = false;
+  private boolean isPlaying = false;
   /** Click listener to play or pause voicemail playback. */
-  private final View.OnClickListener mStartStopButtonListener =
+  private final View.OnClickListener startStopButtonListener =
       new View.OnClickListener() {
         @Override
         public void onClick(View view) {
-          if (mPresenter == null) {
+          if (presenter == null) {
             return;
           }
 
-          if (mIsPlaying) {
-            mPresenter.pausePlayback();
+          if (isPlaying) {
+            presenter.pausePlayback();
           } else {
-            Logger.get(mContext)
+            Logger.get(context)
                 .logImpression(DialerImpression.Type.VOICEMAIL_PLAY_AUDIO_AFTER_EXPANDING_ENTRY);
-            mPresenter.resumePlayback();
+            presenter.resumePlayback();
           }
         }
       };
 
-  private SeekBar mPlaybackSeek;
-  private ImageButton mStartStopButton;
-  private ImageButton mPlaybackSpeakerphone;
-  private ImageButton mDeleteButton;
-  private TextView mStateText;
-  private TextView mPositionText;
-  private TextView mTotalDurationText;
+  private SeekBar playbackSeek;
+  private ImageButton startStopButton;
+  private ImageButton playbackSpeakerphone;
+  private ImageButton deleteButton;
+  private TextView stateText;
+  private TextView positionText;
+  private TextView totalDurationText;
   /** Handle state changes when the user manipulates the seek bar. */
-  private final OnSeekBarChangeListener mSeekBarChangeListener =
+  private final OnSeekBarChangeListener seekBarChangeListener =
       new OnSeekBarChangeListener() {
         @Override
         public void onStartTrackingTouch(SeekBar seekBar) {
-          if (mPresenter != null) {
-            mPresenter.pausePlaybackForSeeking();
+          if (presenter != null) {
+            presenter.pausePlaybackForSeeking();
           }
         }
 
         @Override
         public void onStopTrackingTouch(SeekBar seekBar) {
-          if (mPresenter != null) {
-            mPresenter.resumePlaybackAfterSeeking(seekBar.getProgress());
+          if (presenter != null) {
+            presenter.resumePlaybackAfterSeeking(seekBar.getProgress());
           }
         }
 
@@ -177,14 +177,14 @@
           // Update the seek position if user manually changed it. This makes sure position gets
           // updated when user use volume button to seek playback in talkback mode.
           if (fromUser) {
-            mPresenter.seek(progress);
+            presenter.seek(progress);
           }
         }
       };
 
-  private PositionUpdater mPositionUpdater;
-  private Drawable mVoicemailSeekHandleEnabled;
-  private Drawable mVoicemailSeekHandleDisabled;
+  private PositionUpdater positionUpdater;
+  private Drawable voicemailSeekHandleEnabled;
+  private Drawable voicemailSeekHandleDisabled;
 
   public VoicemailPlaybackLayout(Context context) {
     this(context, null);
@@ -192,99 +192,97 @@
 
   public VoicemailPlaybackLayout(Context context, AttributeSet attrs) {
     super(context, attrs);
-    mContext = context;
+    this.context = context;
     LayoutInflater inflater =
         (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
     inflater.inflate(R.layout.voicemail_playback_layout, this);
   }
 
   public void setViewHolder(CallLogListItemViewHolder mViewHolder) {
-    this.mViewHolder = mViewHolder;
+    this.viewHolder = mViewHolder;
   }
 
   @Override
   public void setPresenter(VoicemailPlaybackPresenter presenter, Uri voicemailUri) {
-    mPresenter = presenter;
-    mVoicemailUri = voicemailUri;
+    this.presenter = presenter;
+    this.voicemailUri = voicemailUri;
   }
 
   @Override
   protected void onFinishInflate() {
     super.onFinishInflate();
 
-    mPlaybackSeek = (SeekBar) findViewById(R.id.playback_seek);
-    mStartStopButton = (ImageButton) findViewById(R.id.playback_start_stop);
-    mPlaybackSpeakerphone = (ImageButton) findViewById(R.id.playback_speakerphone);
-    mDeleteButton = (ImageButton) findViewById(R.id.delete_voicemail);
+    playbackSeek = (SeekBar) findViewById(R.id.playback_seek);
+    startStopButton = (ImageButton) findViewById(R.id.playback_start_stop);
+    playbackSpeakerphone = (ImageButton) findViewById(R.id.playback_speakerphone);
+    deleteButton = (ImageButton) findViewById(R.id.delete_voicemail);
 
-    mStateText = (TextView) findViewById(R.id.playback_state_text);
-    mStateText.setAccessibilityLiveRegion(ACCESSIBILITY_LIVE_REGION_POLITE);
-    mPositionText = (TextView) findViewById(R.id.playback_position_text);
-    mTotalDurationText = (TextView) findViewById(R.id.total_duration_text);
+    stateText = (TextView) findViewById(R.id.playback_state_text);
+    stateText.setAccessibilityLiveRegion(ACCESSIBILITY_LIVE_REGION_POLITE);
+    positionText = (TextView) findViewById(R.id.playback_position_text);
+    totalDurationText = (TextView) findViewById(R.id.total_duration_text);
 
-    mPlaybackSeek.setOnSeekBarChangeListener(mSeekBarChangeListener);
-    mStartStopButton.setOnClickListener(mStartStopButtonListener);
-    mPlaybackSpeakerphone.setOnClickListener(mSpeakerphoneListener);
-    mDeleteButton.setOnClickListener(mDeleteButtonListener);
+    playbackSeek.setOnSeekBarChangeListener(seekBarChangeListener);
+    startStopButton.setOnClickListener(startStopButtonListener);
+    playbackSpeakerphone.setOnClickListener(speakerphoneListener);
+    deleteButton.setOnClickListener(deleteButtonListener);
 
-    mPositionText.setText(formatAsMinutesAndSeconds(0));
-    mTotalDurationText.setText(formatAsMinutesAndSeconds(0));
+    positionText.setText(formatAsMinutesAndSeconds(0));
+    totalDurationText.setText(formatAsMinutesAndSeconds(0));
 
-    mVoicemailSeekHandleEnabled =
-        getResources().getDrawable(R.drawable.ic_voicemail_seek_handle, mContext.getTheme());
-    mVoicemailSeekHandleDisabled =
+    voicemailSeekHandleEnabled =
+        getResources().getDrawable(R.drawable.ic_voicemail_seek_handle, context.getTheme());
+    voicemailSeekHandleDisabled =
         getResources()
-            .getDrawable(R.drawable.ic_voicemail_seek_handle_disabled, mContext.getTheme());
+            .getDrawable(R.drawable.ic_voicemail_seek_handle_disabled, context.getTheme());
   }
 
   @Override
   public void onPlaybackStarted(int duration, ScheduledExecutorService executorService) {
-    mIsPlaying = true;
+    isPlaying = true;
 
-    mStartStopButton.setImageResource(R.drawable.ic_pause);
+    startStopButton.setImageResource(R.drawable.ic_pause);
 
-    if (mPositionUpdater != null) {
-      mPositionUpdater.stopUpdating();
-      mPositionUpdater = null;
+    if (positionUpdater != null) {
+      positionUpdater.stopUpdating();
+      positionUpdater = null;
     }
-    mPositionUpdater = new PositionUpdater(duration, executorService);
-    mPositionUpdater.startUpdating();
+    positionUpdater = new PositionUpdater(duration, executorService);
+    positionUpdater.startUpdating();
   }
 
   @Override
   public void onPlaybackStopped() {
-    mIsPlaying = false;
+    isPlaying = false;
 
-    mStartStopButton.setImageResource(R.drawable.ic_play_arrow);
+    startStopButton.setImageResource(R.drawable.ic_play_arrow);
 
-    if (mPositionUpdater != null) {
-      mPositionUpdater.stopUpdating();
-      mPositionUpdater = null;
+    if (positionUpdater != null) {
+      positionUpdater.stopUpdating();
+      positionUpdater = null;
     }
   }
 
   @Override
   public void onPlaybackError() {
-    if (mPositionUpdater != null) {
-      mPositionUpdater.stopUpdating();
+    if (positionUpdater != null) {
+      positionUpdater.stopUpdating();
     }
 
     disableUiElements();
-    mStateText.setText(getString(R.string.voicemail_playback_error));
+    stateText.setText(getString(R.string.voicemail_playback_error));
   }
 
   @Override
   public void onSpeakerphoneOn(boolean on) {
     if (on) {
-      mPlaybackSpeakerphone.setImageResource(R.drawable.quantum_ic_volume_up_white_24);
+      playbackSpeakerphone.setImageResource(R.drawable.quantum_ic_volume_up_white_24);
       // Speaker is now on, tapping button will turn it off.
-      mPlaybackSpeakerphone.setContentDescription(
-          mContext.getString(R.string.voicemail_speaker_off));
+      playbackSpeakerphone.setContentDescription(context.getString(R.string.voicemail_speaker_off));
     } else {
-      mPlaybackSpeakerphone.setImageResource(R.drawable.quantum_ic_volume_down_white_24);
+      playbackSpeakerphone.setImageResource(R.drawable.quantum_ic_volume_down_white_24);
       // Speaker is now off, tapping button will turn it on.
-      mPlaybackSpeakerphone.setContentDescription(
-          mContext.getString(R.string.voicemail_speaker_on));
+      playbackSpeakerphone.setContentDescription(context.getString(R.string.voicemail_speaker_on));
     }
   }
 
@@ -292,66 +290,66 @@
   public void setClipPosition(int positionMs, int durationMs) {
     int seekBarPositionMs = Math.max(0, positionMs);
     int seekBarMax = Math.max(seekBarPositionMs, durationMs);
-    if (mPlaybackSeek.getMax() != seekBarMax) {
-      mPlaybackSeek.setMax(seekBarMax);
+    if (playbackSeek.getMax() != seekBarMax) {
+      playbackSeek.setMax(seekBarMax);
     }
 
-    mPlaybackSeek.setProgress(seekBarPositionMs);
+    playbackSeek.setProgress(seekBarPositionMs);
 
-    mPositionText.setText(formatAsMinutesAndSeconds(seekBarPositionMs));
-    mTotalDurationText.setText(formatAsMinutesAndSeconds(durationMs));
+    positionText.setText(formatAsMinutesAndSeconds(seekBarPositionMs));
+    totalDurationText.setText(formatAsMinutesAndSeconds(durationMs));
   }
 
   @Override
   public void setSuccess() {
-    mStateText.setText(null);
+    stateText.setText(null);
   }
 
   @Override
   public void setIsFetchingContent() {
     disableUiElements();
-    mStateText.setText(getString(R.string.voicemail_fetching_content));
+    stateText.setText(getString(R.string.voicemail_fetching_content));
   }
 
   @Override
   public void setFetchContentTimeout() {
-    mStartStopButton.setEnabled(true);
-    mStateText.setText(getString(R.string.voicemail_fetching_timout));
+    startStopButton.setEnabled(true);
+    stateText.setText(getString(R.string.voicemail_fetching_timout));
   }
 
   @Override
   public int getDesiredClipPosition() {
-    return mPlaybackSeek.getProgress();
+    return playbackSeek.getProgress();
   }
 
   @Override
   public void disableUiElements() {
-    mStartStopButton.setEnabled(false);
+    startStopButton.setEnabled(false);
     resetSeekBar();
   }
 
   @Override
   public void enableUiElements() {
-    mDeleteButton.setEnabled(true);
-    mStartStopButton.setEnabled(true);
-    mPlaybackSeek.setEnabled(true);
-    mPlaybackSeek.setThumb(mVoicemailSeekHandleEnabled);
+    deleteButton.setEnabled(true);
+    startStopButton.setEnabled(true);
+    playbackSeek.setEnabled(true);
+    playbackSeek.setThumb(voicemailSeekHandleEnabled);
   }
 
   @Override
   public void resetSeekBar() {
-    mPlaybackSeek.setProgress(0);
-    mPlaybackSeek.setEnabled(false);
-    mPlaybackSeek.setThumb(mVoicemailSeekHandleDisabled);
+    playbackSeek.setProgress(0);
+    playbackSeek.setEnabled(false);
+    playbackSeek.setThumb(voicemailSeekHandleDisabled);
   }
 
   @Override
   public void onDeleteVoicemail() {
-    mPresenter.onVoicemailDeletedInDatabase();
+    presenter.onVoicemailDeletedInDatabase();
   }
 
   private String getString(int resId) {
-    return mContext.getString(resId);
+    return context.getString(resId);
   }
 
   /**
@@ -372,7 +370,7 @@
 
   @VisibleForTesting
   public String getStateText() {
-    return mStateText.getText().toString();
+    return stateText.getText().toString();
   }
 
   /** Controls the animation of the playback slider. */
@@ -382,61 +380,61 @@
     /** Update rate for the slider, 30fps. */
     private static final int SLIDER_UPDATE_PERIOD_MILLIS = 1000 / 30;
 
-    private final ScheduledExecutorService mExecutorService;
-    private final Object mLock = new Object();
-    private int mDurationMs;
+    private final ScheduledExecutorService executorService;
+    private final Object lock = new Object();
+    private int durationMs;
 
-    @GuardedBy("mLock")
-    private ScheduledFuture<?> mScheduledFuture;
+    @GuardedBy("lock")
+    private ScheduledFuture<?> scheduledFuture;
 
-    private Runnable mUpdateClipPositionRunnable =
+    private Runnable updateClipPositionRunnable =
         new Runnable() {
           @Override
           public void run() {
             int currentPositionMs = 0;
-            synchronized (mLock) {
-              if (mScheduledFuture == null || mPresenter == null) {
+            synchronized (lock) {
+              if (scheduledFuture == null || presenter == null) {
                 // This task has been canceled. Just stop now.
                 return;
               }
-              currentPositionMs = mPresenter.getMediaPlayerPosition();
+              currentPositionMs = presenter.getMediaPlayerPosition();
             }
-            setClipPosition(currentPositionMs, mDurationMs);
+            setClipPosition(currentPositionMs, durationMs);
           }
         };
 
     public PositionUpdater(int durationMs, ScheduledExecutorService executorService) {
-      mDurationMs = durationMs;
-      mExecutorService = executorService;
+      this.durationMs = durationMs;
+      this.executorService = executorService;
     }
 
     @Override
     public void run() {
-      post(mUpdateClipPositionRunnable);
+      post(updateClipPositionRunnable);
     }
 
     public void startUpdating() {
-      synchronized (mLock) {
+      synchronized (lock) {
         cancelPendingRunnables();
-        mScheduledFuture =
-            mExecutorService.scheduleAtFixedRate(
+        scheduledFuture =
+            executorService.scheduleAtFixedRate(
                 this, 0, SLIDER_UPDATE_PERIOD_MILLIS, TimeUnit.MILLISECONDS);
       }
     }
 
     public void stopUpdating() {
-      synchronized (mLock) {
+      synchronized (lock) {
         cancelPendingRunnables();
       }
     }
 
-    @GuardedBy("mLock")
+    @GuardedBy("lock")
     private void cancelPendingRunnables() {
-      if (mScheduledFuture != null) {
-        mScheduledFuture.cancel(true);
-        mScheduledFuture = null;
+      if (scheduledFuture != null) {
+        scheduledFuture.cancel(true);
+        scheduledFuture = null;
       }
-      removeCallbacks(mUpdateClipPositionRunnable);
+      removeCallbacks(updateClipPositionRunnable);
     }
   }
 }
diff --git a/java/com/android/dialer/app/voicemail/VoicemailPlaybackPresenter.java b/java/com/android/dialer/app/voicemail/VoicemailPlaybackPresenter.java
index 10afe47..e9b64df 100644
--- a/java/com/android/dialer/app/voicemail/VoicemailPlaybackPresenter.java
+++ b/java/com/android/dialer/app/voicemail/VoicemailPlaybackPresenter.java
@@ -113,41 +113,41 @@
   private static final String VOICEMAIL_SHARE_FILE_NAME_DATE_FORMAT = "MM-dd-yy_hhmmaa";
   private static final String CONFIG_SHARE_VOICEMAIL_ALLOWED = "share_voicemail_allowed";
 
-  private static VoicemailPlaybackPresenter sInstance;
-  private static ScheduledExecutorService mScheduledExecutorService;
+  private static VoicemailPlaybackPresenter instance;
+  private static ScheduledExecutorService scheduledExecutorService;
   /**
    * The most recently cached duration. We cache this since we don't want to keep requesting it from
    * the player, as this can easily lead to throwing {@link IllegalStateException} (any time the
    * player is released, it's illegal to ask for the duration).
    */
-  private final AtomicInteger mDuration = new AtomicInteger(0);
+  private final AtomicInteger duration = new AtomicInteger(0);
 
-  protected Context mContext;
-  private long mRowId;
-  protected Uri mVoicemailUri;
-  protected MediaPlayer mMediaPlayer;
+  protected Context context;
+  private long rowId;
+  protected Uri voicemailUri;
+  protected MediaPlayer mediaPlayer;
   // Used to run async tasks that need to interact with the UI.
-  protected AsyncTaskExecutor mAsyncTaskExecutor;
-  private Activity mActivity;
-  private PlaybackView mView;
-  private int mPosition;
-  private boolean mIsPlaying;
+  protected AsyncTaskExecutor asyncTaskExecutor;
+  private Activity activity;
+  private PlaybackView view;
+  private int position;
+  private boolean isPlaying;
   // MediaPlayer crashes on some method calls if not prepared but does not have a method which
   // exposes its prepared state. Store this locally, so we can check and prevent crashes.
-  private boolean mIsPrepared;
-  private boolean mIsSpeakerphoneOn;
+  private boolean isPrepared;
+  private boolean isSpeakerphoneOn;
 
-  private boolean mShouldResumePlaybackAfterSeeking;
+  private boolean shouldResumePlaybackAfterSeeking;
   /**
    * Used to handle the result of a successful or time-out fetch result.
    *
    * <p>This variable is thread-contained, accessed only on the ui thread.
    */
-  private FetchResultHandler mFetchResultHandler;
+  private FetchResultHandler fetchResultHandler;
 
-  private PowerManager.WakeLock mProximityWakeLock;
-  private VoicemailAudioManager mVoicemailAudioManager;
-  private OnVoicemailDeletedListener mOnVoicemailDeletedListener;
+  private PowerManager.WakeLock proximityWakeLock;
+  private VoicemailAudioManager voicemailAudioManager;
+  private OnVoicemailDeletedListener onVoicemailDeletedListener;
   private View shareVoicemailButtonView;
 
   private DialerExecutor<Pair<Context, Uri>> shareVoicemailExecutor;
@@ -155,11 +155,11 @@
   /** Initialize variables which are activity-independent and state-independent. */
   protected VoicemailPlaybackPresenter(Activity activity) {
     Context context = activity.getApplicationContext();
-    mAsyncTaskExecutor = AsyncTaskExecutors.createAsyncTaskExecutor();
-    mVoicemailAudioManager = new VoicemailAudioManager(context, this);
+    asyncTaskExecutor = AsyncTaskExecutors.createAsyncTaskExecutor();
+    voicemailAudioManager = new VoicemailAudioManager(context, this);
     PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
     if (powerManager.isWakeLockLevelSupported(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK)) {
-      mProximityWakeLock =
+      proximityWakeLock =
           powerManager.newWakeLock(
               PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "VoicemailPlaybackPresenter");
     }
@@ -177,63 +177,63 @@
   @MainThread
   public static VoicemailPlaybackPresenter getInstance(
       Activity activity, Bundle savedInstanceState) {
-    if (sInstance == null) {
-      sInstance = new VoicemailPlaybackPresenter(activity);
+    if (instance == null) {
+      instance = new VoicemailPlaybackPresenter(activity);
     }
 
-    sInstance.init(activity, savedInstanceState);
-    return sInstance;
+    instance.init(activity, savedInstanceState);
+    return instance;
   }
 
   private static synchronized ScheduledExecutorService getScheduledExecutorServiceInstance() {
-    if (mScheduledExecutorService == null) {
-      mScheduledExecutorService = Executors.newScheduledThreadPool(NUMBER_OF_THREADS_IN_POOL);
+    if (scheduledExecutorService == null) {
+      scheduledExecutorService = Executors.newScheduledThreadPool(NUMBER_OF_THREADS_IN_POOL);
     }
-    return mScheduledExecutorService;
+    return scheduledExecutorService;
   }
 
   /** Update variables which are activity-dependent or state-dependent. */
   @MainThread
   protected void init(Activity activity, Bundle savedInstanceState) {
     Assert.isMainThread();
-    mActivity = activity;
-    mContext = activity;
+    this.activity = activity;
+    context = activity;
 
     if (savedInstanceState != null) {
       // Restores playback state when activity is recreated, such as after rotation.
-      mVoicemailUri = savedInstanceState.getParcelable(VOICEMAIL_URI_KEY);
-      mIsPrepared = savedInstanceState.getBoolean(IS_PREPARED_KEY);
-      mPosition = savedInstanceState.getInt(CLIP_POSITION_KEY, 0);
-      mIsPlaying = savedInstanceState.getBoolean(IS_PLAYING_STATE_KEY, false);
-      mIsSpeakerphoneOn = savedInstanceState.getBoolean(IS_SPEAKERPHONE_ON_KEY, false);
+      voicemailUri = savedInstanceState.getParcelable(VOICEMAIL_URI_KEY);
+      isPrepared = savedInstanceState.getBoolean(IS_PREPARED_KEY);
+      position = savedInstanceState.getInt(CLIP_POSITION_KEY, 0);
+      isPlaying = savedInstanceState.getBoolean(IS_PLAYING_STATE_KEY, false);
+      isSpeakerphoneOn = savedInstanceState.getBoolean(IS_SPEAKERPHONE_ON_KEY, false);
     }
 
-    if (mMediaPlayer == null) {
-      mIsPrepared = false;
-      mIsPlaying = false;
+    if (mediaPlayer == null) {
+      isPrepared = false;
+      isPlaying = false;
     }
 
-    if (mActivity != null) {
+    if (this.activity != null) {
       if (isPlaying()) {
-        mActivity.getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);
+        this.activity.getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);
       } else {
-        mActivity.getWindow().clearFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);
+        this.activity.getWindow().clearFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);
       }
       shareVoicemailExecutor =
-          DialerExecutorComponent.get(mContext)
+          DialerExecutorComponent.get(context)
               .dialerExecutorFactory()
               .createUiTaskBuilder(
-                  mActivity.getFragmentManager(), "shareVoicemail", new ShareVoicemailWorker())
+                  this.activity.getFragmentManager(), "shareVoicemail", new ShareVoicemailWorker())
               .onSuccess(
                   output -> {
                     if (output == null) {
                       LogUtil.e("VoicemailAsyncTaskUtil.shareVoicemail", "failed to get voicemail");
                       return;
                     }
-                    mContext.startActivity(
+                    context.startActivity(
                         Intent.createChooser(
-                            getShareIntent(mContext, output.first, output.second),
-                            mContext
+                            getShareIntent(context, output.first, output.second),
+                            context
                                 .getResources()
                                 .getText(R.string.call_log_action_share_voicemail)));
                   })
@@ -243,12 +243,12 @@
 
   /** Must be invoked when the parent Activity is saving it state. */
   public void onSaveInstanceState(Bundle outState) {
-    if (mView != null) {
-      outState.putParcelable(VOICEMAIL_URI_KEY, mVoicemailUri);
-      outState.putBoolean(IS_PREPARED_KEY, mIsPrepared);
-      outState.putInt(CLIP_POSITION_KEY, mView.getDesiredClipPosition());
-      outState.putBoolean(IS_PLAYING_STATE_KEY, mIsPlaying);
-      outState.putBoolean(IS_SPEAKERPHONE_ON_KEY, mIsSpeakerphoneOn);
+    if (view != null) {
+      outState.putParcelable(VOICEMAIL_URI_KEY, voicemailUri);
+      outState.putBoolean(IS_PREPARED_KEY, isPrepared);
+      outState.putInt(CLIP_POSITION_KEY, view.getDesiredClipPosition());
+      outState.putBoolean(IS_PLAYING_STATE_KEY, isPlaying);
+      outState.putBoolean(IS_SPEAKERPHONE_ON_KEY, isSpeakerphoneOn);
     }
   }
 
@@ -259,26 +259,26 @@
       Uri voicemailUri,
       final boolean startPlayingImmediately,
       View shareVoicemailButtonView) {
-    mRowId = rowId;
-    mView = view;
-    mView.setPresenter(this, voicemailUri);
-    mView.onSpeakerphoneOn(mIsSpeakerphoneOn);
+    this.rowId = rowId;
+    this.view = view;
+    this.view.setPresenter(this, voicemailUri);
+    this.view.onSpeakerphoneOn(isSpeakerphoneOn);
     this.shareVoicemailButtonView = shareVoicemailButtonView;
     showShareVoicemailButton(false);
 
     // Handles cases where the same entry is binded again when scrolling in list, or where
     // the MediaPlayer was retained after an orientation change.
-    if (mMediaPlayer != null && mIsPrepared && voicemailUri.equals(mVoicemailUri)) {
+    if (mediaPlayer != null && isPrepared && voicemailUri.equals(this.voicemailUri)) {
       // If the voicemail card was rebinded, we need to set the position to the appropriate
       // point. Since we retain the media player, we can just set it to the position of the
       // media player.
-      mPosition = mMediaPlayer.getCurrentPosition();
-      onPrepared(mMediaPlayer);
+      position = mediaPlayer.getCurrentPosition();
+      onPrepared(mediaPlayer);
       showShareVoicemailButton(true);
     } else {
-      if (!voicemailUri.equals(mVoicemailUri)) {
-        mVoicemailUri = voicemailUri;
-        mPosition = 0;
+      if (!voicemailUri.equals(this.voicemailUri)) {
+        this.voicemailUri = voicemailUri;
+        position = 0;
       }
       /*
        * Check to see if the content field in the DB is set. If set, we proceed to
@@ -294,9 +294,9 @@
               if (startPlayingImmediately) {
                 requestContent(PLAYBACK_REQUEST);
               }
-              if (mView != null) {
-                mView.resetSeekBar();
-                mView.setClipPosition(0, mDuration.get());
+              if (this.view != null) {
+                this.view.resetSeekBar();
+                this.view.setClipPosition(0, duration.get());
               }
             }
           });
@@ -305,7 +305,7 @@
         // Since setPlaybackView can get called during the view binding process, we don't
         // want to reset mIsPlaying to false if the user is currently playing the
         // voicemail and the view is rebound.
-        mIsPlaying = startPlayingImmediately;
+        isPlaying = startPlayingImmediately;
       }
     }
   }
@@ -314,8 +314,8 @@
   public void resetAll() {
     pausePresenter(true);
 
-    mView = null;
-    mVoicemailUri = null;
+    view = null;
+    voicemailUri = null;
   }
 
   /**
@@ -327,41 +327,41 @@
    */
   public void pausePresenter(boolean reset) {
     pausePlayback();
-    if (mMediaPlayer != null) {
-      mMediaPlayer.release();
-      mMediaPlayer = null;
+    if (mediaPlayer != null) {
+      mediaPlayer.release();
+      mediaPlayer = null;
     }
 
     disableProximitySensor(false /* waitForFarState */);
 
-    mIsPrepared = false;
-    mIsPlaying = false;
+    isPrepared = false;
+    isPlaying = false;
 
     if (reset) {
       // We want to reset the position whether or not the view is valid.
-      mPosition = 0;
+      position = 0;
     }
 
-    if (mView != null) {
-      mView.onPlaybackStopped();
+    if (view != null) {
+      view.onPlaybackStopped();
       if (reset) {
-        mView.setClipPosition(0, mDuration.get());
+        view.setClipPosition(0, duration.get());
       } else {
-        mPosition = mView.getDesiredClipPosition();
+        position = view.getDesiredClipPosition();
       }
     }
   }
 
   /** Must be invoked when the parent activity is resumed. */
   public void onResume() {
-    mVoicemailAudioManager.registerReceivers();
+    voicemailAudioManager.registerReceivers();
   }
 
   /** Must be invoked when the parent activity is paused. */
   public void onPause() {
-    mVoicemailAudioManager.unregisterReceivers();
+    voicemailAudioManager.unregisterReceivers();
 
-    if (mActivity != null && mIsPrepared && mActivity.isChangingConfigurations()) {
+    if (activity != null && isPrepared && activity.isChangingConfigurations()) {
       // If an configuration change triggers the pause, retain the MediaPlayer.
       LogUtil.d("VoicemailPlaybackPresenter.onPause", "configuration changed.");
       return;
@@ -374,28 +374,28 @@
   /** Must be invoked when the parent activity is destroyed. */
   public void onDestroy() {
     // Clear references to avoid leaks from the singleton instance.
-    mActivity = null;
-    mContext = null;
+    activity = null;
+    context = null;
 
-    if (mScheduledExecutorService != null) {
-      mScheduledExecutorService.shutdown();
-      mScheduledExecutorService = null;
+    if (scheduledExecutorService != null) {
+      scheduledExecutorService.shutdown();
+      scheduledExecutorService = null;
     }
 
-    if (mFetchResultHandler != null) {
-      mFetchResultHandler.destroy();
-      mFetchResultHandler = null;
+    if (fetchResultHandler != null) {
+      fetchResultHandler.destroy();
+      fetchResultHandler = null;
     }
   }
 
   /** Checks to see if we have content available for this voicemail. */
   protected void checkForContent(final OnContentCheckedListener callback) {
-    mAsyncTaskExecutor.submit(
+    asyncTaskExecutor.submit(
         Tasks.CHECK_FOR_CONTENT,
         new AsyncTask<Void, Void, Boolean>() {
           @Override
           public Boolean doInBackground(Void... params) {
-            return queryHasContent(mVoicemailUri);
+            return queryHasContent(voicemailUri);
           }
 
           @Override
@@ -406,17 +406,17 @@
   }
 
   private boolean queryHasContent(Uri voicemailUri) {
-    if (voicemailUri == null || mContext == null) {
+    if (voicemailUri == null || context == null) {
       return false;
     }
 
-    ContentResolver contentResolver = mContext.getContentResolver();
+    ContentResolver contentResolver = context.getContentResolver();
     Cursor cursor = contentResolver.query(voicemailUri, null, null, null, null);
     try {
       if (cursor != null && cursor.moveToNext()) {
         int duration = cursor.getInt(cursor.getColumnIndex(VoicemailContract.Voicemails.DURATION));
         // Convert database duration (seconds) into mDuration (milliseconds)
-        mDuration.set(duration > 0 ? duration * 1000 : 0);
+        this.duration.set(duration > 0 ? duration * 1000 : 0);
         return cursor.getInt(cursor.getColumnIndex(VoicemailContract.Voicemails.HAS_CONTENT)) == 1;
       }
     } finally {
@@ -440,38 +440,34 @@
    * @return whether issued request to fetch content
    */
   protected boolean requestContent(int code) {
-    if (mContext == null || mVoicemailUri == null) {
+    if (context == null || voicemailUri == null) {
       return false;
     }
 
     FetchResultHandler tempFetchResultHandler =
-        new FetchResultHandler(new Handler(), mVoicemailUri, code);
+        new FetchResultHandler(new Handler(), voicemailUri, code);
 
     switch (code) {
       default:
-        if (mFetchResultHandler != null) {
-          mFetchResultHandler.destroy();
+        if (fetchResultHandler != null) {
+          fetchResultHandler.destroy();
         }
-        mView.setIsFetchingContent();
-        mFetchResultHandler = tempFetchResultHandler;
+        view.setIsFetchingContent();
+        fetchResultHandler = tempFetchResultHandler;
         break;
     }
 
-    mAsyncTaskExecutor.submit(
+    asyncTaskExecutor.submit(
         Tasks.SEND_FETCH_REQUEST,
         new AsyncTask<Void, Void, Void>() {
 
           @Override
           protected Void doInBackground(Void... voids) {
             try (Cursor cursor =
-                mContext
+                context
                     .getContentResolver()
                     .query(
-                        mVoicemailUri,
-                        new String[] {Voicemails.SOURCE_PACKAGE},
-                        null,
-                        null,
-                        null)) {
+                        voicemailUri, new String[] {Voicemails.SOURCE_PACKAGE}, null, null, null)) {
               String sourcePackage;
               if (!hasContent(cursor)) {
                 LogUtil.e(
@@ -482,12 +478,12 @@
                 sourcePackage = cursor.getString(0);
               }
               // Send voicemail fetch request.
-              Intent intent = new Intent(VoicemailContract.ACTION_FETCH_VOICEMAIL, mVoicemailUri);
+              Intent intent = new Intent(VoicemailContract.ACTION_FETCH_VOICEMAIL, voicemailUri);
               intent.setPackage(sourcePackage);
               LogUtil.i(
                   "VoicemailPlaybackPresenter.requestContent",
                   "Sending ACTION_FETCH_VOICEMAIL to " + sourcePackage);
-              mContext.sendBroadcast(intent);
+              context.sendBroadcast(intent);
             }
             return null;
           }
@@ -504,35 +500,35 @@
    * will call {@link #onError()} otherwise.
    */
   protected void prepareContent() {
-    if (mView == null || mContext == null) {
+    if (view == null || context == null) {
       return;
     }
     LogUtil.d("VoicemailPlaybackPresenter.prepareContent", null);
 
     // Release the previous media player, otherwise there may be failures.
-    if (mMediaPlayer != null) {
-      mMediaPlayer.release();
-      mMediaPlayer = null;
+    if (mediaPlayer != null) {
+      mediaPlayer.release();
+      mediaPlayer = null;
     }
 
-    mView.disableUiElements();
-    mIsPrepared = false;
+    view.disableUiElements();
+    isPrepared = false;
 
-    if (mContext != null && TelecomUtil.isInManagedCall(mContext)) {
+    if (context != null && TelecomUtil.isInManagedCall(context)) {
       handleError(new IllegalStateException("Cannot play voicemail when call is in progress"));
       return;
     }
 
     try {
-      mMediaPlayer = new MediaPlayer();
-      mMediaPlayer.setOnPreparedListener(this);
-      mMediaPlayer.setOnErrorListener(this);
-      mMediaPlayer.setOnCompletionListener(this);
+      mediaPlayer = new MediaPlayer();
+      mediaPlayer.setOnPreparedListener(this);
+      mediaPlayer.setOnErrorListener(this);
+      mediaPlayer.setOnCompletionListener(this);
 
-      mMediaPlayer.reset();
-      mMediaPlayer.setDataSource(mContext, mVoicemailUri);
-      mMediaPlayer.setAudioStreamType(VoicemailAudioManager.PLAYBACK_STREAM);
-      mMediaPlayer.prepareAsync();
+      mediaPlayer.reset();
+      mediaPlayer.setDataSource(context, voicemailUri);
+      mediaPlayer.setAudioStreamType(VoicemailAudioManager.PLAYBACK_STREAM);
+      mediaPlayer.prepareAsync();
     } catch (IOException e) {
       handleError(e);
     }
@@ -543,23 +539,23 @@
    */
   @Override
   public void onPrepared(MediaPlayer mp) {
-    if (mView == null || mContext == null) {
+    if (view == null || context == null) {
       return;
     }
     LogUtil.d("VoicemailPlaybackPresenter.onPrepared", null);
-    mIsPrepared = true;
+    isPrepared = true;
 
-    mDuration.set(mMediaPlayer.getDuration());
+    duration.set(mediaPlayer.getDuration());
 
-    LogUtil.d("VoicemailPlaybackPresenter.onPrepared", "mPosition=" + mPosition);
-    mView.setClipPosition(mPosition, mDuration.get());
-    mView.enableUiElements();
-    mView.setSuccess();
+    LogUtil.d("VoicemailPlaybackPresenter.onPrepared", "mPosition=" + position);
+    view.setClipPosition(position, duration.get());
+    view.enableUiElements();
+    view.setSuccess();
     if (!mp.isPlaying()) {
-      mMediaPlayer.seekTo(mPosition);
+      mediaPlayer.seekTo(position);
     }
 
-    if (mIsPlaying) {
+    if (isPlaying) {
       resumePlayback();
     } else {
       pausePlayback();
@@ -579,18 +575,18 @@
   protected void handleError(Exception e) {
     LogUtil.e("VoicemailPlaybackPresenter.handlerError", "could not play voicemail", e);
 
-    if (mIsPrepared) {
-      mMediaPlayer.release();
-      mMediaPlayer = null;
-      mIsPrepared = false;
+    if (isPrepared) {
+      mediaPlayer.release();
+      mediaPlayer = null;
+      isPrepared = false;
     }
 
-    if (mView != null) {
-      mView.onPlaybackError();
+    if (view != null) {
+      view.onPlaybackError();
     }
 
-    mPosition = 0;
-    mIsPlaying = false;
+    position = 0;
+    isPlaying = false;
     showShareVoicemailButton(false);
   }
 
@@ -600,10 +596,10 @@
     pausePlayback();
 
     // Reset the seekbar position to the beginning.
-    mPosition = 0;
-    if (mView != null) {
+    position = 0;
+    if (view != null) {
       mediaPlayer.seekTo(0);
-      mView.setClipPosition(0, mDuration.get());
+      view.setClipPosition(0, duration.get());
     }
   }
 
@@ -617,7 +613,7 @@
    * @param gainedFocus {@code true} if the audio focus was gained, {@code} false otherwise.
    */
   public void onAudioFocusChange(boolean gainedFocus) {
-    if (mIsPlaying == gainedFocus) {
+    if (isPlaying == gainedFocus) {
       // Nothing new here, just exit.
       return;
     }
@@ -634,11 +630,11 @@
    * playing.
    */
   public void resumePlayback() {
-    if (mView == null) {
+    if (view == null) {
       return;
     }
 
-    if (!mIsPrepared) {
+    if (!isPrepared) {
       /*
        * Check content before requesting content to avoid duplicated requests. It is possible
        * that the UI doesn't know content has arrived if the fetch took too long causing a
@@ -649,41 +645,41 @@
             if (!hasContent) {
               // No local content, download from server. Queue playing if the request was
               // issued,
-              mIsPlaying = requestContent(PLAYBACK_REQUEST);
+              isPlaying = requestContent(PLAYBACK_REQUEST);
             } else {
               showShareVoicemailButton(true);
               // Queue playing once the media play loaded the content.
-              mIsPlaying = true;
+              isPlaying = true;
               prepareContent();
             }
           });
       return;
     }
 
-    mIsPlaying = true;
+    isPlaying = true;
 
-    mActivity.getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);
+    activity.getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);
 
-    if (mMediaPlayer != null && !mMediaPlayer.isPlaying()) {
+    if (mediaPlayer != null && !mediaPlayer.isPlaying()) {
       // Clamp the start position between 0 and the duration.
-      mPosition = Math.max(0, Math.min(mPosition, mDuration.get()));
+      position = Math.max(0, Math.min(position, duration.get()));
 
-      mMediaPlayer.seekTo(mPosition);
+      mediaPlayer.seekTo(position);
 
       try {
         // Grab audio focus.
         // Can throw RejectedExecutionException.
-        mVoicemailAudioManager.requestAudioFocus();
-        mMediaPlayer.start();
-        setSpeakerphoneOn(mIsSpeakerphoneOn);
-        mVoicemailAudioManager.setSpeakerphoneOn(mIsSpeakerphoneOn);
+        voicemailAudioManager.requestAudioFocus();
+        mediaPlayer.start();
+        setSpeakerphoneOn(isSpeakerphoneOn);
+        voicemailAudioManager.setSpeakerphoneOn(isSpeakerphoneOn);
       } catch (RejectedExecutionException e) {
         handleError(e);
       }
     }
 
-    LogUtil.d("VoicemailPlaybackPresenter.resumePlayback", "resumed playback at %d.", mPosition);
-    mView.onPlaybackStarted(mDuration.get(), getScheduledExecutorServiceInstance());
+    LogUtil.d("VoicemailPlaybackPresenter.resumePlayback", "resumed playback at %d.", position);
+    view.onPlaybackStarted(duration.get(), getScheduledExecutorServiceInstance());
   }
 
   /** Pauses voicemail playback at the current position. Null-op if already paused. */
@@ -692,29 +688,29 @@
   }
 
   private void pausePlayback(boolean keepFocus) {
-    if (!mIsPrepared) {
+    if (!isPrepared) {
       return;
     }
 
-    mIsPlaying = false;
+    isPlaying = false;
 
-    if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
-      mMediaPlayer.pause();
+    if (mediaPlayer != null && mediaPlayer.isPlaying()) {
+      mediaPlayer.pause();
     }
 
-    mPosition = mMediaPlayer == null ? 0 : mMediaPlayer.getCurrentPosition();
+    position = mediaPlayer == null ? 0 : mediaPlayer.getCurrentPosition();
 
-    LogUtil.d("VoicemailPlaybackPresenter.pausePlayback", "paused playback at %d.", mPosition);
+    LogUtil.d("VoicemailPlaybackPresenter.pausePlayback", "paused playback at %d.", position);
 
-    if (mView != null) {
-      mView.onPlaybackStopped();
+    if (view != null) {
+      view.onPlaybackStopped();
     }
 
     if (!keepFocus) {
-      mVoicemailAudioManager.abandonAudioFocus();
+      voicemailAudioManager.abandonAudioFocus();
     }
-    if (mActivity != null) {
-      mActivity.getWindow().clearFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);
+    if (activity != null) {
+      activity.getWindow().clearFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);
     }
     disableProximitySensor(true /* waitForFarState */);
   }
@@ -724,16 +720,16 @@
    * playing to know whether to resume playback once the user selects a new position.
    */
   public void pausePlaybackForSeeking() {
-    if (mMediaPlayer != null) {
-      mShouldResumePlaybackAfterSeeking = mMediaPlayer.isPlaying();
+    if (mediaPlayer != null) {
+      shouldResumePlaybackAfterSeeking = mediaPlayer.isPlaying();
     }
     pausePlayback(true);
   }
 
   public void resumePlaybackAfterSeeking(int desiredPosition) {
-    mPosition = desiredPosition;
-    if (mShouldResumePlaybackAfterSeeking) {
-      mShouldResumePlaybackAfterSeeking = false;
+    position = desiredPosition;
+    if (shouldResumePlaybackAfterSeeking) {
+      shouldResumePlaybackAfterSeeking = false;
       resumePlayback();
     }
   }
@@ -743,23 +739,23 @@
    * touch or volume button while in talkback mode.
    */
   public void seek(int position) {
-    mPosition = position;
-    mMediaPlayer.seekTo(mPosition);
+    this.position = position;
+    mediaPlayer.seekTo(this.position);
   }
 
   private void enableProximitySensor() {
-    if (mProximityWakeLock == null
-        || mIsSpeakerphoneOn
-        || !mIsPrepared
-        || mMediaPlayer == null
-        || !mMediaPlayer.isPlaying()) {
+    if (proximityWakeLock == null
+        || isSpeakerphoneOn
+        || !isPrepared
+        || mediaPlayer == null
+        || !mediaPlayer.isPlaying()) {
       return;
     }
 
-    if (!mProximityWakeLock.isHeld()) {
+    if (!proximityWakeLock.isHeld()) {
       LogUtil.i(
           "VoicemailPlaybackPresenter.enableProximitySensor", "acquiring proximity wake lock");
-      mProximityWakeLock.acquire();
+      proximityWakeLock.acquire();
     } else {
       LogUtil.i(
           "VoicemailPlaybackPresenter.enableProximitySensor",
@@ -768,14 +764,14 @@
   }
 
   private void disableProximitySensor(boolean waitForFarState) {
-    if (mProximityWakeLock == null) {
+    if (proximityWakeLock == null) {
       return;
     }
-    if (mProximityWakeLock.isHeld()) {
+    if (proximityWakeLock.isHeld()) {
       LogUtil.i(
           "VoicemailPlaybackPresenter.disableProximitySensor", "releasing proximity wake lock");
       int flags = waitForFarState ? PowerManager.RELEASE_FLAG_WAIT_FOR_NO_PROXIMITY : 0;
-      mProximityWakeLock.release(flags);
+      proximityWakeLock.release(flags);
     } else {
       LogUtil.i(
           "VoicemailPlaybackPresenter.disableProximitySensor",
@@ -785,44 +781,44 @@
 
   /** This is for use by UI interactions only. It simplifies UI logic. */
   public void toggleSpeakerphone() {
-    mVoicemailAudioManager.setSpeakerphoneOn(!mIsSpeakerphoneOn);
-    setSpeakerphoneOn(!mIsSpeakerphoneOn);
+    voicemailAudioManager.setSpeakerphoneOn(!isSpeakerphoneOn);
+    setSpeakerphoneOn(!isSpeakerphoneOn);
   }
 
   public void setOnVoicemailDeletedListener(OnVoicemailDeletedListener listener) {
-    mOnVoicemailDeletedListener = listener;
+    onVoicemailDeletedListener = listener;
   }
 
   public int getMediaPlayerPosition() {
-    return mIsPrepared && mMediaPlayer != null ? mMediaPlayer.getCurrentPosition() : 0;
+    return isPrepared && mediaPlayer != null ? mediaPlayer.getCurrentPosition() : 0;
   }
 
   void onVoicemailDeleted(CallLogListItemViewHolder viewHolder) {
-    if (mOnVoicemailDeletedListener != null) {
-      mOnVoicemailDeletedListener.onVoicemailDeleted(viewHolder, mVoicemailUri);
+    if (onVoicemailDeletedListener != null) {
+      onVoicemailDeletedListener.onVoicemailDeleted(viewHolder, voicemailUri);
     }
   }
 
   void onVoicemailDeleteUndo(int adapterPosition) {
-    if (mOnVoicemailDeletedListener != null) {
-      mOnVoicemailDeletedListener.onVoicemailDeleteUndo(mRowId, adapterPosition, mVoicemailUri);
+    if (onVoicemailDeletedListener != null) {
+      onVoicemailDeletedListener.onVoicemailDeleteUndo(rowId, adapterPosition, voicemailUri);
     }
   }
 
   void onVoicemailDeletedInDatabase() {
-    if (mOnVoicemailDeletedListener != null) {
-      mOnVoicemailDeletedListener.onVoicemailDeletedInDatabase(mRowId, mVoicemailUri);
+    if (onVoicemailDeletedListener != null) {
+      onVoicemailDeletedListener.onVoicemailDeletedInDatabase(rowId, voicemailUri);
     }
   }
 
   @VisibleForTesting
   public boolean isPlaying() {
-    return mIsPlaying;
+    return isPlaying;
   }
 
   @VisibleForTesting
   public boolean isSpeakerphoneOn() {
-    return mIsSpeakerphoneOn;
+    return isSpeakerphoneOn;
   }
 
   /**
@@ -831,19 +827,19 @@
    * presenter without the presenter triggering the audio manager and duplicating actions.
    */
   public void setSpeakerphoneOn(boolean on) {
-    if (mView == null) {
+    if (view == null) {
       return;
     }
 
-    mView.onSpeakerphoneOn(on);
+    view.onSpeakerphoneOn(on);
 
-    mIsSpeakerphoneOn = on;
+    isSpeakerphoneOn = on;
 
     // This should run even if speakerphone is not being toggled because we may be switching
     // from earpiece to headphone and vise versa. Also upon initial setup the default audio
     // source is the earpiece, so we want to trigger the proximity sensor.
-    if (mIsPlaying) {
-      if (on || mVoicemailAudioManager.isWiredHeadsetPluggedIn()) {
+    if (isPlaying) {
+      if (on || voicemailAudioManager.isWiredHeadsetPluggedIn()) {
         disableProximitySensor(false /* waitForFarState */);
       } else {
         enableProximitySensor();
@@ -853,16 +849,16 @@
 
   @VisibleForTesting
   public void clearInstance() {
-    sInstance = null;
+    instance = null;
   }
 
   private void showShareVoicemailButton(boolean show) {
-    if (mContext == null) {
+    if (context == null) {
       return;
     }
-    if (isShareVoicemailAllowed(mContext) && shareVoicemailButtonView != null) {
+    if (isShareVoicemailAllowed(context) && shareVoicemailButtonView != null) {
       if (show) {
-        Logger.get(mContext).logImpression(DialerImpression.Type.VVM_SHARE_VISIBLE);
+        Logger.get(context).logImpression(DialerImpression.Type.VVM_SHARE_VISIBLE);
       }
       LogUtil.d("VoicemailPlaybackPresenter.showShareVoicemailButton", "show: %b", show);
       shareVoicemailButtonView.setVisibility(show ? View.VISIBLE : View.GONE);
@@ -931,7 +927,7 @@
    * voicemail to a temporary file in background and launch a chooser intent to share it.
    */
   public void shareVoicemail() {
-    shareVoicemailExecutor.executeParallel(new Pair<>(mContext, mVoicemailUri));
+    shareVoicemailExecutor.executeParallel(new Pair<>(context, voicemailUri));
   }
 
   private static String getFileName(String cachedName, String number, String mimeType, long date) {
@@ -1052,55 +1048,55 @@
   @ThreadSafe
   private class FetchResultHandler extends ContentObserver implements Runnable {
 
-    private final Handler mFetchResultHandler;
-    private final Uri mVoicemailUri;
-    private AtomicBoolean mIsWaitingForResult = new AtomicBoolean(true);
+    private final Handler fetchResultHandler;
+    private final Uri voicemailUri;
+    private AtomicBoolean isWaitingForResult = new AtomicBoolean(true);
 
     public FetchResultHandler(Handler handler, Uri uri, int code) {
       super(handler);
-      mFetchResultHandler = handler;
-      mVoicemailUri = uri;
-      if (mContext != null) {
-        if (PermissionsUtil.hasReadVoicemailPermissions(mContext)) {
-          mContext.getContentResolver().registerContentObserver(mVoicemailUri, false, this);
+      fetchResultHandler = handler;
+      voicemailUri = uri;
+      if (context != null) {
+        if (PermissionsUtil.hasReadVoicemailPermissions(context)) {
+          context.getContentResolver().registerContentObserver(voicemailUri, false, this);
         }
-        mFetchResultHandler.postDelayed(this, FETCH_CONTENT_TIMEOUT_MS);
+        fetchResultHandler.postDelayed(this, FETCH_CONTENT_TIMEOUT_MS);
       }
     }
 
     /** Stop waiting for content and notify UI if {@link FETCH_CONTENT_TIMEOUT_MS} has elapsed. */
     @Override
     public void run() {
-      if (mIsWaitingForResult.getAndSet(false) && mContext != null) {
-        mContext.getContentResolver().unregisterContentObserver(this);
-        if (mView != null) {
-          mView.setFetchContentTimeout();
+      if (isWaitingForResult.getAndSet(false) && context != null) {
+        context.getContentResolver().unregisterContentObserver(this);
+        if (view != null) {
+          view.setFetchContentTimeout();
         }
       }
     }
 
     public void destroy() {
-      if (mIsWaitingForResult.getAndSet(false) && mContext != null) {
-        mContext.getContentResolver().unregisterContentObserver(this);
-        mFetchResultHandler.removeCallbacks(this);
+      if (isWaitingForResult.getAndSet(false) && context != null) {
+        context.getContentResolver().unregisterContentObserver(this);
+        fetchResultHandler.removeCallbacks(this);
       }
     }
 
     @Override
     public void onChange(boolean selfChange) {
-      mAsyncTaskExecutor.submit(
+      asyncTaskExecutor.submit(
           Tasks.CHECK_CONTENT_AFTER_CHANGE,
           new AsyncTask<Void, Void, Boolean>() {
 
             @Override
             public Boolean doInBackground(Void... params) {
-              return queryHasContent(mVoicemailUri);
+              return queryHasContent(voicemailUri);
             }
 
             @Override
             public void onPostExecute(Boolean hasContent) {
-              if (hasContent && mContext != null && mIsWaitingForResult.getAndSet(false)) {
-                mContext.getContentResolver().unregisterContentObserver(FetchResultHandler.this);
+              if (hasContent && context != null && isWaitingForResult.getAndSet(false)) {
+                context.getContentResolver().unregisterContentObserver(FetchResultHandler.this);
                 showShareVoicemailButton(true);
                 prepareContent();
               }
diff --git a/java/com/android/dialer/app/voicemail/WiredHeadsetManager.java b/java/com/android/dialer/app/voicemail/WiredHeadsetManager.java
index 24d4c6f..2873f8d 100644
--- a/java/com/android/dialer/app/voicemail/WiredHeadsetManager.java
+++ b/java/com/android/dialer/app/voicemail/WiredHeadsetManager.java
@@ -20,50 +20,52 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.media.AudioManager;
-import android.util.Log;
+import com.android.dialer.common.LogUtil;
 
 /** Listens for and caches headset state. */
 class WiredHeadsetManager {
 
   private static final String TAG = WiredHeadsetManager.class.getSimpleName();
-  private final WiredHeadsetBroadcastReceiver mReceiver;
-  private boolean mIsPluggedIn;
-  private Listener mListener;
-  private Context mContext;
+  private final WiredHeadsetBroadcastReceiver receiver;
+  private boolean isPluggedIn;
+  private Listener listener;
+  private Context context;
 
   WiredHeadsetManager(Context context) {
-    mContext = context;
-    mReceiver = new WiredHeadsetBroadcastReceiver();
+    this.context = context;
+    receiver = new WiredHeadsetBroadcastReceiver();
 
     AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
-    mIsPluggedIn = audioManager.isWiredHeadsetOn();
+    isPluggedIn = audioManager.isWiredHeadsetOn();
   }
 
   void setListener(Listener listener) {
-    mListener = listener;
+    this.listener = listener;
   }
 
   boolean isPluggedIn() {
-    return mIsPluggedIn;
+    return isPluggedIn;
   }
 
   void registerReceiver() {
     // Register for misc other intent broadcasts.
     IntentFilter intentFilter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
-    mContext.registerReceiver(mReceiver, intentFilter);
+    context.registerReceiver(receiver, intentFilter);
   }
 
   void unregisterReceiver() {
-    mContext.unregisterReceiver(mReceiver);
+    context.unregisterReceiver(receiver);
   }
 
   private void onHeadsetPluggedInChanged(boolean isPluggedIn) {
-    if (mIsPluggedIn != isPluggedIn) {
-      Log.v(TAG, "onHeadsetPluggedInChanged, mIsPluggedIn: " + mIsPluggedIn + " -> " + isPluggedIn);
-      boolean oldIsPluggedIn = mIsPluggedIn;
-      mIsPluggedIn = isPluggedIn;
-      if (mListener != null) {
-        mListener.onWiredHeadsetPluggedInChanged(oldIsPluggedIn, mIsPluggedIn);
+    if (this.isPluggedIn != isPluggedIn) {
+      LogUtil.v(
+          TAG,
+          "onHeadsetPluggedInChanged, mIsPluggedIn: " + this.isPluggedIn + " -> " + isPluggedIn);
+      boolean oldIsPluggedIn = this.isPluggedIn;
+      this.isPluggedIn = isPluggedIn;
+      if (listener != null) {
+        listener.onWiredHeadsetPluggedInChanged(oldIsPluggedIn, this.isPluggedIn);
       }
     }
   }
@@ -80,7 +82,7 @@
     public void onReceive(Context context, Intent intent) {
       if (AudioManager.ACTION_HEADSET_PLUG.equals(intent.getAction())) {
         boolean isPluggedIn = intent.getIntExtra("state", 0) == 1;
-        Log.v(TAG, "ACTION_HEADSET_PLUG event, plugged in: " + isPluggedIn);
+        LogUtil.v(TAG, "ACTION_HEADSET_PLUG event, plugged in: " + isPluggedIn);
         onHeadsetPluggedInChanged(isPluggedIn);
       }
     }
diff --git a/java/com/android/dialer/app/widget/ActionBarController.java b/java/com/android/dialer/app/widget/ActionBarController.java
index 3daa0e2..8ab57bc 100644
--- a/java/com/android/dialer/app/widget/ActionBarController.java
+++ b/java/com/android/dialer/app/widget/ActionBarController.java
@@ -31,12 +31,12 @@
   private static final String KEY_IS_FADED_OUT = "key_actionbar_is_faded_out";
   private static final String KEY_IS_EXPANDED = "key_actionbar_is_expanded";
 
-  private ActivityUi mActivityUi;
-  private SearchEditTextLayout mSearchBox;
+  private ActivityUi activityUi;
+  private SearchEditTextLayout searchBox;
 
-  private boolean mIsActionBarSlidUp;
+  private boolean isActionBarSlidUp;
 
-  private final AnimationCallback mFadeOutCallback =
+  private final AnimationCallback fadeOutCallback =
       new AnimationCallback() {
         @Override
         public void onAnimationEnd() {
@@ -49,24 +49,23 @@
         }
       };
 
-  private ValueAnimator mAnimator;
+  private ValueAnimator animator;
 
   public ActionBarController(ActivityUi activityUi, SearchEditTextLayout searchBox) {
-    mActivityUi = activityUi;
-    mSearchBox = searchBox;
+    this.activityUi = activityUi;
+    this.searchBox = searchBox;
   }
 
   /** @return Whether or not the action bar is currently showing (both slid down and visible) */
   public boolean isActionBarShowing() {
-    return !mIsActionBarSlidUp && !mSearchBox.isFadedOut();
+    return !isActionBarSlidUp && !searchBox.isFadedOut();
   }
 
   /** Called when the user has tapped on the collapsed search box, to start a new search query. */
   public void onSearchBoxTapped() {
-    LogUtil.d(
-        "ActionBarController.onSearchBoxTapped", "isInSearchUi " + mActivityUi.isInSearchUi());
-    if (!mActivityUi.isInSearchUi()) {
-      mSearchBox.expand(true /* animate */, true /* requestFocus */);
+    LogUtil.d("ActionBarController.onSearchBoxTapped", "isInSearchUi " + activityUi.isInSearchUi());
+    if (!activityUi.isInSearchUi()) {
+      searchBox.expand(true /* animate */, true /* requestFocus */);
     }
   }
 
@@ -75,13 +74,13 @@
     LogUtil.d(
         "ActionBarController.onSearchUIExited",
         "isExpanded: %b, isFadedOut %b",
-        mSearchBox.isExpanded(),
-        mSearchBox.isFadedOut());
-    if (mSearchBox.isExpanded()) {
-      mSearchBox.collapse(true /* animate */);
+        searchBox.isExpanded(),
+        searchBox.isFadedOut());
+    if (searchBox.isExpanded()) {
+      searchBox.collapse(true /* animate */);
     }
-    if (mSearchBox.isFadedOut()) {
-      mSearchBox.fadeIn();
+    if (searchBox.isFadedOut()) {
+      searchBox.fadeIn();
     }
 
     slideActionBar(false /* slideUp */, false /* animate */);
@@ -95,16 +94,16 @@
     LogUtil.d(
         "ActionBarController.onDialpadDown",
         "isInSearchUi: %b, hasSearchQuery: %b, isFadedOut: %b, isExpanded: %b",
-        mActivityUi.isInSearchUi(),
-        mActivityUi.hasSearchQuery(),
-        mSearchBox.isFadedOut(),
-        mSearchBox.isExpanded());
-    if (mActivityUi.isInSearchUi()) {
-      if (mSearchBox.isFadedOut()) {
-        mSearchBox.setVisible(true);
+        activityUi.isInSearchUi(),
+        activityUi.hasSearchQuery(),
+        searchBox.isFadedOut(),
+        searchBox.isExpanded());
+    if (activityUi.isInSearchUi()) {
+      if (searchBox.isFadedOut()) {
+        searchBox.setVisible(true);
       }
-      if (!mSearchBox.isExpanded()) {
-        mSearchBox.expand(false /* animate */, false /* requestFocus */);
+      if (!searchBox.isExpanded()) {
+        searchBox.expand(false /* animate */, false /* requestFocus */);
       }
       slideActionBar(false /* slideUp */, true /* animate */);
     }
@@ -115,71 +114,71 @@
    * state changes have actually occurred.
    */
   public void onDialpadUp() {
-    LogUtil.d("ActionBarController.onDialpadUp", "isInSearchUi " + mActivityUi.isInSearchUi());
-    if (mActivityUi.isInSearchUi()) {
+    LogUtil.d("ActionBarController.onDialpadUp", "isInSearchUi " + activityUi.isInSearchUi());
+    if (activityUi.isInSearchUi()) {
       slideActionBar(true /* slideUp */, true /* animate */);
     } else {
       // From the lists fragment
-      mSearchBox.fadeOut(mFadeOutCallback);
+      searchBox.fadeOut(fadeOutCallback);
     }
   }
 
   public void slideActionBar(boolean slideUp, boolean animate) {
     LogUtil.d("ActionBarController.slidingActionBar", "up: %b, animate: %b", slideUp, animate);
 
-    if (mAnimator != null && mAnimator.isRunning()) {
-      mAnimator.cancel();
-      mAnimator.removeAllUpdateListeners();
+    if (animator != null && animator.isRunning()) {
+      animator.cancel();
+      animator.removeAllUpdateListeners();
     }
     if (animate) {
-      mAnimator = slideUp ? ValueAnimator.ofFloat(0, 1) : ValueAnimator.ofFloat(1, 0);
-      mAnimator.addUpdateListener(
+      animator = slideUp ? ValueAnimator.ofFloat(0, 1) : ValueAnimator.ofFloat(1, 0);
+      animator.addUpdateListener(
           animation -> {
             final float value = (float) animation.getAnimatedValue();
-            setHideOffset((int) (mActivityUi.getActionBarHeight() * value));
+            setHideOffset((int) (activityUi.getActionBarHeight() * value));
           });
-      mAnimator.start();
+      animator.start();
     } else {
-      setHideOffset(slideUp ? mActivityUi.getActionBarHeight() : 0);
+      setHideOffset(slideUp ? activityUi.getActionBarHeight() : 0);
     }
-    mIsActionBarSlidUp = slideUp;
+    isActionBarSlidUp = slideUp;
   }
 
   public void setAlpha(float alphaValue) {
-    mSearchBox.animate().alpha(alphaValue).start();
+    searchBox.animate().alpha(alphaValue).start();
   }
 
   private void setHideOffset(int offset) {
-    mActivityUi.setActionBarHideOffset(offset);
+    activityUi.setActionBarHideOffset(offset);
   }
 
   /** Saves the current state of the action bar into a provided {@link Bundle} */
   public void saveInstanceState(Bundle outState) {
-    outState.putBoolean(KEY_IS_SLID_UP, mIsActionBarSlidUp);
-    outState.putBoolean(KEY_IS_FADED_OUT, mSearchBox.isFadedOut());
-    outState.putBoolean(KEY_IS_EXPANDED, mSearchBox.isExpanded());
+    outState.putBoolean(KEY_IS_SLID_UP, isActionBarSlidUp);
+    outState.putBoolean(KEY_IS_FADED_OUT, searchBox.isFadedOut());
+    outState.putBoolean(KEY_IS_EXPANDED, searchBox.isExpanded());
   }
 
   /** Restores the action bar state from a provided {@link Bundle}. */
   public void restoreInstanceState(Bundle inState) {
-    mIsActionBarSlidUp = inState.getBoolean(KEY_IS_SLID_UP);
+    isActionBarSlidUp = inState.getBoolean(KEY_IS_SLID_UP);
 
     final boolean isSearchBoxFadedOut = inState.getBoolean(KEY_IS_FADED_OUT);
     if (isSearchBoxFadedOut) {
-      if (!mSearchBox.isFadedOut()) {
-        mSearchBox.setVisible(false);
+      if (!searchBox.isFadedOut()) {
+        searchBox.setVisible(false);
       }
-    } else if (mSearchBox.isFadedOut()) {
-      mSearchBox.setVisible(true);
+    } else if (searchBox.isFadedOut()) {
+      searchBox.setVisible(true);
     }
 
     final boolean isSearchBoxExpanded = inState.getBoolean(KEY_IS_EXPANDED);
     if (isSearchBoxExpanded) {
-      if (!mSearchBox.isExpanded()) {
-        mSearchBox.expand(false, false);
+      if (!searchBox.isExpanded()) {
+        searchBox.expand(false, false);
       }
-    } else if (mSearchBox.isExpanded()) {
-      mSearchBox.collapse(false);
+    } else if (searchBox.isExpanded()) {
+      searchBox.collapse(false);
     }
   }
 
@@ -188,7 +187,7 @@
    * laid out and actually has a height.
    */
   public void restoreActionBarOffset() {
-    slideActionBar(mIsActionBarSlidUp /* slideUp */, false /* animate */);
+    slideActionBar(isActionBarSlidUp /* slideUp */, false /* animate */);
   }
 
   public interface ActivityUi {
diff --git a/java/com/android/dialer/app/widget/SearchEditTextLayout.java b/java/com/android/dialer/app/widget/SearchEditTextLayout.java
index ebd6208..40189a8 100644
--- a/java/com/android/dialer/app/widget/SearchEditTextLayout.java
+++ b/java/com/android/dialer/app/widget/SearchEditTextLayout.java
@@ -36,83 +36,83 @@
   private static final float EXPAND_MARGIN_FRACTION_START = 0.8f;
   private static final int ANIMATION_DURATION = 200;
   /* Subclass-visible for testing */
-  protected boolean mIsExpanded = false;
-  protected boolean mIsFadedOut = false;
-  private OnKeyListener mPreImeKeyListener;
-  private int mTopMargin;
-  private int mBottomMargin;
-  private int mLeftMargin;
-  private int mRightMargin;
-  private float mCollapsedElevation;
-  private View mCollapsed;
-  private View mExpanded;
-  private EditText mSearchView;
-  private View mSearchIcon;
-  private View mCollapsedSearchBox;
-  private View mVoiceSearchButtonView;
-  private View mOverflowButtonView;
-  private View mClearButtonView;
+  protected boolean isExpanded = false;
+  protected boolean isFadedOut = false;
+  private OnKeyListener preImeKeyListener;
+  private int topMargin;
+  private int bottomMargin;
+  private int leftMargin;
+  private int rightMargin;
+  private float collapsedElevation;
+  private View collapsed;
+  private View expanded;
+  private EditText searchView;
+  private View searchIcon;
+  private View collapsedSearchBox;
+  private View voiceSearchButtonView;
+  private View overflowButtonView;
+  private View clearButtonView;
 
-  private ValueAnimator mAnimator;
+  private ValueAnimator animator;
 
-  private Callback mCallback;
+  private Callback callback;
 
-  private boolean mVoiceSearchEnabled;
+  private boolean voiceSearchEnabled;
 
   public SearchEditTextLayout(Context context, AttributeSet attrs) {
     super(context, attrs);
   }
 
   public void setPreImeKeyListener(OnKeyListener listener) {
-    mPreImeKeyListener = listener;
+    preImeKeyListener = listener;
   }
 
   public void setCallback(Callback listener) {
-    mCallback = listener;
+    callback = listener;
   }
 
   public void setVoiceSearchEnabled(boolean enabled) {
-    mVoiceSearchEnabled = enabled;
-    updateVisibility(mIsExpanded);
+    voiceSearchEnabled = enabled;
+    updateVisibility(isExpanded);
   }
 
   @Override
   protected void onFinishInflate() {
     MarginLayoutParams params = (MarginLayoutParams) getLayoutParams();
-    mTopMargin = params.topMargin;
-    mBottomMargin = params.bottomMargin;
-    mLeftMargin = params.leftMargin;
-    mRightMargin = params.rightMargin;
+    topMargin = params.topMargin;
+    bottomMargin = params.bottomMargin;
+    leftMargin = params.leftMargin;
+    rightMargin = params.rightMargin;
 
-    mCollapsedElevation = getElevation();
+    collapsedElevation = getElevation();
 
-    mCollapsed = findViewById(R.id.search_box_collapsed);
-    mExpanded = findViewById(R.id.search_box_expanded);
-    mSearchView = (EditText) mExpanded.findViewById(R.id.search_view);
+    collapsed = findViewById(R.id.search_box_collapsed);
+    expanded = findViewById(R.id.search_box_expanded);
+    searchView = (EditText) expanded.findViewById(R.id.search_view);
 
-    mSearchIcon = findViewById(R.id.search_magnifying_glass);
-    mCollapsedSearchBox = findViewById(R.id.search_box_start_search);
-    mVoiceSearchButtonView = findViewById(R.id.voice_search_button);
-    mOverflowButtonView = findViewById(R.id.dialtacts_options_menu_button);
-    mClearButtonView = findViewById(R.id.search_close_button);
+    searchIcon = findViewById(R.id.search_magnifying_glass);
+    collapsedSearchBox = findViewById(R.id.search_box_start_search);
+    voiceSearchButtonView = findViewById(R.id.voice_search_button);
+    overflowButtonView = findViewById(R.id.dialtacts_options_menu_button);
+    clearButtonView = findViewById(R.id.search_close_button);
 
     // Convert a long click into a click to expand the search box. Touch events are also
     // forwarded to the searchView. This accelerates the long-press scenario for copy/paste.
-    mCollapsed.setOnLongClickListener(
+    collapsed.setOnLongClickListener(
         new OnLongClickListener() {
           @Override
           public boolean onLongClick(View view) {
-            mCollapsed.performClick();
+            collapsed.performClick();
             return false;
           }
         });
-    mCollapsed.setOnTouchListener(
+    collapsed.setOnTouchListener(
         (v, event) -> {
-          mSearchView.onTouchEvent(event);
+          searchView.onTouchEvent(event);
           return false;
         });
 
-    mSearchView.setOnFocusChangeListener(
+    searchView.setOnFocusChangeListener(
         new OnFocusChangeListener() {
           @Override
           public void onFocusChange(View v, boolean hasFocus) {
@@ -124,24 +124,24 @@
           }
         });
 
-    mSearchView.setOnClickListener(
+    searchView.setOnClickListener(
         new View.OnClickListener() {
           @Override
           public void onClick(View v) {
-            if (mCallback != null) {
-              mCallback.onSearchViewClicked();
+            if (callback != null) {
+              callback.onSearchViewClicked();
             }
           }
         });
 
-    mSearchView.addTextChangedListener(
+    searchView.addTextChangedListener(
         new TextWatcher() {
           @Override
           public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
 
           @Override
           public void onTextChanged(CharSequence s, int start, int before, int count) {
-            mClearButtonView.setVisibility(TextUtils.isEmpty(s) ? View.GONE : View.VISIBLE);
+            clearButtonView.setVisibility(TextUtils.isEmpty(s) ? View.GONE : View.VISIBLE);
           }
 
           @Override
@@ -153,7 +153,7 @@
             new OnClickListener() {
               @Override
               public void onClick(View v) {
-                mSearchView.setText(null);
+                searchView.setText(null);
               }
             });
 
@@ -162,8 +162,8 @@
             new OnClickListener() {
               @Override
               public void onClick(View v) {
-                if (mCallback != null) {
-                  mCallback.onBackButtonClicked();
+                if (callback != null) {
+                  callback.onBackButtonClicked();
                 }
               }
             });
@@ -173,8 +173,8 @@
 
   @Override
   public boolean dispatchKeyEventPreIme(KeyEvent event) {
-    if (mPreImeKeyListener != null) {
-      if (mPreImeKeyListener.onKey(this, event.getKeyCode(), event)) {
+    if (preImeKeyListener != null) {
+      if (preImeKeyListener.onKey(this, event.getKeyCode(), event)) {
         return true;
       }
     }
@@ -187,28 +187,28 @@
 
   public void fadeOut(AnimUtils.AnimationCallback callback) {
     AnimUtils.fadeOut(this, ANIMATION_DURATION, callback);
-    mIsFadedOut = true;
+    isFadedOut = true;
   }
 
   public void fadeIn() {
     AnimUtils.fadeIn(this, ANIMATION_DURATION);
-    mIsFadedOut = false;
+    isFadedOut = false;
   }
 
   public void fadeIn(AnimUtils.AnimationCallback callback) {
     AnimUtils.fadeIn(this, ANIMATION_DURATION, AnimUtils.NO_DELAY, callback);
-    mIsFadedOut = false;
+    isFadedOut = false;
   }
 
   public void setVisible(boolean visible) {
     if (visible) {
       setAlpha(1);
       setVisibility(View.VISIBLE);
-      mIsFadedOut = false;
+      isFadedOut = false;
     } else {
       setAlpha(0);
       setVisibility(View.GONE);
-      mIsFadedOut = true;
+      isFadedOut = true;
     }
   }
 
@@ -216,15 +216,15 @@
     updateVisibility(true /* isExpand */);
 
     if (animate) {
-      AnimUtils.crossFadeViews(mExpanded, mCollapsed, ANIMATION_DURATION);
-      mAnimator = ValueAnimator.ofFloat(EXPAND_MARGIN_FRACTION_START, 0f);
+      AnimUtils.crossFadeViews(expanded, collapsed, ANIMATION_DURATION);
+      animator = ValueAnimator.ofFloat(EXPAND_MARGIN_FRACTION_START, 0f);
       setMargins(EXPAND_MARGIN_FRACTION_START);
       prepareAnimator();
     } else {
-      mExpanded.setVisibility(View.VISIBLE);
-      mExpanded.setAlpha(1);
+      expanded.setVisibility(View.VISIBLE);
+      expanded.setAlpha(1);
       setMargins(0f);
-      mCollapsed.setVisibility(View.GONE);
+      collapsed.setVisibility(View.GONE);
     }
 
     // Set 9-patch background. This owns the padding, so we need to restore the original values.
@@ -237,27 +237,27 @@
     setPaddingRelative(paddingStart, paddingTop, paddingEnd, paddingBottom);
 
     if (requestFocus) {
-      mSearchView.requestFocus();
+      searchView.requestFocus();
     }
-    mIsExpanded = true;
+    isExpanded = true;
   }
 
   public void collapse(boolean animate) {
     updateVisibility(false /* isExpand */);
 
     if (animate) {
-      AnimUtils.crossFadeViews(mCollapsed, mExpanded, ANIMATION_DURATION);
-      mAnimator = ValueAnimator.ofFloat(0f, 1f);
+      AnimUtils.crossFadeViews(collapsed, expanded, ANIMATION_DURATION);
+      animator = ValueAnimator.ofFloat(0f, 1f);
       prepareAnimator();
     } else {
-      mCollapsed.setVisibility(View.VISIBLE);
-      mCollapsed.setAlpha(1);
+      collapsed.setVisibility(View.VISIBLE);
+      collapsed.setAlpha(1);
       setMargins(1f);
-      mExpanded.setVisibility(View.GONE);
+      expanded.setVisibility(View.GONE);
     }
 
-    mIsExpanded = false;
-    setElevation(mCollapsedElevation);
+    isExpanded = false;
+    setElevation(collapsedElevation);
     setBackgroundResource(R.drawable.rounded_corner);
   }
 
@@ -271,30 +271,30 @@
     int collapsedViewVisibility = isExpand ? View.GONE : View.VISIBLE;
     int expandedViewVisibility = isExpand ? View.VISIBLE : View.GONE;
 
-    mSearchIcon.setVisibility(collapsedViewVisibility);
-    mCollapsedSearchBox.setVisibility(collapsedViewVisibility);
-    if (mVoiceSearchEnabled) {
-      mVoiceSearchButtonView.setVisibility(collapsedViewVisibility);
+    searchIcon.setVisibility(collapsedViewVisibility);
+    collapsedSearchBox.setVisibility(collapsedViewVisibility);
+    if (voiceSearchEnabled) {
+      voiceSearchButtonView.setVisibility(collapsedViewVisibility);
     } else {
-      mVoiceSearchButtonView.setVisibility(View.GONE);
+      voiceSearchButtonView.setVisibility(View.GONE);
     }
-    mOverflowButtonView.setVisibility(collapsedViewVisibility);
+    overflowButtonView.setVisibility(collapsedViewVisibility);
     // TODO: Prevents keyboard from jumping up in landscape mode after exiting the
     // SearchFragment when the query string is empty. More elegant fix?
-    //mExpandedSearchBox.setVisibility(expandedViewVisibility);
-    if (TextUtils.isEmpty(mSearchView.getText())) {
-      mClearButtonView.setVisibility(View.GONE);
+    // mExpandedSearchBox.setVisibility(expandedViewVisibility);
+    if (TextUtils.isEmpty(searchView.getText())) {
+      clearButtonView.setVisibility(View.GONE);
     } else {
-      mClearButtonView.setVisibility(expandedViewVisibility);
+      clearButtonView.setVisibility(expandedViewVisibility);
     }
   }
 
   private void prepareAnimator() {
-    if (mAnimator != null) {
-      mAnimator.cancel();
+    if (animator != null) {
+      animator.cancel();
     }
 
-    mAnimator.addUpdateListener(
+    animator.addUpdateListener(
         new AnimatorUpdateListener() {
           @Override
           public void onAnimationUpdate(ValueAnimator animation) {
@@ -303,16 +303,16 @@
           }
         });
 
-    mAnimator.setDuration(ANIMATION_DURATION);
-    mAnimator.start();
+    animator.setDuration(ANIMATION_DURATION);
+    animator.start();
   }
 
   public boolean isExpanded() {
-    return mIsExpanded;
+    return isExpanded;
   }
 
   public boolean isFadedOut() {
-    return mIsFadedOut;
+    return isFadedOut;
   }
 
   /**
@@ -322,10 +322,10 @@
    */
   private void setMargins(float fraction) {
     MarginLayoutParams params = (MarginLayoutParams) getLayoutParams();
-    params.topMargin = (int) (mTopMargin * fraction);
-    params.bottomMargin = (int) (mBottomMargin * fraction);
-    params.leftMargin = (int) (mLeftMargin * fraction);
-    params.rightMargin = (int) (mRightMargin * fraction);
+    params.topMargin = (int) (topMargin * fraction);
+    params.bottomMargin = (int) (bottomMargin * fraction);
+    params.leftMargin = (int) (leftMargin * fraction);
+    params.rightMargin = (int) (rightMargin * fraction);
     requestLayout();
   }
 
diff --git a/java/com/android/dialer/blocking/BlockNumberDialogFragment.java b/java/com/android/dialer/blocking/BlockNumberDialogFragment.java
index 7ef77c4..f723a9c 100644
--- a/java/com/android/dialer/blocking/BlockNumberDialogFragment.java
+++ b/java/com/android/dialer/blocking/BlockNumberDialogFragment.java
@@ -49,13 +49,13 @@
   private static final String ARG_COUNTRY_ISO = "argCountryIso";
   private static final String ARG_DISPLAY_NUMBER = "argDisplayNumber";
   private static final String ARG_PARENT_VIEW_ID = "parentViewId";
-  private String mNumber;
-  private String mDisplayNumber;
-  private String mCountryIso;
-  private FilteredNumberAsyncQueryHandler mHandler;
-  private View mParentView;
-  private VisualVoicemailEnabledChecker mVoicemailEnabledChecker;
-  private Callback mCallback;
+  private String number;
+  private String displayNumber;
+  private String countryIso;
+  private FilteredNumberAsyncQueryHandler handler;
+  private View parentView;
+  private VisualVoicemailEnabledChecker voicemailEnabledChecker;
+  private Callback callback;
 
   public static BlockNumberDialogFragment show(
       Integer blockId,
@@ -97,7 +97,7 @@
 
   public void setFilteredNumberAsyncQueryHandlerForTesting(
       FilteredNumberAsyncQueryHandler handler) {
-    mHandler = handler;
+    this.handler = handler;
   }
 
   @Override
@@ -110,19 +110,19 @@
     super.onCreateDialog(savedInstanceState);
     final boolean isBlocked = getArguments().containsKey(ARG_BLOCK_ID);
 
-    mNumber = getArguments().getString(ARG_NUMBER);
-    mDisplayNumber = getArguments().getString(ARG_DISPLAY_NUMBER);
-    mCountryIso = getArguments().getString(ARG_COUNTRY_ISO);
+    number = getArguments().getString(ARG_NUMBER);
+    displayNumber = getArguments().getString(ARG_DISPLAY_NUMBER);
+    countryIso = getArguments().getString(ARG_COUNTRY_ISO);
 
-    if (TextUtils.isEmpty(mDisplayNumber)) {
-      mDisplayNumber = mNumber;
+    if (TextUtils.isEmpty(displayNumber)) {
+      displayNumber = number;
     }
 
-    mHandler = new FilteredNumberAsyncQueryHandler(getContext());
-    mVoicemailEnabledChecker = new VisualVoicemailEnabledChecker(getActivity(), null);
+    handler = new FilteredNumberAsyncQueryHandler(getContext());
+    voicemailEnabledChecker = new VisualVoicemailEnabledChecker(getActivity(), null);
     // Choose not to update VoicemailEnabledChecker, as checks should already been done in
     // all current use cases.
-    mParentView = getActivity().findViewById(getArguments().getInt(ARG_PARENT_VIEW_ID));
+    parentView = getActivity().findViewById(getArguments().getInt(ARG_PARENT_VIEW_ID));
 
     CharSequence title;
     String okText;
@@ -132,16 +132,16 @@
       okText = getString(R.string.unblock_number_ok);
       message =
           ContactDisplayUtils.getTtsSpannedPhoneNumber(
-                  getResources(), R.string.unblock_number_confirmation_title, mDisplayNumber)
+                  getResources(), R.string.unblock_number_confirmation_title, displayNumber)
               .toString();
     } else {
       title =
           ContactDisplayUtils.getTtsSpannedPhoneNumber(
-              getResources(), R.string.block_number_confirmation_title, mDisplayNumber);
+              getResources(), R.string.block_number_confirmation_title, displayNumber);
       okText = getString(R.string.block_number_ok);
       if (FilteredNumberCompat.useNewFiltering(getContext())) {
         message = getString(R.string.block_number_confirmation_message_new_filtering);
-      } else if (mVoicemailEnabledChecker.isVisualVoicemailEnabled()) {
+      } else if (voicemailEnabledChecker.isVisualVoicemailEnabled()) {
         message = getString(R.string.block_number_confirmation_message_vvm);
       } else {
         message = getString(R.string.block_number_confirmation_message_no_vvm);
@@ -171,13 +171,13 @@
   @Override
   public void onActivityCreated(Bundle savedInstanceState) {
     super.onActivityCreated(savedInstanceState);
-    String e164Number = PhoneNumberUtils.formatNumberToE164(mNumber, mCountryIso);
-    if (!FilteredNumbersUtil.canBlockNumber(getContext(), e164Number, mNumber)) {
+    String e164Number = PhoneNumberUtils.formatNumberToE164(number, countryIso);
+    if (!FilteredNumbersUtil.canBlockNumber(getContext(), e164Number, number)) {
       dismiss();
       Toast.makeText(
               getContext(),
               ContactDisplayUtils.getTtsSpannedPhoneNumber(
-                  getResources(), R.string.invalidNumber, mDisplayNumber),
+                  getResources(), R.string.invalidNumber, displayNumber),
               Toast.LENGTH_SHORT)
           .show();
     }
@@ -187,23 +187,23 @@
   public void onPause() {
     // Dismiss on rotation.
     dismiss();
-    mCallback = null;
+    callback = null;
 
     super.onPause();
   }
 
   public void setCallback(Callback callback) {
-    mCallback = callback;
+    this.callback = callback;
   }
 
   private CharSequence getBlockedMessage() {
     return ContactDisplayUtils.getTtsSpannedPhoneNumber(
-        getResources(), R.string.snackbar_number_blocked, mDisplayNumber);
+        getResources(), R.string.snackbar_number_blocked, displayNumber);
   }
 
   private CharSequence getUnblockedMessage() {
     return ContactDisplayUtils.getTtsSpannedPhoneNumber(
-        getResources(), R.string.snackbar_number_unblocked, mDisplayNumber);
+        getResources(), R.string.snackbar_number_unblocked, displayNumber);
   }
 
   private int getActionTextColor() {
@@ -213,7 +213,7 @@
   private void blockNumber() {
     final CharSequence message = getBlockedMessage();
     final CharSequence undoMessage = getUnblockedMessage();
-    final Callback callback = mCallback;
+    final Callback callback = this.callback;
     final int actionTextColor = getActionTextColor();
     final Context applicationContext = getContext().getApplicationContext();
 
@@ -221,7 +221,7 @@
         new OnUnblockNumberListener() {
           @Override
           public void onUnblockComplete(int rows, ContentValues values) {
-            Snackbar.make(mParentView, undoMessage, Snackbar.LENGTH_LONG).show();
+            Snackbar.make(parentView, undoMessage, Snackbar.LENGTH_LONG).show();
             if (callback != null) {
               callback.onChangeFilteredNumberUndo();
             }
@@ -239,11 +239,11 @@
                     // Delete the newly created row on 'undo'.
                     Logger.get(applicationContext)
                         .logInteraction(InteractionEvent.Type.UNDO_BLOCK_NUMBER);
-                    mHandler.unblock(onUndoListener, uri);
+                    handler.unblock(onUndoListener, uri);
                   }
                 };
 
-            Snackbar.make(mParentView, message, Snackbar.LENGTH_LONG)
+            Snackbar.make(parentView, message, Snackbar.LENGTH_LONG)
                 .setAction(R.string.block_number_undo, undoListener)
                 .setActionTextColor(actionTextColor)
                 .show();
@@ -258,13 +258,13 @@
           }
         };
 
-    mHandler.blockNumber(onBlockNumberListener, mNumber, mCountryIso);
+    handler.blockNumber(onBlockNumberListener, number, countryIso);
   }
 
   private void unblockNumber() {
     final CharSequence message = getUnblockedMessage();
     final CharSequence undoMessage = getBlockedMessage();
-    final Callback callback = mCallback;
+    final Callback callback = this.callback;
     final int actionTextColor = getActionTextColor();
     final Context applicationContext = getContext().getApplicationContext();
 
@@ -272,14 +272,14 @@
         new OnBlockNumberListener() {
           @Override
           public void onBlockComplete(final Uri uri) {
-            Snackbar.make(mParentView, undoMessage, Snackbar.LENGTH_LONG).show();
+            Snackbar.make(parentView, undoMessage, Snackbar.LENGTH_LONG).show();
             if (callback != null) {
               callback.onChangeFilteredNumberUndo();
             }
           }
         };
 
-    mHandler.unblock(
+    handler.unblock(
         new OnUnblockNumberListener() {
           @Override
           public void onUnblockComplete(int rows, final ContentValues values) {
@@ -290,11 +290,11 @@
                     // Re-insert the row on 'undo', with a new ID.
                     Logger.get(applicationContext)
                         .logInteraction(InteractionEvent.Type.UNDO_UNBLOCK_NUMBER);
-                    mHandler.blockNumber(onUndoListener, values);
+                    handler.blockNumber(onUndoListener, values);
                   }
                 };
 
-            Snackbar.make(mParentView, message, Snackbar.LENGTH_LONG)
+            Snackbar.make(parentView, message, Snackbar.LENGTH_LONG)
                 .setAction(R.string.block_number_undo, undoListener)
                 .setActionTextColor(actionTextColor)
                 .show();
diff --git a/java/com/android/dialer/blocking/BlockReportSpamDialogs.java b/java/com/android/dialer/blocking/BlockReportSpamDialogs.java
index b5f81fc..255d7cb 100644
--- a/java/com/android/dialer/blocking/BlockReportSpamDialogs.java
+++ b/java/com/android/dialer/blocking/BlockReportSpamDialogs.java
@@ -102,18 +102,18 @@
   private static class CommonDialogsFragment extends DialogFragment {
 
     /** The number to display in the dialog title. */
-    protected String mDisplayNumber;
+    protected String displayNumber;
 
     /** Called when dialog positive button is pressed. */
-    protected OnConfirmListener mPositiveListener;
+    protected OnConfirmListener positiveListener;
 
     /** Called when dialog is dismissed. */
-    @Nullable protected DialogInterface.OnDismissListener mDismissListener;
+    @Nullable protected DialogInterface.OnDismissListener dismissListener;
 
     @Override
     public void onDismiss(DialogInterface dialog) {
-      if (mDismissListener != null) {
-        mDismissListener.onDismiss(dialog);
+      if (dismissListener != null) {
+        dismissListener.onDismiss(dialog);
       }
       super.onDismiss(dialog);
     }
@@ -122,9 +122,9 @@
     public void onPause() {
       // The dialog is dismissed onPause, i.e. rotation.
       dismiss();
-      mDismissListener = null;
-      mPositiveListener = null;
-      mDisplayNumber = null;
+      dismissListener = null;
+      positiveListener = null;
+      displayNumber = null;
       super.onPause();
     }
   }
@@ -133,10 +133,10 @@
   public static class BlockReportSpamDialogFragment extends CommonDialogsFragment {
 
     /** Called when dialog positive button is pressed. */
-    private OnSpamDialogClickListener mPositiveListener;
+    private OnSpamDialogClickListener positiveListener;
 
     /** Whether the mark as spam checkbox is checked before displaying the dialog. */
-    private boolean mSpamChecked;
+    private boolean spamChecked;
 
     public static DialogFragment newInstance(
         String displayNumber,
@@ -144,10 +144,10 @@
         OnSpamDialogClickListener positiveListener,
         @Nullable DialogInterface.OnDismissListener dismissListener) {
       BlockReportSpamDialogFragment fragment = new BlockReportSpamDialogFragment();
-      fragment.mSpamChecked = spamChecked;
-      fragment.mDisplayNumber = displayNumber;
-      fragment.mPositiveListener = positiveListener;
-      fragment.mDismissListener = dismissListener;
+      fragment.spamChecked = spamChecked;
+      fragment.displayNumber = displayNumber;
+      fragment.positiveListener = positiveListener;
+      fragment.dismissListener = dismissListener;
       return fragment;
     }
 
@@ -158,12 +158,12 @@
       final CheckBox isSpamCheckbox =
           (CheckBox) dialogView.findViewById(R.id.report_number_as_spam_action);
       // Listen for changes on the checkbox and update if orientation changes
-      isSpamCheckbox.setChecked(mSpamChecked);
+      isSpamCheckbox.setChecked(spamChecked);
       isSpamCheckbox.setOnCheckedChangeListener(
           new CompoundButton.OnCheckedChangeListener() {
             @Override
             public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
-              mSpamChecked = isChecked;
+              spamChecked = isChecked;
             }
           });
 
@@ -174,14 +174,14 @@
       Dialog dialog =
           alertDialogBuilder
               .setView(dialogView)
-              .setTitle(getString(R.string.block_report_number_alert_title, mDisplayNumber))
+              .setTitle(getString(R.string.block_report_number_alert_title, displayNumber))
               .setPositiveButton(
                   R.string.block_number_ok,
                   new DialogInterface.OnClickListener() {
                     @Override
                     public void onClick(DialogInterface dialog, int which) {
                       dismiss();
-                      mPositiveListener.onClick(isSpamCheckbox.isChecked());
+                      positiveListener.onClick(isSpamCheckbox.isChecked());
                     }
                   })
               .create();
@@ -201,9 +201,9 @@
         OnConfirmListener positiveListener,
         @Nullable DialogInterface.OnDismissListener dismissListener) {
       BlockDialogFragment fragment = new BlockDialogFragment();
-      fragment.mDisplayNumber = displayNumber;
-      fragment.mPositiveListener = positiveListener;
-      fragment.mDismissListener = dismissListener;
+      fragment.displayNumber = displayNumber;
+      fragment.positiveListener = positiveListener;
+      fragment.dismissListener = dismissListener;
       fragment.isSpamEnabled = isSpamEnabled;
       return fragment;
     }
@@ -215,14 +215,14 @@
       AlertDialog.Builder alertDialogBuilder = createDialogBuilder(getActivity(), this);
       Dialog dialog =
           alertDialogBuilder
-              .setTitle(getString(R.string.block_number_confirmation_title, mDisplayNumber))
+              .setTitle(getString(R.string.block_number_confirmation_title, displayNumber))
               .setMessage(
                   isSpamEnabled
                       ? getString(
                           R.string.block_number_alert_details, getBlockMessage(getContext()))
                       : getString(R.string.block_report_number_alert_details))
               .setPositiveButton(
-                  R.string.block_number_ok, createGenericOnClickListener(this, mPositiveListener))
+                  R.string.block_number_ok, createGenericOnClickListener(this, positiveListener))
               .create();
       dialog.setCanceledOnTouchOutside(true);
       return dialog;
@@ -233,7 +233,7 @@
   public static class UnblockDialogFragment extends CommonDialogsFragment {
 
     /** Whether or not the number is spam. */
-    private boolean mIsSpam;
+    private boolean isSpam;
 
     public static DialogFragment newInstance(
         String displayNumber,
@@ -241,10 +241,10 @@
         OnConfirmListener positiveListener,
         @Nullable DialogInterface.OnDismissListener dismissListener) {
       UnblockDialogFragment fragment = new UnblockDialogFragment();
-      fragment.mDisplayNumber = displayNumber;
-      fragment.mIsSpam = isSpam;
-      fragment.mPositiveListener = positiveListener;
-      fragment.mDismissListener = dismissListener;
+      fragment.displayNumber = displayNumber;
+      fragment.isSpam = isSpam;
+      fragment.positiveListener = positiveListener;
+      fragment.dismissListener = dismissListener;
       return fragment;
     }
 
@@ -253,18 +253,18 @@
       super.onCreateDialog(savedInstanceState);
       // Return the newly created dialog
       AlertDialog.Builder alertDialogBuilder = createDialogBuilder(getActivity(), this);
-      if (mIsSpam) {
+      if (isSpam) {
         alertDialogBuilder
             .setMessage(R.string.unblock_number_alert_details)
-            .setTitle(getString(R.string.unblock_report_number_alert_title, mDisplayNumber));
+            .setTitle(getString(R.string.unblock_report_number_alert_title, displayNumber));
       } else {
         alertDialogBuilder.setMessage(
-            getString(R.string.unblock_report_number_alert_title, mDisplayNumber));
+            getString(R.string.unblock_report_number_alert_title, displayNumber));
       }
       Dialog dialog =
           alertDialogBuilder
               .setPositiveButton(
-                  R.string.unblock_number_ok, createGenericOnClickListener(this, mPositiveListener))
+                  R.string.unblock_number_ok, createGenericOnClickListener(this, positiveListener))
               .create();
       dialog.setCanceledOnTouchOutside(true);
       return dialog;
@@ -279,9 +279,9 @@
         OnConfirmListener positiveListener,
         @Nullable DialogInterface.OnDismissListener dismissListener) {
       ReportNotSpamDialogFragment fragment = new ReportNotSpamDialogFragment();
-      fragment.mDisplayNumber = displayNumber;
-      fragment.mPositiveListener = positiveListener;
-      fragment.mDismissListener = dismissListener;
+      fragment.displayNumber = displayNumber;
+      fragment.positiveListener = positiveListener;
+      fragment.dismissListener = dismissListener;
       return fragment;
     }
 
@@ -293,10 +293,10 @@
       Dialog dialog =
           alertDialogBuilder
               .setTitle(R.string.report_not_spam_alert_title)
-              .setMessage(getString(R.string.report_not_spam_alert_details, mDisplayNumber))
+              .setMessage(getString(R.string.report_not_spam_alert_details, displayNumber))
               .setPositiveButton(
                   R.string.report_not_spam_alert_button,
-                  createGenericOnClickListener(this, mPositiveListener))
+                  createGenericOnClickListener(this, positiveListener))
               .create();
       dialog.setCanceledOnTouchOutside(true);
       return dialog;
diff --git a/java/com/android/dialer/blocking/FilteredNumberProvider.java b/java/com/android/dialer/blocking/FilteredNumberProvider.java
index 8ed781e..3fad4e2 100644
--- a/java/com/android/dialer/blocking/FilteredNumberProvider.java
+++ b/java/com/android/dialer/blocking/FilteredNumberProvider.java
@@ -38,20 +38,20 @@
 
   private static final int FILTERED_NUMBERS_TABLE = 1;
   private static final int FILTERED_NUMBERS_TABLE_ID = 2;
-  private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
-  private DialerDatabaseHelper mDialerDatabaseHelper;
+  private static final UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
+  private DialerDatabaseHelper dialerDatabaseHelper;
 
   @Override
   public boolean onCreate() {
-    mDialerDatabaseHelper = Database.get(getContext()).getDatabaseHelper(getContext());
-    if (mDialerDatabaseHelper == null) {
+    dialerDatabaseHelper = Database.get(getContext()).getDatabaseHelper(getContext());
+    if (dialerDatabaseHelper == null) {
       return false;
     }
-    sUriMatcher.addURI(
+    uriMatcher.addURI(
         FilteredNumberContract.AUTHORITY,
         FilteredNumberContract.FilteredNumber.FILTERED_NUMBERS_TABLE,
         FILTERED_NUMBERS_TABLE);
-    sUriMatcher.addURI(
+    uriMatcher.addURI(
         FilteredNumberContract.AUTHORITY,
         FilteredNumberContract.FilteredNumber.FILTERED_NUMBERS_TABLE + "/#",
         FILTERED_NUMBERS_TABLE_ID);
@@ -61,10 +61,10 @@
   @Override
   public Cursor query(
       Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
-    final SQLiteDatabase db = mDialerDatabaseHelper.getReadableDatabase();
+    final SQLiteDatabase db = dialerDatabaseHelper.getReadableDatabase();
     SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
     qb.setTables(DialerDatabaseHelper.Tables.FILTERED_NUMBER_TABLE);
-    final int match = sUriMatcher.match(uri);
+    final int match = uriMatcher.match(uri);
     switch (match) {
       case FILTERED_NUMBERS_TABLE:
         break;
@@ -91,7 +91,7 @@
 
   @Override
   public Uri insert(Uri uri, ContentValues values) {
-    SQLiteDatabase db = mDialerDatabaseHelper.getWritableDatabase();
+    SQLiteDatabase db = dialerDatabaseHelper.getWritableDatabase();
     setDefaultValues(values);
     long id = db.insert(DialerDatabaseHelper.Tables.FILTERED_NUMBER_TABLE, null, values);
     if (id < 0) {
@@ -120,8 +120,8 @@
 
   @Override
   public int delete(Uri uri, String selection, String[] selectionArgs) {
-    SQLiteDatabase db = mDialerDatabaseHelper.getWritableDatabase();
-    final int match = sUriMatcher.match(uri);
+    SQLiteDatabase db = dialerDatabaseHelper.getWritableDatabase();
+    final int match = uriMatcher.match(uri);
     switch (match) {
       case FILTERED_NUMBERS_TABLE:
         break;
@@ -141,8 +141,8 @@
 
   @Override
   public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
-    SQLiteDatabase db = mDialerDatabaseHelper.getWritableDatabase();
-    final int match = sUriMatcher.match(uri);
+    SQLiteDatabase db = dialerDatabaseHelper.getWritableDatabase();
+    final int match = uriMatcher.match(uri);
     switch (match) {
       case FILTERED_NUMBERS_TABLE:
         break;
diff --git a/java/com/android/dialer/blocking/MigrateBlockedNumbersDialogFragment.java b/java/com/android/dialer/blocking/MigrateBlockedNumbersDialogFragment.java
index 76e50b3..9b416ff 100644
--- a/java/com/android/dialer/blocking/MigrateBlockedNumbersDialogFragment.java
+++ b/java/com/android/dialer/blocking/MigrateBlockedNumbersDialogFragment.java
@@ -32,8 +32,8 @@
  */
 public class MigrateBlockedNumbersDialogFragment extends DialogFragment {
 
-  private BlockedNumbersMigrator mBlockedNumbersMigrator;
-  private BlockedNumbersMigrator.Listener mMigrationListener;
+  private BlockedNumbersMigrator blockedNumbersMigrator;
+  private BlockedNumbersMigrator.Listener migrationListener;
 
   /**
    * Creates a new MigrateBlockedNumbersDialogFragment.
@@ -49,8 +49,8 @@
       BlockedNumbersMigrator blockedNumbersMigrator,
       BlockedNumbersMigrator.Listener migrationListener) {
     MigrateBlockedNumbersDialogFragment fragment = new MigrateBlockedNumbersDialogFragment();
-    fragment.mBlockedNumbersMigrator = Objects.requireNonNull(blockedNumbersMigrator);
-    fragment.mMigrationListener = Objects.requireNonNull(migrationListener);
+    fragment.blockedNumbersMigrator = Objects.requireNonNull(blockedNumbersMigrator);
+    fragment.migrationListener = Objects.requireNonNull(migrationListener);
     return fragment;
   }
 
@@ -90,12 +90,12 @@
       public void onClick(View v) {
         alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
         alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setEnabled(false);
-        mBlockedNumbersMigrator.migrate(
+        blockedNumbersMigrator.migrate(
             new Listener() {
               @Override
               public void onComplete() {
                 alertDialog.dismiss();
-                mMigrationListener.onComplete();
+                migrationListener.onComplete();
               }
             });
       }
@@ -106,8 +106,8 @@
   public void onPause() {
     // The dialog is dismissed and state is cleaned up onPause, i.e. rotation.
     dismiss();
-    mBlockedNumbersMigrator = null;
-    mMigrationListener = null;
+    blockedNumbersMigrator = null;
+    migrationListener = null;
     super.onPause();
   }
 }
diff --git a/java/com/android/dialer/callcomposer/camera/CameraManager.java b/java/com/android/dialer/callcomposer/camera/CameraManager.java
index b850a19..c61f570 100644
--- a/java/com/android/dialer/callcomposer/camera/CameraManager.java
+++ b/java/com/android/dialer/callcomposer/camera/CameraManager.java
@@ -93,28 +93,28 @@
         }
       };
 
-  private static CameraManager sInstance;
+  private static CameraManager instance;
 
   /** The CameraInfo for the currently selected camera */
-  private final CameraInfo mCameraInfo;
+  private final CameraInfo cameraInfo;
 
   /** The index of the selected camera or NO_CAMERA_SELECTED if a camera hasn't been selected yet */
-  private int mCameraIndex;
+  private int cameraIndex;
 
   /** True if the device has front and back cameras */
-  private final boolean mHasFrontAndBackCamera;
+  private final boolean hasFrontAndBackCamera;
 
   /** True if the camera should be open (may not yet be actually open) */
-  private boolean mOpenRequested;
+  private boolean openRequested;
 
   /** The preview view to show the preview on */
-  private CameraPreview mCameraPreview;
+  private CameraPreview cameraPreview;
 
   /** The helper classs to handle orientation changes */
-  private OrientationHandler mOrientationHandler;
+  private OrientationHandler orientationHandler;
 
   /** Tracks whether the preview has hardware acceleration */
-  private boolean mIsHardwareAccelerationSupported;
+  private boolean isHardwareAccelerationSupported;
 
   /**
    * The task for opening the camera, so it doesn't block the UI thread Using AsyncTask rather than
@@ -122,32 +122,32 @@
    * TODO(blemmon): If we have other AyncTasks (not SafeAsyncTasks) this may contend and we may need
    * to create a dedicated thread, or synchronize the threads in the thread pool
    */
-  private AsyncTask<Integer, Void, Camera> mOpenCameraTask;
+  private AsyncTask<Integer, Void, Camera> openCameraTask;
 
   /**
    * The camera index that is queued to be opened, but not completed yet, or NO_CAMERA_SELECTED if
    * no open task is pending
    */
-  private int mPendingOpenCameraIndex = NO_CAMERA_SELECTED;
+  private int pendingOpenCameraIndex = NO_CAMERA_SELECTED;
 
   /** The instance of the currently opened camera */
-  private Camera mCamera;
+  private Camera camera;
 
   /** The rotation of the screen relative to the camera's natural orientation */
-  private int mRotation;
+  private int rotation;
 
   /** The callback to notify when errors or other events occur */
-  private CameraManagerListener mListener;
+  private CameraManagerListener listener;
 
   /** True if the camera is currently in the process of taking an image */
-  private boolean mTakingPicture;
+  private boolean takingPicture;
 
   /** Manages auto focus visual and behavior */
-  private final FocusOverlayManager mFocusOverlayManager;
+  private final FocusOverlayManager focusOverlayManager;
 
   private CameraManager() {
-    mCameraInfo = new CameraInfo();
-    mCameraIndex = NO_CAMERA_SELECTED;
+    this.cameraInfo = new CameraInfo();
+    cameraIndex = NO_CAMERA_SELECTED;
 
     // Check to see if a front and back camera exist
     boolean hasFrontCamera = false;
@@ -169,19 +169,19 @@
     } catch (final RuntimeException e) {
       LogUtil.e("CameraManager.CameraManager", "Unable to load camera info", e);
     }
-    mHasFrontAndBackCamera = hasFrontCamera && hasBackCamera;
-    mFocusOverlayManager = new FocusOverlayManager(this, Looper.getMainLooper());
+    hasFrontAndBackCamera = hasFrontCamera && hasBackCamera;
+    focusOverlayManager = new FocusOverlayManager(this, Looper.getMainLooper());
 
     // Assume the best until we are proven otherwise
-    mIsHardwareAccelerationSupported = true;
+    isHardwareAccelerationSupported = true;
   }
 
   /** Gets the singleton instance */
   public static CameraManager get() {
-    if (sInstance == null) {
-      sInstance = new CameraManager();
+    if (instance == null) {
+      instance = new CameraManager();
     }
-    return sInstance;
+    return instance;
   }
 
   /**
@@ -191,7 +191,7 @@
    * @param preview The preview surface view
    */
   void setSurface(final CameraPreview preview) {
-    if (preview == mCameraPreview) {
+    if (preview == cameraPreview) {
       return;
     }
 
@@ -203,8 +203,8 @@
             public boolean onTouch(final View view, final MotionEvent motionEvent) {
               if ((motionEvent.getActionMasked() & MotionEvent.ACTION_UP)
                   == MotionEvent.ACTION_UP) {
-                mFocusOverlayManager.setPreviewSize(view.getWidth(), view.getHeight());
-                mFocusOverlayManager.onSingleTapUp(
+                focusOverlayManager.setPreviewSize(view.getWidth(), view.getHeight());
+                focusOverlayManager.onSingleTapUp(
                     (int) motionEvent.getX() + view.getLeft(),
                     (int) motionEvent.getY() + view.getTop());
               }
@@ -213,20 +213,20 @@
             }
           });
     }
-    mCameraPreview = preview;
+    cameraPreview = preview;
     tryShowPreview();
   }
 
   public void setRenderOverlay(final RenderOverlay renderOverlay) {
-    mFocusOverlayManager.setFocusRenderer(
+    focusOverlayManager.setFocusRenderer(
         renderOverlay != null ? renderOverlay.getPieRenderer() : null);
   }
 
   /** Convenience function to swap between front and back facing cameras */
   public void swapCamera() {
-    Assert.checkState(mCameraIndex >= 0);
+    Assert.checkState(cameraIndex >= 0);
     selectCamera(
-        mCameraInfo.facing == CameraInfo.CAMERA_FACING_FRONT
+        cameraInfo.facing == CameraInfo.CAMERA_FACING_FRONT
             ? CameraInfo.CAMERA_FACING_BACK
             : CameraInfo.CAMERA_FACING_FRONT);
   }
@@ -241,59 +241,59 @@
   public boolean selectCamera(final int desiredFacing) {
     try {
       // We already selected a camera facing that direction
-      if (mCameraIndex >= 0 && mCameraInfo.facing == desiredFacing) {
+      if (cameraIndex >= 0 && this.cameraInfo.facing == desiredFacing) {
         return true;
       }
 
       final int cameraCount = Camera.getNumberOfCameras();
       Assert.checkState(cameraCount > 0);
 
-      mCameraIndex = NO_CAMERA_SELECTED;
+      cameraIndex = NO_CAMERA_SELECTED;
       setCamera(null);
       final CameraInfo cameraInfo = new CameraInfo();
       for (int i = 0; i < cameraCount; i++) {
         Camera.getCameraInfo(i, cameraInfo);
         if (cameraInfo.facing == desiredFacing) {
-          mCameraIndex = i;
-          Camera.getCameraInfo(i, mCameraInfo);
+          cameraIndex = i;
+          Camera.getCameraInfo(i, this.cameraInfo);
           break;
         }
       }
 
       // There's no camera in the desired facing direction, just select the first camera
       // regardless of direction
-      if (mCameraIndex < 0) {
-        mCameraIndex = 0;
-        Camera.getCameraInfo(0, mCameraInfo);
+      if (cameraIndex < 0) {
+        cameraIndex = 0;
+        Camera.getCameraInfo(0, this.cameraInfo);
       }
 
-      if (mOpenRequested) {
+      if (openRequested) {
         // The camera is open, so reopen with the newly selected camera
         openCamera();
       }
       return true;
     } catch (final RuntimeException e) {
       LogUtil.e("CameraManager.selectCamera", "RuntimeException in CameraManager.selectCamera", e);
-      if (mListener != null) {
-        mListener.onCameraError(ERROR_OPENING_CAMERA, e);
+      if (listener != null) {
+        listener.onCameraError(ERROR_OPENING_CAMERA, e);
       }
       return false;
     }
   }
 
   public int getCameraIndex() {
-    return mCameraIndex;
+    return cameraIndex;
   }
 
   public void selectCameraByIndex(final int cameraIndex) {
-    if (mCameraIndex == cameraIndex) {
+    if (this.cameraIndex == cameraIndex) {
       return;
     }
 
     try {
-      mCameraIndex = cameraIndex;
-      Camera.getCameraInfo(mCameraIndex, mCameraInfo);
-      if (mOpenRequested) {
+      this.cameraIndex = cameraIndex;
+      Camera.getCameraInfo(this.cameraIndex, cameraInfo);
+      if (openRequested) {
         openCamera();
       }
     } catch (final RuntimeException e) {
@@ -301,8 +301,8 @@
           "CameraManager.selectCameraByIndex",
           "RuntimeException in CameraManager.selectCameraByIndex",
           e);
-      if (mListener != null) {
-        mListener.onCameraError(ERROR_OPENING_CAMERA, e);
+      if (listener != null) {
+        listener.onCameraError(ERROR_OPENING_CAMERA, e);
       }
     }
   }
@@ -310,27 +310,27 @@
   @Nullable
   @VisibleForTesting
   public CameraInfo getCameraInfo() {
-    if (mCameraIndex == NO_CAMERA_SELECTED) {
+    if (cameraIndex == NO_CAMERA_SELECTED) {
       return null;
     }
-    return mCameraInfo;
+    return cameraInfo;
   }
 
   /** @return True if the device has both a front and back camera */
   public boolean hasFrontAndBackCamera() {
-    return mHasFrontAndBackCamera;
+    return hasFrontAndBackCamera;
   }
 
   /** Opens the camera on a separate thread and initiates the preview if one is available */
   void openCamera() {
-    if (mCameraIndex == NO_CAMERA_SELECTED) {
+    if (this.cameraIndex == NO_CAMERA_SELECTED) {
       // Ensure a selected camera if none is currently selected. This may happen if the
       // camera chooser is not the default media chooser.
       selectCamera(CameraInfo.CAMERA_FACING_BACK);
     }
-    mOpenRequested = true;
+    openRequested = true;
     // We're already opening the camera or already have the camera handle, nothing more to do
-    if (mPendingOpenCameraIndex == mCameraIndex || mCamera != null) {
+    if (pendingOpenCameraIndex == this.cameraIndex || this.camera != null) {
       return;
     }
 
@@ -338,25 +338,27 @@
     boolean delayTask = false;
 
     // Cancel any previous open camera tasks
-    if (mOpenCameraTask != null) {
-      mPendingOpenCameraIndex = NO_CAMERA_SELECTED;
+    if (openCameraTask != null) {
+      pendingOpenCameraIndex = NO_CAMERA_SELECTED;
       delayTask = true;
     }
 
-    mPendingOpenCameraIndex = mCameraIndex;
-    mOpenCameraTask =
+    pendingOpenCameraIndex = this.cameraIndex;
+    openCameraTask =
         new AsyncTask<Integer, Void, Camera>() {
-          private Exception mException;
+          private Exception exception;
 
           @Override
           protected Camera doInBackground(final Integer... params) {
             try {
               final int cameraIndex = params[0];
-              LogUtil.v("CameraManager.doInBackground", "Opening camera " + mCameraIndex);
+              LogUtil.v(
+                  "CameraManager.doInBackground",
+                  "Opening camera " + CameraManager.this.cameraIndex);
               return Camera.open(cameraIndex);
             } catch (final Exception e) {
               LogUtil.e("CameraManager.doInBackground", "Exception while opening camera", e);
-              mException = e;
+              exception = e;
               return null;
             }
           }
@@ -364,7 +366,7 @@
           @Override
           protected void onPostExecute(final Camera camera) {
             // If we completed, but no longer want this camera, then release the camera
-            if (mOpenCameraTask != this || !mOpenRequested) {
+            if (openCameraTask != this || !openRequested) {
               releaseCamera(camera);
               cleanup();
               return;
@@ -374,11 +376,11 @@
 
             LogUtil.v(
                 "CameraManager.onPostExecute",
-                "Opened camera " + mCameraIndex + " " + (camera != null));
+                "Opened camera " + CameraManager.this.cameraIndex + " " + (camera != null));
             setCamera(camera);
             if (camera == null) {
-              if (mListener != null) {
-                mListener.onCameraError(ERROR_OPENING_CAMERA, mException);
+              if (listener != null) {
+                listener.onCameraError(ERROR_OPENING_CAMERA, exception);
               }
               LogUtil.e("CameraManager.onPostExecute", "Error opening camera");
             }
@@ -391,24 +393,24 @@
           }
 
           private void cleanup() {
-            mPendingOpenCameraIndex = NO_CAMERA_SELECTED;
-            if (mOpenCameraTask != null && mOpenCameraTask.getStatus() == Status.PENDING) {
+            pendingOpenCameraIndex = NO_CAMERA_SELECTED;
+            if (openCameraTask != null && openCameraTask.getStatus() == Status.PENDING) {
               // If there's another task waiting on this one to complete, start it now
-              mOpenCameraTask.execute(mCameraIndex);
+              openCameraTask.execute(CameraManager.this.cameraIndex);
             } else {
-              mOpenCameraTask = null;
+              openCameraTask = null;
             }
           }
         };
-    LogUtil.v("CameraManager.openCamera", "Start opening camera " + mCameraIndex);
+    LogUtil.v("CameraManager.openCamera", "Start opening camera " + this.cameraIndex);
     if (!delayTask) {
-      mOpenCameraTask.execute(mCameraIndex);
+      openCameraTask.execute(this.cameraIndex);
     }
   }
 
   /** Closes the camera releasing the resources it uses */
   void closeCamera() {
-    mOpenRequested = false;
+    openRequested = false;
     setCamera(null);
   }
 
@@ -419,18 +421,18 @@
    */
   public void setListener(final CameraManagerListener listener) {
     Assert.isMainThread();
-    mListener = listener;
-    if (!mIsHardwareAccelerationSupported && mListener != null) {
-      mListener.onCameraError(ERROR_HARDWARE_ACCELERATION_DISABLED, null);
+    this.listener = listener;
+    if (!isHardwareAccelerationSupported && this.listener != null) {
+      this.listener.onCameraError(ERROR_HARDWARE_ACCELERATION_DISABLED, null);
     }
   }
 
   public void takePicture(final float heightPercent, @NonNull final MediaCallback callback) {
-    Assert.checkState(!mTakingPicture);
+    Assert.checkState(!takingPicture);
     Assert.isNotNull(callback);
-    mCameraPreview.setFocusable(false);
-    mFocusOverlayManager.cancelAutoFocus();
-    if (mCamera == null) {
+    cameraPreview.setFocusable(false);
+    focusOverlayManager.cancelAutoFocus();
+    if (this.camera == null) {
       // The caller should have checked isCameraAvailable first, but just in case, protect
       // against a null camera by notifying the callback that taking the picture didn't work
       callback.onMediaFailed(null);
@@ -440,8 +442,8 @@
         new Camera.PictureCallback() {
           @Override
           public void onPictureTaken(final byte[] bytes, final Camera camera) {
-            mTakingPicture = false;
-            if (mCamera != camera) {
+            takingPicture = false;
+            if (CameraManager.this.camera != camera) {
               // This may happen if the camera was changed between front/back while the
               // picture is being taken.
               callback.onMediaInfo(MediaCallback.MEDIA_CAMERA_CHANGED);
@@ -456,7 +458,7 @@
             final Camera.Size size = camera.getParameters().getPictureSize();
             int width;
             int height;
-            if (mRotation == 90 || mRotation == 270) {
+            if (rotation == 90 || rotation == 270) {
               // Is rotated, so swapping dimensions is desired
               // noinspection SuspiciousNameCombination
               width = size.height;
@@ -468,11 +470,11 @@
             }
             LogUtil.i(
                 "CameraManager.onPictureTaken", "taken picture size: " + bytes.length + " bytes");
-            DialerExecutorComponent.get(mCameraPreview.getContext())
+            DialerExecutorComponent.get(cameraPreview.getContext())
                 .dialerExecutorFactory()
                 .createNonUiTaskBuilder(
                     new ImagePersistWorker(
-                        width, height, heightPercent, bytes, mCameraPreview.getContext()))
+                        width, height, heightPercent, bytes, cameraPreview.getContext()))
                 .onSuccess(
                     (result) -> {
                       callback.onMediaReady(
@@ -487,16 +489,16 @@
           }
         };
 
-    mTakingPicture = true;
+    takingPicture = true;
     try {
-      mCamera.takePicture(
+      this.camera.takePicture(
           // A shutter callback is required to enable shutter sound
           DUMMY_SHUTTER_CALLBACK, null /* raw */, null /* postView */, jpegCallback);
     } catch (final RuntimeException e) {
       LogUtil.e("CameraManager.takePicture", "RuntimeException in CameraManager.takePicture", e);
-      mTakingPicture = false;
-      if (mListener != null) {
-        mListener.onCameraError(ERROR_TAKING_PICTURE, e);
+      takingPicture = false;
+      if (listener != null) {
+        listener.onCameraError(ERROR_TAKING_PICTURE, e);
       }
     }
   }
@@ -511,12 +513,12 @@
       return;
     }
 
-    mFocusOverlayManager.onCameraReleased();
+    focusOverlayManager.onCameraReleased();
 
     new AsyncTask<Void, Void, Void>() {
       @Override
       protected Void doInBackground(final Void... params) {
-        LogUtil.v("CameraManager.doInBackground", "Releasing camera " + mCameraIndex);
+        LogUtil.v("CameraManager.doInBackground", "Releasing camera " + cameraIndex);
         camera.release();
         return null;
       }
@@ -583,47 +585,47 @@
 
   /** Sets the current camera, releasing any previously opened camera */
   private void setCamera(final Camera camera) {
-    if (mCamera == camera) {
+    if (this.camera == camera) {
       return;
     }
 
-    releaseCamera(mCamera);
-    mCamera = camera;
+    releaseCamera(this.camera);
+    this.camera = camera;
     tryShowPreview();
-    if (mListener != null) {
-      mListener.onCameraChanged();
+    if (listener != null) {
+      listener.onCameraChanged();
     }
   }
 
   /** Shows the preview if the camera is open and the preview is loaded */
   private void tryShowPreview() {
-    if (mCameraPreview == null || mCamera == null) {
-      if (mOrientationHandler != null) {
-        mOrientationHandler.disable();
-        mOrientationHandler = null;
+    if (cameraPreview == null || this.camera == null) {
+      if (orientationHandler != null) {
+        orientationHandler.disable();
+        orientationHandler = null;
       }
-      mFocusOverlayManager.onPreviewStopped();
+      focusOverlayManager.onPreviewStopped();
       return;
     }
     try {
-      mCamera.stopPreview();
-      if (!mTakingPicture) {
-        mRotation =
+      this.camera.stopPreview();
+      if (!takingPicture) {
+        rotation =
             updateCameraRotation(
-                mCamera,
+                this.camera,
                 getScreenRotation(),
-                mCameraInfo.orientation,
-                mCameraInfo.facing == CameraInfo.CAMERA_FACING_FRONT);
+                cameraInfo.orientation,
+                cameraInfo.facing == CameraInfo.CAMERA_FACING_FRONT);
       }
 
-      final Camera.Parameters params = mCamera.getParameters();
+      final Camera.Parameters params = this.camera.getParameters();
       final Camera.Size pictureSize = chooseBestPictureSize();
       final Camera.Size previewSize = chooseBestPreviewSize(pictureSize);
       params.setPreviewSize(previewSize.width, previewSize.height);
       params.setPictureSize(pictureSize.width, pictureSize.height);
       logCameraSize("Setting preview size: ", previewSize);
       logCameraSize("Setting picture size: ", pictureSize);
-      mCameraPreview.setSize(previewSize, mCameraInfo.orientation);
+      cameraPreview.setSize(previewSize, cameraInfo.orientation);
       for (final String focusMode : params.getSupportedFocusModes()) {
         if (TextUtils.equals(focusMode, Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) {
           // Use continuous focus if available
@@ -632,39 +634,39 @@
         }
       }
 
-      mCamera.setParameters(params);
-      mCameraPreview.startPreview(mCamera);
-      mCamera.startPreview();
-      mCamera.setAutoFocusMoveCallback(
+      this.camera.setParameters(params);
+      cameraPreview.startPreview(this.camera);
+      this.camera.startPreview();
+      this.camera.setAutoFocusMoveCallback(
           new Camera.AutoFocusMoveCallback() {
             @Override
             public void onAutoFocusMoving(final boolean start, final Camera camera) {
-              mFocusOverlayManager.onAutoFocusMoving(start);
+              focusOverlayManager.onAutoFocusMoving(start);
             }
           });
-      mFocusOverlayManager.setParameters(mCamera.getParameters());
-      mFocusOverlayManager.setMirror(mCameraInfo.facing == CameraInfo.CAMERA_FACING_BACK);
-      mFocusOverlayManager.onPreviewStarted();
-      if (mOrientationHandler == null) {
-        mOrientationHandler = new OrientationHandler(mCameraPreview.getContext());
-        mOrientationHandler.enable();
+      focusOverlayManager.setParameters(this.camera.getParameters());
+      focusOverlayManager.setMirror(cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK);
+      focusOverlayManager.onPreviewStarted();
+      if (orientationHandler == null) {
+        orientationHandler = new OrientationHandler(cameraPreview.getContext());
+        orientationHandler.enable();
       }
     } catch (final IOException e) {
       LogUtil.e("CameraManager.tryShowPreview", "IOException in CameraManager.tryShowPreview", e);
-      if (mListener != null) {
-        mListener.onCameraError(ERROR_SHOWING_PREVIEW, e);
+      if (listener != null) {
+        listener.onCameraError(ERROR_SHOWING_PREVIEW, e);
       }
     } catch (final RuntimeException e) {
       LogUtil.e(
           "CameraManager.tryShowPreview", "RuntimeException in CameraManager.tryShowPreview", e);
-      if (mListener != null) {
-        mListener.onCameraError(ERROR_SHOWING_PREVIEW, e);
+      if (listener != null) {
+        listener.onCameraError(ERROR_SHOWING_PREVIEW, e);
       }
     }
   }
 
   private int getScreenRotation() {
-    return mCameraPreview
+    return cameraPreview
         .getContext()
         .getSystemService(WindowManager.class)
         .getDefaultDisplay()
@@ -672,7 +674,7 @@
   }
 
   public boolean isCameraAvailable() {
-    return mCamera != null && !mTakingPicture && mIsHardwareAccelerationSupported;
+    return camera != null && !takingPicture && isHardwareAccelerationSupported;
   }
 
   /**
@@ -680,7 +682,7 @@
    * is closest to the screen aspect ratio. In case of RCS conversation returns default size.
    */
   private Camera.Size chooseBestPictureSize() {
-    return mCamera.getParameters().getPictureSize();
+    return camera.getParameters().getPictureSize();
   }
 
   /**
@@ -689,7 +691,7 @@
    */
   private Camera.Size chooseBestPreviewSize(final Camera.Size pictureSize) {
     final List<Camera.Size> sizes =
-        new ArrayList<Camera.Size>(mCamera.getParameters().getSupportedPreviewSizes());
+        new ArrayList<Camera.Size>(camera.getParameters().getSupportedPreviewSizes());
     final float aspectRatio = pictureSize.width / (float) pictureSize.height;
     final int capturePixels = pictureSize.width * pictureSize.height;
 
@@ -708,13 +710,13 @@
 
     @Override
     public void onOrientationChanged(final int orientation) {
-      if (!mTakingPicture) {
-        mRotation =
+      if (!takingPicture) {
+        rotation =
             updateCameraRotation(
-                mCamera,
+                camera,
                 getScreenRotation(),
-                mCameraInfo.orientation,
-                mCameraInfo.facing == CameraInfo.CAMERA_FACING_FRONT);
+                cameraInfo.orientation,
+                cameraInfo.facing == CameraInfo.CAMERA_FACING_FRONT);
       }
     }
   }
@@ -724,24 +726,24 @@
     private static final int PREFER_RIGHT = 1;
 
     // The max width/height for the preferred size. Integer.MAX_VALUE if no size limit
-    private final int mMaxWidth;
-    private final int mMaxHeight;
+    private final int maxWidth;
+    private final int maxHeight;
 
     // The desired aspect ratio
-    private final float mTargetAspectRatio;
+    private final float targetAspectRatio;
 
     // The desired size (width x height) to try to match
-    private final int mTargetPixels;
+    private final int targetPixels;
 
     public SizeComparator(
         final int maxWidth,
         final int maxHeight,
         final float targetAspectRatio,
         final int targetPixels) {
-      mMaxWidth = maxWidth;
-      mMaxHeight = maxHeight;
-      mTargetAspectRatio = targetAspectRatio;
-      mTargetPixels = targetPixels;
+      this.maxWidth = maxWidth;
+      this.maxHeight = maxHeight;
+      this.targetAspectRatio = targetAspectRatio;
+      this.targetPixels = targetPixels;
     }
 
     /**
@@ -751,16 +753,16 @@
     @Override
     public int compare(final Camera.Size left, final Camera.Size right) {
       // If one size is less than the max size prefer it over the other
-      if ((left.width <= mMaxWidth && left.height <= mMaxHeight)
-          != (right.width <= mMaxWidth && right.height <= mMaxHeight)) {
-        return left.width <= mMaxWidth ? PREFER_LEFT : PREFER_RIGHT;
+      if ((left.width <= maxWidth && left.height <= maxHeight)
+          != (right.width <= maxWidth && right.height <= maxHeight)) {
+        return left.width <= maxWidth ? PREFER_LEFT : PREFER_RIGHT;
       }
 
       // If one is closer to the target aspect ratio, prefer it.
       final float leftAspectRatio = left.width / (float) left.height;
       final float rightAspectRatio = right.width / (float) right.height;
-      final float leftAspectRatioDiff = Math.abs(leftAspectRatio - mTargetAspectRatio);
-      final float rightAspectRatioDiff = Math.abs(rightAspectRatio - mTargetAspectRatio);
+      final float leftAspectRatioDiff = Math.abs(leftAspectRatio - targetAspectRatio);
+      final float rightAspectRatioDiff = Math.abs(rightAspectRatio - targetAspectRatio);
       if (leftAspectRatioDiff != rightAspectRatioDiff) {
         return (leftAspectRatioDiff - rightAspectRatioDiff) < 0 ? PREFER_LEFT : PREFER_RIGHT;
       }
@@ -768,41 +770,41 @@
       // At this point they have the same aspect ratio diff and are either both bigger
       // than the max size or both smaller than the max size, so prefer the one closest
       // to target size
-      final int leftDiff = Math.abs((left.width * left.height) - mTargetPixels);
-      final int rightDiff = Math.abs((right.width * right.height) - mTargetPixels);
+      final int leftDiff = Math.abs((left.width * left.height) - targetPixels);
+      final int rightDiff = Math.abs((right.width * right.height) - targetPixels);
       return leftDiff - rightDiff;
     }
   }
 
   @Override // From FocusOverlayManager.Listener
   public void autoFocus() {
-    if (mCamera == null) {
+    if (this.camera == null) {
       return;
     }
 
     try {
-      mCamera.autoFocus(
+      this.camera.autoFocus(
           new Camera.AutoFocusCallback() {
             @Override
             public void onAutoFocus(final boolean success, final Camera camera) {
-              mFocusOverlayManager.onAutoFocus(success, false /* shutterDown */);
+              focusOverlayManager.onAutoFocus(success, false /* shutterDown */);
             }
           });
     } catch (final RuntimeException e) {
       LogUtil.e("CameraManager.autoFocus", "RuntimeException in CameraManager.autoFocus", e);
       // If autofocus fails, the camera should have called the callback with success=false,
       // but some throw an exception here
-      mFocusOverlayManager.onAutoFocus(false /*success*/, false /*shutterDown*/);
+      focusOverlayManager.onAutoFocus(false /*success*/, false /*shutterDown*/);
     }
   }
 
   @Override // From FocusOverlayManager.Listener
   public void cancelAutoFocus() {
-    if (mCamera == null) {
+    if (camera == null) {
       return;
     }
     try {
-      mCamera.cancelAutoFocus();
+      camera.cancelAutoFocus();
     } catch (final RuntimeException e) {
       // Ignore
       LogUtil.e(
@@ -817,19 +819,19 @@
 
   @Override // From FocusOverlayManager.Listener
   public void setFocusParameters() {
-    if (mCamera == null) {
+    if (camera == null) {
       return;
     }
     try {
-      final Camera.Parameters parameters = mCamera.getParameters();
-      parameters.setFocusMode(mFocusOverlayManager.getFocusMode());
+      final Camera.Parameters parameters = camera.getParameters();
+      parameters.setFocusMode(focusOverlayManager.getFocusMode());
       if (parameters.getMaxNumFocusAreas() > 0) {
         // Don't set focus areas (even to null) if focus areas aren't supported, camera may
         // crash
-        parameters.setFocusAreas(mFocusOverlayManager.getFocusAreas());
+        parameters.setFocusAreas(focusOverlayManager.getFocusAreas());
       }
-      parameters.setMeteringAreas(mFocusOverlayManager.getMeteringAreas());
-      mCamera.setParameters(parameters);
+      parameters.setMeteringAreas(focusOverlayManager.getMeteringAreas());
+      camera.setParameters(parameters);
     } catch (final RuntimeException e) {
       // This occurs when the device is out of space or when the camera is locked
       LogUtil.e(
@@ -839,9 +841,9 @@
   }
 
   public void resetPreview() {
-    mCamera.startPreview();
-    if (mCameraPreview != null) {
-      mCameraPreview.setFocusable(true);
+    camera.startPreview();
+    if (cameraPreview != null) {
+      cameraPreview.setFocusable(true);
     }
   }
 
@@ -855,6 +857,6 @@
 
   @VisibleForTesting
   public void resetCameraManager() {
-    sInstance = null;
+    instance = null;
   }
 }
diff --git a/java/com/android/dialer/callcomposer/camera/CameraPreview.java b/java/com/android/dialer/callcomposer/camera/CameraPreview.java
index eaea789..901833b 100644
--- a/java/com/android/dialer/callcomposer/camera/CameraPreview.java
+++ b/java/com/android/dialer/callcomposer/camera/CameraPreview.java
@@ -45,30 +45,30 @@
     void setShown();
   }
 
-  private int mCameraWidth = -1;
-  private int mCameraHeight = -1;
-  private boolean mTabHasBeenShown = false;
-  private OnTouchListener mListener;
+  private int cameraWidth = -1;
+  private int cameraHeight = -1;
+  private boolean tabHasBeenShown = false;
+  private OnTouchListener listener;
 
-  private final CameraPreviewHost mHost;
+  private final CameraPreviewHost host;
 
   public CameraPreview(final CameraPreviewHost host) {
     Assert.isNotNull(host);
     Assert.isNotNull(host.getView());
-    mHost = host;
+    this.host = host;
   }
 
   // This is set when the tab is actually selected.
   public void setShown() {
-    mTabHasBeenShown = true;
+    tabHasBeenShown = true;
     maybeOpenCamera();
   }
 
   // Opening camera is very expensive. Most of the ANR reports seem to be related to the camera.
   // So we delay until the camera is actually needed.  See a bug
   private void maybeOpenCamera() {
-    boolean visible = mHost.getView().getVisibility() == View.VISIBLE;
-    if (mTabHasBeenShown && visible && PermissionsUtil.hasCameraPermissions(getContext())) {
+    boolean visible = host.getView().getVisibility() == View.VISIBLE;
+    if (tabHasBeenShown && visible && PermissionsUtil.hasCameraPermissions(getContext())) {
       CameraManager.get().openCamera();
     }
   }
@@ -77,20 +77,20 @@
     switch (orientation) {
       case 0:
       case 180:
-        mCameraWidth = size.width;
-        mCameraHeight = size.height;
+        cameraWidth = size.width;
+        cameraHeight = size.height;
         break;
       case 90:
       case 270:
       default:
-        mCameraWidth = size.height;
-        mCameraHeight = size.width;
+        cameraWidth = size.height;
+        cameraHeight = size.width;
     }
-    mHost.getView().requestLayout();
+    host.getView().requestLayout();
   }
 
   public int getWidthMeasureSpec(final int widthMeasureSpec, final int heightMeasureSpec) {
-    if (mCameraHeight >= 0) {
+    if (cameraHeight >= 0) {
       final int width = View.MeasureSpec.getSize(widthMeasureSpec);
       return MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY);
     } else {
@@ -99,10 +99,10 @@
   }
 
   public int getHeightMeasureSpec(final int widthMeasureSpec, final int heightMeasureSpec) {
-    if (mCameraHeight >= 0) {
+    if (cameraHeight >= 0) {
       final int orientation = getContext().getResources().getConfiguration().orientation;
       final int width = View.MeasureSpec.getSize(widthMeasureSpec);
-      final float aspectRatio = (float) mCameraWidth / (float) mCameraHeight;
+      final float aspectRatio = (float) cameraWidth / (float) cameraHeight;
       int height;
       if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
         height = (int) (width * aspectRatio);
@@ -128,20 +128,20 @@
   }
 
   public Context getContext() {
-    return mHost.getView().getContext();
+    return host.getView().getContext();
   }
 
   public void setOnTouchListener(final View.OnTouchListener listener) {
-    mListener = listener;
-    mHost.getView().setOnTouchListener(listener);
+    this.listener = listener;
+    host.getView().setOnTouchListener(listener);
   }
 
   public void setFocusable(boolean focusable) {
-    mHost.getView().setOnTouchListener(focusable ? mListener : null);
+    host.getView().setOnTouchListener(focusable ? listener : null);
   }
 
   public int getHeight() {
-    return mHost.getView().getHeight();
+    return host.getView().getHeight();
   }
 
   public void onAttachedToWindow() {
@@ -162,7 +162,7 @@
 
   /** @return True if the view is valid and prepared for the camera to start showing the preview */
   public boolean isValid() {
-    return mHost.isValid();
+    return host.isValid();
   }
 
   /**
@@ -172,6 +172,6 @@
    * @throws IOException Which is caught by the CameraManager to display an error
    */
   public void startPreview(final Camera camera) throws IOException {
-    mHost.startPreview(camera);
+    host.startPreview(camera);
   }
 }
diff --git a/java/com/android/dialer/callcomposer/camera/HardwareCameraPreview.java b/java/com/android/dialer/callcomposer/camera/HardwareCameraPreview.java
index c0d61f3..3373f1a 100644
--- a/java/com/android/dialer/callcomposer/camera/HardwareCameraPreview.java
+++ b/java/com/android/dialer/callcomposer/camera/HardwareCameraPreview.java
@@ -35,23 +35,23 @@
  * implementations of the shared methods are delegated to CameraPreview
  */
 public class HardwareCameraPreview extends TextureView implements CameraPreview.CameraPreviewHost {
-  private CameraPreview mPreview;
+  private CameraPreview preview;
 
   public HardwareCameraPreview(final Context context, final AttributeSet attrs) {
     super(context, attrs);
-    mPreview = new CameraPreview(this);
+    preview = new CameraPreview(this);
     setSurfaceTextureListener(
         new SurfaceTextureListener() {
           @Override
           public void onSurfaceTextureAvailable(
               final SurfaceTexture surfaceTexture, final int i, final int i2) {
-            CameraManager.get().setSurface(mPreview);
+            CameraManager.get().setSurface(preview);
           }
 
           @Override
           public void onSurfaceTextureSizeChanged(
               final SurfaceTexture surfaceTexture, final int i, final int i2) {
-            CameraManager.get().setSurface(mPreview);
+            CameraManager.get().setSurface(preview);
           }
 
           @Override
@@ -62,44 +62,44 @@
 
           @Override
           public void onSurfaceTextureUpdated(final SurfaceTexture surfaceTexture) {
-            CameraManager.get().setSurface(mPreview);
+            CameraManager.get().setSurface(preview);
           }
         });
   }
 
   @Override
   public void setShown() {
-    mPreview.setShown();
+    preview.setShown();
   }
 
   @Override
   protected void onVisibilityChanged(final View changedView, final int visibility) {
     super.onVisibilityChanged(changedView, visibility);
-    mPreview.onVisibilityChanged(visibility);
+    preview.onVisibilityChanged(visibility);
   }
 
   @Override
   protected void onDetachedFromWindow() {
     super.onDetachedFromWindow();
-    mPreview.onDetachedFromWindow();
+    preview.onDetachedFromWindow();
   }
 
   @Override
   protected void onAttachedToWindow() {
     super.onAttachedToWindow();
-    mPreview.onAttachedToWindow();
+    preview.onAttachedToWindow();
   }
 
   @Override
   protected void onRestoreInstanceState(final Parcelable state) {
     super.onRestoreInstanceState(state);
-    mPreview.onRestoreInstanceState();
+    preview.onRestoreInstanceState();
   }
 
   @Override
   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-    widthMeasureSpec = mPreview.getWidthMeasureSpec(widthMeasureSpec, heightMeasureSpec);
-    heightMeasureSpec = mPreview.getHeightMeasureSpec(widthMeasureSpec, heightMeasureSpec);
+    widthMeasureSpec = preview.getWidthMeasureSpec(widthMeasureSpec, heightMeasureSpec);
+    heightMeasureSpec = preview.getHeightMeasureSpec(widthMeasureSpec, heightMeasureSpec);
     super.onMeasure(widthMeasureSpec, heightMeasureSpec);
   }
 
@@ -120,6 +120,6 @@
 
   @Override
   public void onCameraPermissionGranted() {
-    mPreview.onCameraPermissionGranted();
+    preview.onCameraPermissionGranted();
   }
 }
diff --git a/java/com/android/dialer/callcomposer/camera/ImagePersistWorker.java b/java/com/android/dialer/callcomposer/camera/ImagePersistWorker.java
index 26b0bde..69f5469 100644
--- a/java/com/android/dialer/callcomposer/camera/ImagePersistWorker.java
+++ b/java/com/android/dialer/callcomposer/camera/ImagePersistWorker.java
@@ -40,11 +40,11 @@
 /** Persisting image routine. */
 @TargetApi(VERSION_CODES.M)
 public class ImagePersistWorker implements Worker<Void, Result> {
-  private int mWidth;
-  private int mHeight;
-  private final float mHeightPercent;
-  private final byte[] mBytes;
-  private final Context mContext;
+  private int width;
+  private int height;
+  private final float heightPercent;
+  private final byte[] bytes;
+  private final Context context;
 
   @AutoValue
   abstract static class Result {
@@ -81,16 +81,16 @@
     Assert.checkArgument(heightPercent >= 0 && heightPercent <= 1);
     Assert.isNotNull(bytes);
     Assert.isNotNull(context);
-    mWidth = width;
-    mHeight = height;
-    mHeightPercent = heightPercent;
-    mBytes = bytes;
-    mContext = context;
+    this.width = width;
+    this.height = height;
+    this.heightPercent = heightPercent;
+    this.bytes = bytes;
+    this.context = context;
   }
 
   @Override
   public Result doInBackground(Void unused) throws Exception {
-    File outputFile = DialerUtils.createShareableFile(mContext);
+    File outputFile = DialerUtils.createShareableFile(context);
 
     try (OutputStream outputStream = new FileOutputStream(outputFile)) {
       writeClippedBitmap(outputStream);
@@ -99,9 +99,9 @@
     return Result.builder()
         .setUri(
             FileProvider.getUriForFile(
-                mContext, Constants.get().getFileProviderAuthority(), outputFile))
-        .setWidth(mWidth)
-        .setHeight(mHeight)
+                context, Constants.get().getFileProviderAuthority(), outputFile))
+        .setWidth(width)
+        .setHeight(height)
         .build();
   }
 
@@ -109,7 +109,7 @@
     int orientation = android.media.ExifInterface.ORIENTATION_UNDEFINED;
     final ExifInterface exifInterface = new ExifInterface();
     try {
-      exifInterface.readExif(mBytes);
+      exifInterface.readExif(bytes);
       final Integer orientationValue = exifInterface.getTagIntValue(ExifInterface.TAG_ORIENTATION);
       if (orientationValue != null) {
         orientation = orientationValue.intValue();
@@ -119,25 +119,25 @@
     }
 
     ExifInterface.OrientationParams params = ExifInterface.getOrientationParams(orientation);
-    Bitmap bitmap = BitmapFactory.decodeByteArray(mBytes, 0, mBytes.length);
+    Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
     final int clippedWidth;
     final int clippedHeight;
     if (params.invertDimensions) {
-      Assert.checkState(mWidth == bitmap.getHeight());
-      Assert.checkState(mHeight == bitmap.getWidth());
-      clippedWidth = (int) (mHeight * mHeightPercent);
-      clippedHeight = mWidth;
+      Assert.checkState(width == bitmap.getHeight());
+      Assert.checkState(height == bitmap.getWidth());
+      clippedWidth = (int) (height * heightPercent);
+      clippedHeight = width;
     } else {
-      Assert.checkState(mWidth == bitmap.getWidth());
-      Assert.checkState(mHeight == bitmap.getHeight());
-      clippedWidth = mWidth;
-      clippedHeight = (int) (mHeight * mHeightPercent);
+      Assert.checkState(width == bitmap.getWidth());
+      Assert.checkState(height == bitmap.getHeight());
+      clippedWidth = width;
+      clippedHeight = (int) (height * heightPercent);
     }
 
     int offsetTop = (bitmap.getHeight() - clippedHeight) / 2;
     int offsetLeft = (bitmap.getWidth() - clippedWidth) / 2;
-    mWidth = clippedWidth;
-    mHeight = clippedHeight;
+    width = clippedWidth;
+    height = clippedHeight;
 
     Bitmap clippedBitmap =
         Bitmap.createBitmap(bitmap, offsetLeft, offsetTop, clippedWidth, clippedHeight);
diff --git a/java/com/android/dialer/callcomposer/camera/SoftwareCameraPreview.java b/java/com/android/dialer/callcomposer/camera/SoftwareCameraPreview.java
index fe2c600..58458a8 100644
--- a/java/com/android/dialer/callcomposer/camera/SoftwareCameraPreview.java
+++ b/java/com/android/dialer/callcomposer/camera/SoftwareCameraPreview.java
@@ -33,17 +33,17 @@
  * implementations of the shared methods are delegated to CameraPreview
  */
 public class SoftwareCameraPreview extends SurfaceView implements CameraPreview.CameraPreviewHost {
-  private final CameraPreview mPreview;
+  private final CameraPreview preview;
 
   public SoftwareCameraPreview(final Context context) {
     super(context);
-    mPreview = new CameraPreview(this);
+    preview = new CameraPreview(this);
     getHolder()
         .addCallback(
             new SurfaceHolder.Callback() {
               @Override
               public void surfaceCreated(final SurfaceHolder surfaceHolder) {
-                CameraManager.get().setSurface(mPreview);
+                CameraManager.get().setSurface(preview);
               }
 
               @Override
@@ -52,7 +52,7 @@
                   final int format,
                   final int width,
                   final int height) {
-                CameraManager.get().setSurface(mPreview);
+                CameraManager.get().setSurface(preview);
               }
 
               @Override
@@ -64,37 +64,37 @@
 
   @Override
   public void setShown() {
-    mPreview.setShown();
+    preview.setShown();
   }
 
   @Override
   protected void onVisibilityChanged(final View changedView, final int visibility) {
     super.onVisibilityChanged(changedView, visibility);
-    mPreview.onVisibilityChanged(visibility);
+    preview.onVisibilityChanged(visibility);
   }
 
   @Override
   protected void onDetachedFromWindow() {
     super.onDetachedFromWindow();
-    mPreview.onDetachedFromWindow();
+    preview.onDetachedFromWindow();
   }
 
   @Override
   protected void onAttachedToWindow() {
     super.onAttachedToWindow();
-    mPreview.onAttachedToWindow();
+    preview.onAttachedToWindow();
   }
 
   @Override
   protected void onRestoreInstanceState(final Parcelable state) {
     super.onRestoreInstanceState(state);
-    mPreview.onRestoreInstanceState();
+    preview.onRestoreInstanceState();
   }
 
   @Override
   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-    widthMeasureSpec = mPreview.getWidthMeasureSpec(widthMeasureSpec, heightMeasureSpec);
-    heightMeasureSpec = mPreview.getHeightMeasureSpec(widthMeasureSpec, heightMeasureSpec);
+    widthMeasureSpec = preview.getWidthMeasureSpec(widthMeasureSpec, heightMeasureSpec);
+    heightMeasureSpec = preview.getHeightMeasureSpec(widthMeasureSpec, heightMeasureSpec);
     super.onMeasure(widthMeasureSpec, heightMeasureSpec);
   }
 
@@ -115,6 +115,6 @@
 
   @Override
   public void onCameraPermissionGranted() {
-    mPreview.onCameraPermissionGranted();
+    preview.onCameraPermissionGranted();
   }
 }
diff --git a/java/com/android/dialer/callcomposer/camera/camerafocus/FocusOverlayManager.java b/java/com/android/dialer/callcomposer/camera/camerafocus/FocusOverlayManager.java
index a5edf33..c3f1a5d 100644
--- a/java/com/android/dialer/callcomposer/camera/camerafocus/FocusOverlayManager.java
+++ b/java/com/android/dialer/callcomposer/camera/camerafocus/FocusOverlayManager.java
@@ -54,7 +54,7 @@
   private static final int RESET_TOUCH_FOCUS = 0;
   private static final int RESET_TOUCH_FOCUS_DELAY = 3000;
 
-  private int mState = STATE_IDLE;
+  private int state = STATE_IDLE;
   private static final int STATE_IDLE = 0; // Focus is not active.
   private static final int STATE_FOCUSING = 1; // Focus is in progress.
   // Focus is in progress and the camera should take a picture after focus finishes.
@@ -62,24 +62,24 @@
   private static final int STATE_SUCCESS = 3; // Focus finishes and succeeds.
   private static final int STATE_FAIL = 4; // Focus finishes and fails.
 
-  private boolean mInitialized;
-  private boolean mFocusAreaSupported;
-  private boolean mMeteringAreaSupported;
-  private boolean mLockAeAwbNeeded;
-  private boolean mAeAwbLock;
-  private Matrix mMatrix;
+  private boolean initialized;
+  private boolean focusAreaSupported;
+  private boolean meteringAreaSupported;
+  private boolean lockAeAwbNeeded;
+  private boolean aeAwbLock;
+  private Matrix matrix;
 
-  private PieRenderer mPieRenderer;
+  private PieRenderer pieRenderer;
 
-  private int mPreviewWidth; // The width of the preview frame layout.
-  private int mPreviewHeight; // The height of the preview frame layout.
-  private boolean mMirror; // true if the camera is front-facing.
-  private List<Area> mFocusArea; // focus area in driver format
-  private List<Area> mMeteringArea; // metering area in driver format
-  private String mFocusMode;
-  private Parameters mParameters;
-  private Handler mHandler;
-  private Listener mListener;
+  private int previewWidth; // The width of the preview frame layout.
+  private int previewHeight; // The height of the preview frame layout.
+  private boolean mirror; // true if the camera is front-facing.
+  private List<Area> focusArea; // focus area in driver format
+  private List<Area> meteringArea; // metering area in driver format
+  private String focusMode;
+  private Parameters parameters;
+  private Handler handler;
+  private Listener listener;
 
   /** Listener used for the focus indicator to communicate back to the camera. */
   public interface Listener {
@@ -110,14 +110,14 @@
   }
 
   public FocusOverlayManager(Listener listener, Looper looper) {
-    mHandler = new MainHandler(looper);
-    mMatrix = new Matrix();
-    mListener = listener;
+    handler = new MainHandler(looper);
+    matrix = new Matrix();
+    this.listener = listener;
   }
 
   public void setFocusRenderer(PieRenderer renderer) {
-    mPieRenderer = renderer;
-    mInitialized = (mMatrix != null);
+    pieRenderer = renderer;
+    initialized = (matrix != null);
   }
 
   public void setParameters(Parameters parameters) {
@@ -128,182 +128,176 @@
     if (parameters == null) {
       return;
     }
-    mParameters = parameters;
-    mFocusAreaSupported = isFocusAreaSupported(parameters);
-    mMeteringAreaSupported = isMeteringAreaSupported(parameters);
-    mLockAeAwbNeeded =
-        (isAutoExposureLockSupported(mParameters) || isAutoWhiteBalanceLockSupported(mParameters));
+    this.parameters = parameters;
+    focusAreaSupported = isFocusAreaSupported(parameters);
+    meteringAreaSupported = isMeteringAreaSupported(parameters);
+    lockAeAwbNeeded =
+        (isAutoExposureLockSupported(this.parameters)
+            || isAutoWhiteBalanceLockSupported(this.parameters));
   }
 
   public void setPreviewSize(int previewWidth, int previewHeight) {
-    if (mPreviewWidth != previewWidth || mPreviewHeight != previewHeight) {
-      mPreviewWidth = previewWidth;
-      mPreviewHeight = previewHeight;
+    if (this.previewWidth != previewWidth || this.previewHeight != previewHeight) {
+      this.previewWidth = previewWidth;
+      this.previewHeight = previewHeight;
       setMatrix();
     }
   }
 
   public void setMirror(boolean mirror) {
-    mMirror = mirror;
+    this.mirror = mirror;
     setMatrix();
   }
 
   private void setMatrix() {
-    if (mPreviewWidth != 0 && mPreviewHeight != 0) {
+    if (previewWidth != 0 && previewHeight != 0) {
       Matrix matrix = new Matrix();
-      prepareMatrix(matrix, mMirror, mPreviewWidth, mPreviewHeight);
+      prepareMatrix(matrix, mirror, previewWidth, previewHeight);
       // In face detection, the matrix converts the driver coordinates to UI
       // coordinates. In tap focus, the inverted matrix converts the UI
       // coordinates to driver coordinates.
-      matrix.invert(mMatrix);
-      mInitialized = (mPieRenderer != null);
+      matrix.invert(this.matrix);
+      initialized = (pieRenderer != null);
     }
   }
 
   private void lockAeAwbIfNeeded() {
-    if (mLockAeAwbNeeded && !mAeAwbLock) {
-      mAeAwbLock = true;
-      mListener.setFocusParameters();
+    if (lockAeAwbNeeded && !aeAwbLock) {
+      aeAwbLock = true;
+      listener.setFocusParameters();
     }
   }
 
   public void onAutoFocus(boolean focused, boolean shutterButtonPressed) {
-    if (mState == STATE_FOCUSING_SNAP_ON_FINISH) {
+    if (state == STATE_FOCUSING_SNAP_ON_FINISH) {
       // Take the picture no matter focus succeeds or fails. No need
       // to play the AF sound if we're about to play the shutter
       // sound.
       if (focused) {
-        mState = STATE_SUCCESS;
+        state = STATE_SUCCESS;
       } else {
-        mState = STATE_FAIL;
+        state = STATE_FAIL;
       }
       updateFocusUI();
       capture();
-    } else if (mState == STATE_FOCUSING) {
+    } else if (state == STATE_FOCUSING) {
       // This happens when (1) user is half-pressing the focus key or
       // (2) touch focus is triggered. Play the focus tone. Do not
       // take the picture now.
       if (focused) {
-        mState = STATE_SUCCESS;
+        state = STATE_SUCCESS;
       } else {
-        mState = STATE_FAIL;
+        state = STATE_FAIL;
       }
       updateFocusUI();
       // If this is triggered by touch focus, cancel focus after a
       // while.
-      if (mFocusArea != null) {
-        mHandler.sendEmptyMessageDelayed(RESET_TOUCH_FOCUS, RESET_TOUCH_FOCUS_DELAY);
+      if (focusArea != null) {
+        handler.sendEmptyMessageDelayed(RESET_TOUCH_FOCUS, RESET_TOUCH_FOCUS_DELAY);
       }
       if (shutterButtonPressed) {
         // Lock AE & AWB so users can half-press shutter and recompose.
         lockAeAwbIfNeeded();
       }
-    } else if (mState == STATE_IDLE) {
+    } else if (state == STATE_IDLE) {
       // User has released the focus key before focus completes.
       // Do nothing.
     }
   }
 
   public void onAutoFocusMoving(boolean moving) {
-    if (!mInitialized) {
+    if (!initialized) {
       return;
     }
 
     // Ignore if we have requested autofocus. This method only handles
     // continuous autofocus.
-    if (mState != STATE_IDLE) {
+    if (state != STATE_IDLE) {
       return;
     }
 
     if (moving) {
-      mPieRenderer.showStart();
+      pieRenderer.showStart();
     } else {
-      mPieRenderer.showSuccess(true);
+      pieRenderer.showSuccess(true);
     }
   }
 
   private void initializeFocusAreas(
       int focusWidth, int focusHeight, int x, int y, int previewWidth, int previewHeight) {
-    if (mFocusArea == null) {
-      mFocusArea = new ArrayList<>();
-      mFocusArea.add(new Area(new Rect(), 1));
+    if (focusArea == null) {
+      focusArea = new ArrayList<>();
+      focusArea.add(new Area(new Rect(), 1));
     }
 
     // Convert the coordinates to driver format.
     calculateTapArea(
-        focusWidth, focusHeight, 1f, x, y, previewWidth, previewHeight, mFocusArea.get(0).rect);
+        focusWidth, focusHeight, 1f, x, y, previewWidth, previewHeight, focusArea.get(0).rect);
   }
 
   private void initializeMeteringAreas(
       int focusWidth, int focusHeight, int x, int y, int previewWidth, int previewHeight) {
-    if (mMeteringArea == null) {
-      mMeteringArea = new ArrayList<>();
-      mMeteringArea.add(new Area(new Rect(), 1));
+    if (meteringArea == null) {
+      meteringArea = new ArrayList<>();
+      meteringArea.add(new Area(new Rect(), 1));
     }
 
     // Convert the coordinates to driver format.
     // AE area is bigger because exposure is sensitive and
     // easy to over- or underexposure if area is too small.
     calculateTapArea(
-        focusWidth,
-        focusHeight,
-        1.5f,
-        x,
-        y,
-        previewWidth,
-        previewHeight,
-        mMeteringArea.get(0).rect);
+        focusWidth, focusHeight, 1.5f, x, y, previewWidth, previewHeight, meteringArea.get(0).rect);
   }
 
   public void onSingleTapUp(int x, int y) {
-    if (!mInitialized || mState == STATE_FOCUSING_SNAP_ON_FINISH) {
+    if (!initialized || state == STATE_FOCUSING_SNAP_ON_FINISH) {
       return;
     }
 
     // Let users be able to cancel previous touch focus.
-    if ((mFocusArea != null)
-        && (mState == STATE_FOCUSING || mState == STATE_SUCCESS || mState == STATE_FAIL)) {
+    if ((focusArea != null)
+        && (state == STATE_FOCUSING || state == STATE_SUCCESS || state == STATE_FAIL)) {
       cancelAutoFocus();
     }
     // Initialize variables.
-    int focusWidth = mPieRenderer.getSize();
-    int focusHeight = mPieRenderer.getSize();
-    if (focusWidth == 0 || mPieRenderer.getWidth() == 0 || mPieRenderer.getHeight() == 0) {
+    int focusWidth = pieRenderer.getSize();
+    int focusHeight = pieRenderer.getSize();
+    if (focusWidth == 0 || pieRenderer.getWidth() == 0 || pieRenderer.getHeight() == 0) {
       return;
     }
-    int previewWidth = mPreviewWidth;
-    int previewHeight = mPreviewHeight;
+    int previewWidth = this.previewWidth;
+    int previewHeight = this.previewHeight;
     // Initialize mFocusArea.
-    if (mFocusAreaSupported) {
+    if (focusAreaSupported) {
       initializeFocusAreas(focusWidth, focusHeight, x, y, previewWidth, previewHeight);
     }
     // Initialize mMeteringArea.
-    if (mMeteringAreaSupported) {
+    if (meteringAreaSupported) {
       initializeMeteringAreas(focusWidth, focusHeight, x, y, previewWidth, previewHeight);
     }
 
     // Use margin to set the focus indicator to the touched area.
-    mPieRenderer.setFocus(x, y);
+    pieRenderer.setFocus(x, y);
 
     // Set the focus area and metering area.
-    mListener.setFocusParameters();
-    if (mFocusAreaSupported) {
+    listener.setFocusParameters();
+    if (focusAreaSupported) {
       autoFocus();
     } else { // Just show the indicator in all other cases.
       updateFocusUI();
       // Reset the metering area in 3 seconds.
-      mHandler.removeMessages(RESET_TOUCH_FOCUS);
-      mHandler.sendEmptyMessageDelayed(RESET_TOUCH_FOCUS, RESET_TOUCH_FOCUS_DELAY);
+      handler.removeMessages(RESET_TOUCH_FOCUS);
+      handler.sendEmptyMessageDelayed(RESET_TOUCH_FOCUS, RESET_TOUCH_FOCUS_DELAY);
     }
   }
 
   public void onPreviewStarted() {
-    mState = STATE_IDLE;
+    state = STATE_IDLE;
   }
 
   public void onPreviewStopped() {
     // If auto focus was in progress, it would have been stopped.
-    mState = STATE_IDLE;
+    state = STATE_IDLE;
     resetTouchFocus();
     updateFocusUI();
   }
@@ -314,10 +308,10 @@
 
   private void autoFocus() {
     LogUtil.v("FocusOverlayManager.autoFocus", "Start autofocus.");
-    mListener.autoFocus();
-    mState = STATE_FOCUSING;
+    listener.autoFocus();
+    state = STATE_FOCUSING;
     updateFocusUI();
-    mHandler.removeMessages(RESET_TOUCH_FOCUS);
+    handler.removeMessages(RESET_TOUCH_FOCUS);
   }
 
   public void cancelAutoFocus() {
@@ -327,57 +321,57 @@
     // Otherwise, focus mode stays at auto and the tap area passed to the
     // driver is not reset.
     resetTouchFocus();
-    mListener.cancelAutoFocus();
-    mState = STATE_IDLE;
+    listener.cancelAutoFocus();
+    state = STATE_IDLE;
     updateFocusUI();
-    mHandler.removeMessages(RESET_TOUCH_FOCUS);
+    handler.removeMessages(RESET_TOUCH_FOCUS);
   }
 
   private void capture() {
-    if (mListener.capture()) {
-      mState = STATE_IDLE;
-      mHandler.removeMessages(RESET_TOUCH_FOCUS);
+    if (listener.capture()) {
+      state = STATE_IDLE;
+      handler.removeMessages(RESET_TOUCH_FOCUS);
     }
   }
 
   public String getFocusMode() {
-    List<String> supportedFocusModes = mParameters.getSupportedFocusModes();
+    List<String> supportedFocusModes = parameters.getSupportedFocusModes();
 
-    if (mFocusAreaSupported && mFocusArea != null) {
+    if (focusAreaSupported && focusArea != null) {
       // Always use autofocus in tap-to-focus.
-      mFocusMode = Parameters.FOCUS_MODE_AUTO;
+      focusMode = Parameters.FOCUS_MODE_AUTO;
     } else {
-      mFocusMode = Parameters.FOCUS_MODE_CONTINUOUS_PICTURE;
+      focusMode = Parameters.FOCUS_MODE_CONTINUOUS_PICTURE;
     }
 
-    if (!isSupported(mFocusMode, supportedFocusModes)) {
+    if (!isSupported(focusMode, supportedFocusModes)) {
       // For some reasons, the driver does not support the current
       // focus mode. Fall back to auto.
-      if (isSupported(Parameters.FOCUS_MODE_AUTO, mParameters.getSupportedFocusModes())) {
-        mFocusMode = Parameters.FOCUS_MODE_AUTO;
+      if (isSupported(Parameters.FOCUS_MODE_AUTO, parameters.getSupportedFocusModes())) {
+        focusMode = Parameters.FOCUS_MODE_AUTO;
       } else {
-        mFocusMode = mParameters.getFocusMode();
+        focusMode = parameters.getFocusMode();
       }
     }
-    return mFocusMode;
+    return focusMode;
   }
 
   public List<Area> getFocusAreas() {
-    return mFocusArea;
+    return focusArea;
   }
 
   public List<Area> getMeteringAreas() {
-    return mMeteringArea;
+    return meteringArea;
   }
 
   private void updateFocusUI() {
-    if (!mInitialized) {
+    if (!initialized) {
       return;
     }
-    FocusIndicator focusIndicator = mPieRenderer;
+    FocusIndicator focusIndicator = pieRenderer;
 
-    if (mState == STATE_IDLE) {
-      if (mFocusArea == null) {
+    if (state == STATE_IDLE) {
+      if (focusArea == null) {
         focusIndicator.clear();
       } else {
         // Users touch on the preview and the indicator represents the
@@ -385,30 +379,30 @@
         // autoFocus call is not required.
         focusIndicator.showStart();
       }
-    } else if (mState == STATE_FOCUSING || mState == STATE_FOCUSING_SNAP_ON_FINISH) {
+    } else if (state == STATE_FOCUSING || state == STATE_FOCUSING_SNAP_ON_FINISH) {
       focusIndicator.showStart();
     } else {
-      if (Parameters.FOCUS_MODE_CONTINUOUS_PICTURE.equals(mFocusMode)) {
+      if (Parameters.FOCUS_MODE_CONTINUOUS_PICTURE.equals(focusMode)) {
         // TODO(blemmon): check HAL behavior and decide if this can be removed.
         focusIndicator.showSuccess(false);
-      } else if (mState == STATE_SUCCESS) {
+      } else if (state == STATE_SUCCESS) {
         focusIndicator.showSuccess(false);
-      } else if (mState == STATE_FAIL) {
+      } else if (state == STATE_FAIL) {
         focusIndicator.showFail(false);
       }
     }
   }
 
   private void resetTouchFocus() {
-    if (!mInitialized) {
+    if (!initialized) {
       return;
     }
 
     // Put focus indicator to the center. clear reset position
-    mPieRenderer.clear();
+    pieRenderer.clear();
 
-    mFocusArea = null;
-    mMeteringArea = null;
+    focusArea = null;
+    meteringArea = null;
   }
 
   private void calculateTapArea(
@@ -428,7 +422,7 @@
     int top = maxH > 0 ? clamp(y - areaHeight / 2, 0, maxH) : 0;
 
     RectF rectF = new RectF(left, top, left + areaWidth, top + areaHeight);
-    mMatrix.mapRect(rectF);
+    matrix.mapRect(rectF);
     rectFToRect(rectF, rect);
   }
 
diff --git a/java/com/android/dialer/callcomposer/camera/camerafocus/OverlayRenderer.java b/java/com/android/dialer/callcomposer/camera/camerafocus/OverlayRenderer.java
index 4a3b522..ac9512e 100644
--- a/java/com/android/dialer/callcomposer/camera/camerafocus/OverlayRenderer.java
+++ b/java/com/android/dialer/callcomposer/camera/camerafocus/OverlayRenderer.java
@@ -23,21 +23,21 @@
 /** Abstract class that all Camera overlays should implement. */
 public abstract class OverlayRenderer implements RenderOverlay.Renderer {
 
-  protected RenderOverlay mOverlay;
+  protected RenderOverlay overlay;
 
-  private int mLeft;
-  private int mTop;
-  private int mRight;
-  private int mBottom;
-  private boolean mVisible;
+  private int left;
+  private int top;
+  private int right;
+  private int bottom;
+  private boolean visible;
 
   public void setVisible(boolean vis) {
-    mVisible = vis;
+    visible = vis;
     update();
   }
 
   public boolean isVisible() {
-    return mVisible;
+    return visible;
   }
 
   // default does not handle touch
@@ -55,43 +55,43 @@
 
   @Override
   public void draw(Canvas canvas) {
-    if (mVisible) {
+    if (visible) {
       onDraw(canvas);
     }
   }
 
   @Override
   public void setOverlay(RenderOverlay overlay) {
-    mOverlay = overlay;
+    this.overlay = overlay;
   }
 
   @Override
   public void layout(int left, int top, int right, int bottom) {
-    mLeft = left;
-    mRight = right;
-    mTop = top;
-    mBottom = bottom;
+    this.left = left;
+    this.right = right;
+    this.top = top;
+    this.bottom = bottom;
   }
 
   protected Context getContext() {
-    if (mOverlay != null) {
-      return mOverlay.getContext();
+    if (overlay != null) {
+      return overlay.getContext();
     } else {
       return null;
     }
   }
 
   public int getWidth() {
-    return mRight - mLeft;
+    return right - left;
   }
 
   public int getHeight() {
-    return mBottom - mTop;
+    return bottom - top;
   }
 
   protected void update() {
-    if (mOverlay != null) {
-      mOverlay.update();
+    if (overlay != null) {
+      overlay.update();
     }
   }
 }
diff --git a/java/com/android/dialer/callcomposer/camera/camerafocus/PieItem.java b/java/com/android/dialer/callcomposer/camera/camerafocus/PieItem.java
index 86f69c0..1c44295 100644
--- a/java/com/android/dialer/callcomposer/camera/camerafocus/PieItem.java
+++ b/java/com/android/dialer/callcomposer/camera/camerafocus/PieItem.java
@@ -30,54 +30,54 @@
     void onClick(PieItem item);
   }
 
-  private Drawable mDrawable;
+  private Drawable drawable;
   private int level;
-  private float mCenter;
+  private float center;
   private float start;
   private float sweep;
   private float animate;
   private int inner;
   private int outer;
-  private boolean mSelected;
-  private boolean mEnabled;
-  private List<PieItem> mItems;
-  private Path mPath;
-  private OnClickListener mOnClickListener;
-  private float mAlpha;
+  private boolean selected;
+  private boolean enabled;
+  private List<PieItem> items;
+  private Path path;
+  private OnClickListener onClickListener;
+  private float alpha;
 
   // Gray out the view when disabled
   private static final float ENABLED_ALPHA = 1;
   private static final float DISABLED_ALPHA = (float) 0.3;
 
   public PieItem(Drawable drawable, int level) {
-    mDrawable = drawable;
+    this.drawable = drawable;
     this.level = level;
     setAlpha(1f);
-    mEnabled = true;
+    enabled = true;
     setAnimationAngle(getAnimationAngle());
     start = -1;
-    mCenter = -1;
+    center = -1;
   }
 
   public boolean hasItems() {
-    return mItems != null;
+    return items != null;
   }
 
   public List<PieItem> getItems() {
-    return mItems;
+    return items;
   }
 
   public void setPath(Path p) {
-    mPath = p;
+    path = p;
   }
 
   public Path getPath() {
-    return mPath;
+    return path;
   }
 
   public void setAlpha(float alpha) {
-    mAlpha = alpha;
-    mDrawable.setAlpha((int) (255 * alpha));
+    this.alpha = alpha;
+    drawable.setAlpha((int) (255 * alpha));
   }
 
   public void setAnimationAngle(float a) {
@@ -89,8 +89,8 @@
   }
 
   public void setEnabled(boolean enabled) {
-    mEnabled = enabled;
-    if (mEnabled) {
+    this.enabled = enabled;
+    if (this.enabled) {
       setAlpha(ENABLED_ALPHA);
     } else {
       setAlpha(DISABLED_ALPHA);
@@ -98,15 +98,15 @@
   }
 
   public boolean isEnabled() {
-    return mEnabled;
+    return enabled;
   }
 
   public void setSelected(boolean s) {
-    mSelected = s;
+    selected = s;
   }
 
   public boolean isSelected() {
-    return mSelected;
+    return selected;
   }
 
   public int getLevel() {
@@ -121,7 +121,7 @@
   }
 
   public float getCenter() {
-    return mCenter;
+    return center;
   }
 
   public float getStart() {
@@ -145,35 +145,35 @@
   }
 
   public void setOnClickListener(OnClickListener listener) {
-    mOnClickListener = listener;
+    onClickListener = listener;
   }
 
   public void performClick() {
-    if (mOnClickListener != null) {
-      mOnClickListener.onClick(this);
+    if (onClickListener != null) {
+      onClickListener.onClick(this);
     }
   }
 
   public int getIntrinsicWidth() {
-    return mDrawable.getIntrinsicWidth();
+    return drawable.getIntrinsicWidth();
   }
 
   public int getIntrinsicHeight() {
-    return mDrawable.getIntrinsicHeight();
+    return drawable.getIntrinsicHeight();
   }
 
   public void setBounds(int left, int top, int right, int bottom) {
-    mDrawable.setBounds(left, top, right, bottom);
+    drawable.setBounds(left, top, right, bottom);
   }
 
   public void draw(Canvas canvas) {
-    mDrawable.draw(canvas);
+    drawable.draw(canvas);
   }
 
   public void setImageResource(Context context, int resId) {
     Drawable d = context.getResources().getDrawable(resId).mutate();
-    d.setBounds(mDrawable.getBounds());
-    mDrawable = d;
-    setAlpha(mAlpha);
+    d.setBounds(drawable.getBounds());
+    drawable = d;
+    setAlpha(alpha);
   }
 }
diff --git a/java/com/android/dialer/callcomposer/camera/camerafocus/PieRenderer.java b/java/com/android/dialer/callcomposer/camera/camerafocus/PieRenderer.java
index 59b57b0..7629252 100644
--- a/java/com/android/dialer/callcomposer/camera/camerafocus/PieRenderer.java
+++ b/java/com/android/dialer/callcomposer/camera/camerafocus/PieRenderer.java
@@ -43,15 +43,15 @@
   // Sometimes continuous autofocus starts and stops several times quickly.
   // These states are used to make sure the animation is run for at least some
   // time.
-  private volatile int mState;
-  private ScaleAnimation mAnimation = new ScaleAnimation();
+  private volatile int state;
+  private ScaleAnimation animation = new ScaleAnimation();
   private static final int STATE_IDLE = 0;
   private static final int STATE_FOCUSING = 1;
   private static final int STATE_FINISHING = 2;
   private static final int STATE_PIE = 8;
 
-  private Runnable mDisappear = new Disappear();
-  private Animation.AnimationListener mEndAction = new EndAction();
+  private Runnable disappear = new Disappear();
+  private Animation.AnimationListener endAction = new EndAction();
   private static final int SCALING_UP_TIME = 600;
   private static final int SCALING_DOWN_TIME = 100;
   private static final int DISAPPEAR_TIMEOUT = 200;
@@ -65,73 +65,73 @@
   private static final int MSG_CLOSE = 1;
   private static final float PIE_SWEEP = (float) (Math.PI * 2 / 3);
   // geometry
-  private Point mCenter;
-  private int mRadius;
-  private int mRadiusInc;
+  private Point center;
+  private int radius;
+  private int radiusInc;
 
   // the detection if touch is inside a slice is offset
   // inbounds by this amount to allow the selection to show before the
   // finger covers it
-  private int mTouchOffset;
+  private int touchOffset;
 
-  private List<PieItem> mItems;
+  private List<PieItem> items;
 
-  private PieItem mOpenItem;
+  private PieItem openItem;
 
-  private Paint mSelectedPaint;
-  private Paint mSubPaint;
+  private Paint selectedPaint;
+  private Paint subPaint;
 
   // touch handling
-  private PieItem mCurrentItem;
+  private PieItem currentItem;
 
-  private Paint mFocusPaint;
-  private int mSuccessColor;
-  private int mFailColor;
-  private int mCircleSize;
-  private int mFocusX;
-  private int mFocusY;
-  private int mCenterX;
-  private int mCenterY;
+  private Paint focusPaint;
+  private int successColor;
+  private int failColor;
+  private int circleSize;
+  private int focusX;
+  private int focusY;
+  private int centerX;
+  private int centerY;
 
-  private int mDialAngle;
-  private RectF mCircle;
-  private RectF mDial;
-  private Point mPoint1;
-  private Point mPoint2;
-  private int mStartAnimationAngle;
-  private boolean mFocused;
-  private int mInnerOffset;
-  private int mOuterStroke;
-  private int mInnerStroke;
-  private boolean mTapMode;
-  private boolean mBlockFocus;
-  private int mTouchSlopSquared;
-  private Point mDown;
-  private boolean mOpening;
-  private LinearAnimation mXFade;
-  private LinearAnimation mFadeIn;
-  private volatile boolean mFocusCancelled;
+  private int dialAngle;
+  private RectF circle;
+  private RectF dial;
+  private Point point1;
+  private Point point2;
+  private int startAnimationAngle;
+  private boolean focused;
+  private int innerOffset;
+  private int outerStroke;
+  private int innerStroke;
+  private boolean tapMode;
+  private boolean blockFocus;
+  private int touchSlopSquared;
+  private Point down;
+  private boolean opening;
+  private LinearAnimation xFade;
+  private LinearAnimation fadeIn;
+  private volatile boolean focusCancelled;
 
-  private Handler mHandler =
+  private Handler handler =
       new Handler() {
         @Override
         public void handleMessage(Message msg) {
           switch (msg.what) {
             case MSG_OPEN:
-              if (mListener != null) {
-                mListener.onPieOpened(mCenter.x, mCenter.y);
+              if (listener != null) {
+                listener.onPieOpened(center.x, center.y);
               }
               break;
             case MSG_CLOSE:
-              if (mListener != null) {
-                mListener.onPieClosed();
+              if (listener != null) {
+                listener.onPieClosed();
               }
               break;
           }
         }
       };
 
-  private PieListener mListener;
+  private PieListener listener;
 
   /** Listener for the pie item to communicate back to the renderer. */
   public interface PieListener {
@@ -141,7 +141,7 @@
   }
 
   public void setPieListener(PieListener pl) {
-    mListener = pl;
+    listener = pl;
   }
 
   public PieRenderer(Context context) {
@@ -150,67 +150,67 @@
 
   private void init(Context ctx) {
     setVisible(false);
-    mItems = new ArrayList<PieItem>();
+    items = new ArrayList<PieItem>();
     Resources res = ctx.getResources();
-    mRadius = res.getDimensionPixelSize(R.dimen.pie_radius_start);
-    mCircleSize = mRadius - res.getDimensionPixelSize(R.dimen.focus_radius_offset);
-    mRadiusInc = res.getDimensionPixelSize(R.dimen.pie_radius_increment);
-    mTouchOffset = res.getDimensionPixelSize(R.dimen.pie_touch_offset);
-    mCenter = new Point(0, 0);
-    mSelectedPaint = new Paint();
-    mSelectedPaint.setColor(Color.argb(255, 51, 181, 229));
-    mSelectedPaint.setAntiAlias(true);
-    mSubPaint = new Paint();
-    mSubPaint.setAntiAlias(true);
-    mSubPaint.setColor(Color.argb(200, 250, 230, 128));
-    mFocusPaint = new Paint();
-    mFocusPaint.setAntiAlias(true);
-    mFocusPaint.setColor(Color.WHITE);
-    mFocusPaint.setStyle(Paint.Style.STROKE);
-    mSuccessColor = Color.GREEN;
-    mFailColor = Color.RED;
-    mCircle = new RectF();
-    mDial = new RectF();
-    mPoint1 = new Point();
-    mPoint2 = new Point();
-    mInnerOffset = res.getDimensionPixelSize(R.dimen.focus_inner_offset);
-    mOuterStroke = res.getDimensionPixelSize(R.dimen.focus_outer_stroke);
-    mInnerStroke = res.getDimensionPixelSize(R.dimen.focus_inner_stroke);
-    mState = STATE_IDLE;
-    mBlockFocus = false;
-    mTouchSlopSquared = ViewConfiguration.get(ctx).getScaledTouchSlop();
-    mTouchSlopSquared = mTouchSlopSquared * mTouchSlopSquared;
-    mDown = new Point();
+    radius = res.getDimensionPixelSize(R.dimen.pie_radius_start);
+    circleSize = radius - res.getDimensionPixelSize(R.dimen.focus_radius_offset);
+    radiusInc = res.getDimensionPixelSize(R.dimen.pie_radius_increment);
+    touchOffset = res.getDimensionPixelSize(R.dimen.pie_touch_offset);
+    center = new Point(0, 0);
+    selectedPaint = new Paint();
+    selectedPaint.setColor(Color.argb(255, 51, 181, 229));
+    selectedPaint.setAntiAlias(true);
+    subPaint = new Paint();
+    subPaint.setAntiAlias(true);
+    subPaint.setColor(Color.argb(200, 250, 230, 128));
+    focusPaint = new Paint();
+    focusPaint.setAntiAlias(true);
+    focusPaint.setColor(Color.WHITE);
+    focusPaint.setStyle(Paint.Style.STROKE);
+    successColor = Color.GREEN;
+    failColor = Color.RED;
+    circle = new RectF();
+    dial = new RectF();
+    point1 = new Point();
+    point2 = new Point();
+    innerOffset = res.getDimensionPixelSize(R.dimen.focus_inner_offset);
+    outerStroke = res.getDimensionPixelSize(R.dimen.focus_outer_stroke);
+    innerStroke = res.getDimensionPixelSize(R.dimen.focus_inner_stroke);
+    state = STATE_IDLE;
+    blockFocus = false;
+    touchSlopSquared = ViewConfiguration.get(ctx).getScaledTouchSlop();
+    touchSlopSquared = touchSlopSquared * touchSlopSquared;
+    down = new Point();
   }
 
   public boolean showsItems() {
-    return mTapMode;
+    return tapMode;
   }
 
   public void addItem(PieItem item) {
     // add the item to the pie itself
-    mItems.add(item);
+    items.add(item);
   }
 
   public void removeItem(PieItem item) {
-    mItems.remove(item);
+    items.remove(item);
   }
 
   public void clearItems() {
-    mItems.clear();
+    items.clear();
   }
 
   public void showInCenter() {
-    if ((mState == STATE_PIE) && isVisible()) {
-      mTapMode = false;
+    if ((state == STATE_PIE) && isVisible()) {
+      tapMode = false;
       show(false);
     } else {
-      if (mState != STATE_IDLE) {
+      if (state != STATE_IDLE) {
         cancelFocus();
       }
-      mState = STATE_PIE;
-      setCenter(mCenterX, mCenterY);
-      mTapMode = true;
+      state = STATE_PIE;
+      setCenter(centerX, centerY);
+      tapMode = true;
       show(true);
     }
   }
@@ -226,59 +226,59 @@
    */
   private void show(boolean show) {
     if (show) {
-      mState = STATE_PIE;
+      state = STATE_PIE;
       // ensure clean state
-      mCurrentItem = null;
-      mOpenItem = null;
-      for (PieItem item : mItems) {
+      currentItem = null;
+      openItem = null;
+      for (PieItem item : items) {
         item.setSelected(false);
       }
       layoutPie();
       fadeIn();
     } else {
-      mState = STATE_IDLE;
-      mTapMode = false;
-      if (mXFade != null) {
-        mXFade.cancel();
+      state = STATE_IDLE;
+      tapMode = false;
+      if (xFade != null) {
+        xFade.cancel();
       }
     }
     setVisible(show);
-    mHandler.sendEmptyMessage(show ? MSG_OPEN : MSG_CLOSE);
+    handler.sendEmptyMessage(show ? MSG_OPEN : MSG_CLOSE);
   }
 
   private void fadeIn() {
-    mFadeIn = new LinearAnimation(0, 1);
-    mFadeIn.setDuration(PIE_FADE_IN_DURATION);
-    mFadeIn.setAnimationListener(
+    fadeIn = new LinearAnimation(0, 1);
+    fadeIn.setDuration(PIE_FADE_IN_DURATION);
+    fadeIn.setAnimationListener(
         new AnimationListener() {
           @Override
           public void onAnimationStart(Animation animation) {}
 
           @Override
           public void onAnimationEnd(Animation animation) {
-            mFadeIn = null;
+            fadeIn = null;
           }
 
           @Override
           public void onAnimationRepeat(Animation animation) {}
         });
-    mFadeIn.startNow();
-    mOverlay.startAnimation(mFadeIn);
+    fadeIn.startNow();
+    overlay.startAnimation(fadeIn);
   }
 
   public void setCenter(int x, int y) {
-    mCenter.x = x;
-    mCenter.y = y;
+    center.x = x;
+    center.y = y;
     // when using the pie menu, align the focus ring
     alignFocus(x, y);
   }
 
   private void layoutPie() {
     int rgap = 2;
-    int inner = mRadius + rgap;
-    int outer = mRadius + mRadiusInc - rgap;
+    int inner = radius + rgap;
+    int outer = radius + radiusInc - rgap;
     int gap = 1;
-    layoutItems(mItems, (float) (Math.PI / 2), inner, outer, gap);
+    layoutItems(items, (float) (Math.PI / 2), inner, outer, gap);
   }
 
   private void layoutItems(List<PieItem> items, float centerAngle, int inner, int outer, int gap) {
@@ -294,7 +294,7 @@
         break;
       }
     }
-    Path path = makeSlice(getDegrees(0) - gap, getDegrees(sweep) + gap, outer, inner, mCenter);
+    Path path = makeSlice(getDegrees(0) - gap, getDegrees(sweep) + gap, outer, inner, center);
     for (PieItem item : items) {
       // shared between items
       item.setPath(path);
@@ -306,13 +306,13 @@
       // move views to outer border
       int r = inner + (outer - inner) * 2 / 3;
       int x = (int) (r * Math.cos(angle));
-      int y = mCenter.y - (int) (r * Math.sin(angle)) - h / 2;
-      x = mCenter.x + x - w / 2;
+      int y = center.y - (int) (r * Math.sin(angle)) - h / 2;
+      x = center.x + x - w / 2;
       item.setBounds(x, y, x + w, y + h);
       float itemstart = angle - sweep / 2;
       item.setGeometry(itemstart, sweep, inner, outer);
       if (item.hasItems()) {
-        layoutItems(item.getItems(), angle, inner, outer + mRadiusInc / 2, gap);
+        layoutItems(item.getItems(), angle, inner, outer + radiusInc / 2, gap);
       }
       angle += sweep;
     }
@@ -339,7 +339,7 @@
   }
 
   private void startFadeOut() {
-    mOverlay
+    overlay
         .animate()
         .alpha(0)
         .setListener(
@@ -348,7 +348,7 @@
               public void onAnimationEnd(Animator animation) {
                 deselect();
                 show(false);
-                mOverlay.setAlpha(1);
+                overlay.setAlpha(1);
                 super.onAnimationEnd(animation);
               }
             })
@@ -358,43 +358,43 @@
   @Override
   public void onDraw(Canvas canvas) {
     float alpha = 1;
-    if (mXFade != null) {
-      alpha = mXFade.getValue();
-    } else if (mFadeIn != null) {
-      alpha = mFadeIn.getValue();
+    if (xFade != null) {
+      alpha = xFade.getValue();
+    } else if (fadeIn != null) {
+      alpha = fadeIn.getValue();
     }
     int state = canvas.save();
-    if (mFadeIn != null) {
+    if (fadeIn != null) {
       float sf = 0.9f + alpha * 0.1f;
-      canvas.scale(sf, sf, mCenter.x, mCenter.y);
+      canvas.scale(sf, sf, center.x, center.y);
     }
     drawFocus(canvas);
-    if (mState == STATE_FINISHING) {
+    if (this.state == STATE_FINISHING) {
       canvas.restoreToCount(state);
       return;
     }
-    if ((mOpenItem == null) || (mXFade != null)) {
+    if ((openItem == null) || (xFade != null)) {
       // draw base menu
-      for (PieItem item : mItems) {
+      for (PieItem item : items) {
         drawItem(canvas, item, alpha);
       }
     }
-    if (mOpenItem != null) {
-      for (PieItem inner : mOpenItem.getItems()) {
-        drawItem(canvas, inner, (mXFade != null) ? (1 - 0.5f * alpha) : 1);
+    if (openItem != null) {
+      for (PieItem inner : openItem.getItems()) {
+        drawItem(canvas, inner, (xFade != null) ? (1 - 0.5f * alpha) : 1);
       }
     }
     canvas.restoreToCount(state);
   }
 
   private void drawItem(Canvas canvas, PieItem item, float alpha) {
-    if (mState == STATE_PIE) {
+    if (this.state == STATE_PIE) {
       if (item.getPath() != null) {
         if (item.isSelected()) {
-          Paint p = mSelectedPaint;
+          Paint p = selectedPaint;
           int state = canvas.save();
           float r = getDegrees(item.getStartAngle());
-          canvas.rotate(r, mCenter.x, mCenter.y);
+          canvas.rotate(r, center.x, center.y);
           canvas.drawPath(item.getPath(), p);
           canvas.restoreToCount(state);
         }
@@ -411,15 +411,15 @@
     float x = evt.getX();
     float y = evt.getY();
     int action = evt.getActionMasked();
-    PointF polar = getPolar(x, y, !(mTapMode));
+    PointF polar = getPolar(x, y, !(tapMode));
     if (MotionEvent.ACTION_DOWN == action) {
-      mDown.x = (int) evt.getX();
-      mDown.y = (int) evt.getY();
-      mOpening = false;
-      if (mTapMode) {
+      down.x = (int) evt.getX();
+      down.y = (int) evt.getY();
+      opening = false;
+      if (tapMode) {
         PieItem item = findItem(polar);
-        if ((item != null) && (mCurrentItem != item)) {
-          mState = STATE_PIE;
+        if ((item != null) && (currentItem != item)) {
+          state = STATE_PIE;
           onEnter(item);
         }
       } else {
@@ -429,34 +429,34 @@
       return true;
     } else if (MotionEvent.ACTION_UP == action) {
       if (isVisible()) {
-        PieItem item = mCurrentItem;
-        if (mTapMode) {
+        PieItem item = currentItem;
+        if (tapMode) {
           item = findItem(polar);
-          if (item != null && mOpening) {
-            mOpening = false;
+          if (item != null && opening) {
+            opening = false;
             return true;
           }
         }
         if (item == null) {
-          mTapMode = false;
+          tapMode = false;
           show(false);
-        } else if (!mOpening && !item.hasItems()) {
+        } else if (!opening && !item.hasItems()) {
           item.performClick();
           startFadeOut();
-          mTapMode = false;
+          tapMode = false;
         }
         return true;
       }
     } else if (MotionEvent.ACTION_CANCEL == action) {
-      if (isVisible() || mTapMode) {
+      if (isVisible() || tapMode) {
         show(false);
       }
       deselect();
       return false;
     } else if (MotionEvent.ACTION_MOVE == action) {
-      if (polar.y < mRadius) {
-        if (mOpenItem != null) {
-          mOpenItem = null;
+      if (polar.y < radius) {
+        if (openItem != null) {
+          openItem = null;
         } else {
           deselect();
         }
@@ -464,12 +464,12 @@
       }
       PieItem item = findItem(polar);
       boolean moved = hasMoved(evt);
-      if ((item != null) && (mCurrentItem != item) && (!mOpening || moved)) {
+      if ((item != null) && (currentItem != item) && (!opening || moved)) {
         // only select if we didn't just open or have moved past slop
-        mOpening = false;
+        opening = false;
         if (moved) {
           // switch back to swipe mode
-          mTapMode = false;
+          tapMode = false;
         }
         onEnter(item);
       }
@@ -478,8 +478,8 @@
   }
 
   private boolean hasMoved(MotionEvent e) {
-    return mTouchSlopSquared
-        < (e.getX() - mDown.x) * (e.getX() - mDown.x) + (e.getY() - mDown.y) * (e.getY() - mDown.y);
+    return touchSlopSquared
+        < (e.getX() - down.x) * (e.getX() - down.x) + (e.getY() - down.y) * (e.getY() - down.y);
   }
 
   /**
@@ -488,52 +488,52 @@
    * @param item
    */
   private void onEnter(PieItem item) {
-    if (mCurrentItem != null) {
-      mCurrentItem.setSelected(false);
+    if (currentItem != null) {
+      currentItem.setSelected(false);
     }
     if (item != null && item.isEnabled()) {
       item.setSelected(true);
-      mCurrentItem = item;
-      if ((mCurrentItem != mOpenItem) && mCurrentItem.hasItems()) {
+      currentItem = item;
+      if ((currentItem != openItem) && currentItem.hasItems()) {
         openCurrentItem();
       }
     } else {
-      mCurrentItem = null;
+      currentItem = null;
     }
   }
 
   private void deselect() {
-    if (mCurrentItem != null) {
-      mCurrentItem.setSelected(false);
+    if (currentItem != null) {
+      currentItem.setSelected(false);
     }
-    if (mOpenItem != null) {
-      mOpenItem = null;
+    if (openItem != null) {
+      openItem = null;
     }
-    mCurrentItem = null;
+    currentItem = null;
   }
 
   private void openCurrentItem() {
-    if ((mCurrentItem != null) && mCurrentItem.hasItems()) {
-      mCurrentItem.setSelected(false);
-      mOpenItem = mCurrentItem;
-      mOpening = true;
-      mXFade = new LinearAnimation(1, 0);
-      mXFade.setDuration(PIE_XFADE_DURATION);
-      mXFade.setAnimationListener(
+    if ((currentItem != null) && currentItem.hasItems()) {
+      currentItem.setSelected(false);
+      openItem = currentItem;
+      opening = true;
+      xFade = new LinearAnimation(1, 0);
+      xFade.setDuration(PIE_XFADE_DURATION);
+      xFade.setAnimationListener(
           new AnimationListener() {
             @Override
             public void onAnimationStart(Animation animation) {}
 
             @Override
             public void onAnimationEnd(Animation animation) {
-              mXFade = null;
+              xFade = null;
             }
 
             @Override
             public void onAnimationRepeat(Animation animation) {}
           });
-      mXFade.startNow();
-      mOverlay.startAnimation(mXFade);
+      xFade.startNow();
+      overlay.startAnimation(xFade);
     }
   }
 
@@ -541,8 +541,8 @@
     PointF res = new PointF();
     // get angle and radius from x/y
     res.x = (float) Math.PI / 2;
-    x = x - mCenter.x;
-    y = mCenter.y - y;
+    x = x - center.x;
+    y = center.y - y;
     res.y = (float) Math.sqrt(x * x + y * y);
     if (x != 0) {
       res.x = (float) Math.atan2(y, x);
@@ -550,7 +550,7 @@
         res.x = (float) (2 * Math.PI + res.x);
       }
     }
-    res.y = res.y + (useOffset ? mTouchOffset : 0);
+    res.y = res.y + (useOffset ? touchOffset : 0);
     return res;
   }
 
@@ -560,7 +560,7 @@
    */
   private PieItem findItem(PointF polar) {
     // find the matching item:
-    List<PieItem> items = (mOpenItem != null) ? mOpenItem.getItems() : mItems;
+    List<PieItem> items = (openItem != null) ? openItem.getItems() : this.items;
     for (PieItem item : items) {
       if (inside(polar, item)) {
         return item;
@@ -573,7 +573,7 @@
     return (item.getInnerRadius() < polar.y)
         && (item.getStartAngle() < polar.x)
         && (item.getStartAngle() + item.getSweep() > polar.x)
-        && (!mTapMode || (item.getOuterRadius() > polar.y));
+        && (!tapMode || (item.getOuterRadius() > polar.y));
   }
 
   @Override
@@ -584,31 +584,31 @@
   // focus specific code
 
   public void setBlockFocus(boolean blocked) {
-    mBlockFocus = blocked;
+    blockFocus = blocked;
     if (blocked) {
       clear();
     }
   }
 
   public void setFocus(int x, int y) {
-    mFocusX = x;
-    mFocusY = y;
-    setCircle(mFocusX, mFocusY);
+    focusX = x;
+    focusY = y;
+    setCircle(focusX, focusY);
   }
 
   public void alignFocus(int x, int y) {
-    mOverlay.removeCallbacks(mDisappear);
-    mAnimation.cancel();
-    mAnimation.reset();
-    mFocusX = x;
-    mFocusY = y;
-    mDialAngle = DIAL_HORIZONTAL;
+    overlay.removeCallbacks(disappear);
+    animation.cancel();
+    animation.reset();
+    focusX = x;
+    focusY = y;
+    dialAngle = DIAL_HORIZONTAL;
     setCircle(x, y);
-    mFocused = false;
+    focused = false;
   }
 
   public int getSize() {
-    return 2 * mCircleSize;
+    return 2 * circleSize;
   }
 
   private int getRandomRange() {
@@ -618,58 +618,57 @@
   @Override
   public void layout(int l, int t, int r, int b) {
     super.layout(l, t, r, b);
-    mCenterX = (r - l) / 2;
-    mCenterY = (b - t) / 2;
-    mFocusX = mCenterX;
-    mFocusY = mCenterY;
-    setCircle(mFocusX, mFocusY);
-    if (isVisible() && mState == STATE_PIE) {
-      setCenter(mCenterX, mCenterY);
+    centerX = (r - l) / 2;
+    centerY = (b - t) / 2;
+    focusX = centerX;
+    focusY = centerY;
+    setCircle(focusX, focusY);
+    if (isVisible() && state == STATE_PIE) {
+      setCenter(centerX, centerY);
       layoutPie();
     }
   }
 
   private void setCircle(int cx, int cy) {
-    mCircle.set(cx - mCircleSize, cy - mCircleSize, cx + mCircleSize, cy + mCircleSize);
-    mDial.set(
-        cx - mCircleSize + mInnerOffset,
-        cy - mCircleSize + mInnerOffset,
-        cx + mCircleSize - mInnerOffset,
-        cy + mCircleSize - mInnerOffset);
+    circle.set(cx - circleSize, cy - circleSize, cx + circleSize, cy + circleSize);
+    dial.set(
+        cx - circleSize + innerOffset,
+        cy - circleSize + innerOffset,
+        cx + circleSize - innerOffset,
+        cy + circleSize - innerOffset);
   }
 
   public void drawFocus(Canvas canvas) {
-    if (mBlockFocus) {
+    if (blockFocus) {
       return;
     }
-    mFocusPaint.setStrokeWidth(mOuterStroke);
-    canvas.drawCircle((float) mFocusX, (float) mFocusY, (float) mCircleSize, mFocusPaint);
-    if (mState == STATE_PIE) {
+    focusPaint.setStrokeWidth(outerStroke);
+    canvas.drawCircle((float) focusX, (float) focusY, (float) circleSize, focusPaint);
+    if (state == STATE_PIE) {
       return;
     }
-    int color = mFocusPaint.getColor();
-    if (mState == STATE_FINISHING) {
-      mFocusPaint.setColor(mFocused ? mSuccessColor : mFailColor);
+    int color = focusPaint.getColor();
+    if (state == STATE_FINISHING) {
+      focusPaint.setColor(focused ? successColor : failColor);
     }
-    mFocusPaint.setStrokeWidth(mInnerStroke);
-    drawLine(canvas, mDialAngle, mFocusPaint);
-    drawLine(canvas, mDialAngle + 45, mFocusPaint);
-    drawLine(canvas, mDialAngle + 180, mFocusPaint);
-    drawLine(canvas, mDialAngle + 225, mFocusPaint);
+    focusPaint.setStrokeWidth(innerStroke);
+    drawLine(canvas, dialAngle, focusPaint);
+    drawLine(canvas, dialAngle + 45, focusPaint);
+    drawLine(canvas, dialAngle + 180, focusPaint);
+    drawLine(canvas, dialAngle + 225, focusPaint);
     canvas.save();
     // rotate the arc instead of its offset to better use framework's shape caching
-    canvas.rotate(mDialAngle, mFocusX, mFocusY);
-    canvas.drawArc(mDial, 0, 45, false, mFocusPaint);
-    canvas.drawArc(mDial, 180, 45, false, mFocusPaint);
+    canvas.rotate(dialAngle, focusX, focusY);
+    canvas.drawArc(dial, 0, 45, false, focusPaint);
+    canvas.drawArc(dial, 180, 45, false, focusPaint);
     canvas.restore();
-    mFocusPaint.setColor(color);
+    focusPaint.setColor(color);
   }
 
   private void drawLine(Canvas canvas, int angle, Paint p) {
-    convertCart(angle, mCircleSize - mInnerOffset, mPoint1);
-    convertCart(angle, mCircleSize - mInnerOffset + mInnerOffset / 3, mPoint2);
-    canvas.drawLine(
-        mPoint1.x + mFocusX, mPoint1.y + mFocusY, mPoint2.x + mFocusX, mPoint2.y + mFocusY, p);
+    convertCart(angle, circleSize - innerOffset, point1);
+    convertCart(angle, circleSize - innerOffset + innerOffset / 3, point2);
+    canvas.drawLine(point1.x + focusX, point1.y + focusY, point2.x + focusX, point2.y + focusY, p);
   }
 
   private static void convertCart(int angle, int radius, Point out) {
@@ -680,65 +679,65 @@
 
   @Override
   public void showStart() {
-    if (mState == STATE_PIE) {
+    if (state == STATE_PIE) {
       return;
     }
     cancelFocus();
-    mStartAnimationAngle = 67;
+    startAnimationAngle = 67;
     int range = getRandomRange();
-    startAnimation(SCALING_UP_TIME, false, mStartAnimationAngle, mStartAnimationAngle + range);
-    mState = STATE_FOCUSING;
+    startAnimation(SCALING_UP_TIME, false, startAnimationAngle, startAnimationAngle + range);
+    state = STATE_FOCUSING;
   }
 
   @Override
   public void showSuccess(boolean timeout) {
-    if (mState == STATE_FOCUSING) {
-      startAnimation(SCALING_DOWN_TIME, timeout, mStartAnimationAngle);
-      mState = STATE_FINISHING;
-      mFocused = true;
+    if (state == STATE_FOCUSING) {
+      startAnimation(SCALING_DOWN_TIME, timeout, startAnimationAngle);
+      state = STATE_FINISHING;
+      focused = true;
     }
   }
 
   @Override
   public void showFail(boolean timeout) {
-    if (mState == STATE_FOCUSING) {
-      startAnimation(SCALING_DOWN_TIME, timeout, mStartAnimationAngle);
-      mState = STATE_FINISHING;
-      mFocused = false;
+    if (state == STATE_FOCUSING) {
+      startAnimation(SCALING_DOWN_TIME, timeout, startAnimationAngle);
+      state = STATE_FINISHING;
+      focused = false;
     }
   }
 
   private void cancelFocus() {
-    mFocusCancelled = true;
-    mOverlay.removeCallbacks(mDisappear);
-    if (mAnimation != null) {
-      mAnimation.cancel();
+    focusCancelled = true;
+    overlay.removeCallbacks(disappear);
+    if (animation != null) {
+      animation.cancel();
     }
-    mFocusCancelled = false;
-    mFocused = false;
-    mState = STATE_IDLE;
+    focusCancelled = false;
+    focused = false;
+    state = STATE_IDLE;
   }
 
   @Override
   public void clear() {
-    if (mState == STATE_PIE) {
+    if (state == STATE_PIE) {
       return;
     }
     cancelFocus();
-    mOverlay.post(mDisappear);
+    overlay.post(disappear);
   }
 
   private void startAnimation(long duration, boolean timeout, float toScale) {
-    startAnimation(duration, timeout, mDialAngle, toScale);
+    startAnimation(duration, timeout, dialAngle, toScale);
   }
 
   private void startAnimation(long duration, boolean timeout, float fromScale, float toScale) {
     setVisible(true);
-    mAnimation.reset();
-    mAnimation.setDuration(duration);
-    mAnimation.setScale(fromScale, toScale);
-    mAnimation.setAnimationListener(timeout ? mEndAction : null);
-    mOverlay.startAnimation(mAnimation);
+    animation.reset();
+    animation.setDuration(duration);
+    animation.setScale(fromScale, toScale);
+    animation.setAnimationListener(timeout ? endAction : null);
+    overlay.startAnimation(animation);
     update();
   }
 
@@ -746,8 +745,8 @@
     @Override
     public void onAnimationEnd(Animation animation) {
       // Keep the focus indicator for some time.
-      if (!mFocusCancelled) {
-        mOverlay.postDelayed(mDisappear, DISAPPEAR_TIMEOUT);
+      if (!focusCancelled) {
+        overlay.postDelayed(disappear, DISAPPEAR_TIMEOUT);
       }
     }
 
@@ -761,56 +760,56 @@
   private class Disappear implements Runnable {
     @Override
     public void run() {
-      if (mState == STATE_PIE) {
+      if (state == STATE_PIE) {
         return;
       }
       setVisible(false);
-      mFocusX = mCenterX;
-      mFocusY = mCenterY;
-      mState = STATE_IDLE;
-      setCircle(mFocusX, mFocusY);
-      mFocused = false;
+      focusX = centerX;
+      focusY = centerY;
+      state = STATE_IDLE;
+      setCircle(focusX, focusY);
+      focused = false;
     }
   }
 
   private class ScaleAnimation extends Animation {
-    private float mFrom = 1f;
-    private float mTo = 1f;
+    private float from = 1f;
+    private float to = 1f;
 
     public ScaleAnimation() {
       setFillAfter(true);
     }
 
     public void setScale(float from, float to) {
-      mFrom = from;
-      mTo = to;
+      this.from = from;
+      this.to = to;
     }
 
     @Override
     protected void applyTransformation(float interpolatedTime, Transformation t) {
-      mDialAngle = (int) (mFrom + (mTo - mFrom) * interpolatedTime);
+      dialAngle = (int) (from + (to - from) * interpolatedTime);
     }
   }
 
   private static class LinearAnimation extends Animation {
-    private float mFrom;
-    private float mTo;
-    private float mValue;
+    private float from;
+    private float to;
+    private float value;
 
     public LinearAnimation(float from, float to) {
       setFillAfter(true);
       setInterpolator(new LinearInterpolator());
-      mFrom = from;
-      mTo = to;
+      this.from = from;
+      this.to = to;
     }
 
     public float getValue() {
-      return mValue;
+      return value;
     }
 
     @Override
     protected void applyTransformation(float interpolatedTime, Transformation t) {
-      mValue = (mFrom + (mTo - mFrom) * interpolatedTime);
+      value = (from + (to - from) * interpolatedTime);
     }
   }
 }
diff --git a/java/com/android/dialer/callcomposer/camera/camerafocus/RenderOverlay.java b/java/com/android/dialer/callcomposer/camera/camerafocus/RenderOverlay.java
index c38ae6c..458e852 100644
--- a/java/com/android/dialer/callcomposer/camera/camerafocus/RenderOverlay.java
+++ b/java/com/android/dialer/callcomposer/camera/camerafocus/RenderOverlay.java
@@ -42,26 +42,26 @@
     void draw(Canvas canvas);
   }
 
-  private RenderView mRenderView;
-  private List<Renderer> mClients;
+  private RenderView renderView;
+  private List<Renderer> clients;
 
   // reverse list of touch clients
-  private List<Renderer> mTouchClients;
-  private int[] mPosition = new int[2];
+  private List<Renderer> touchClients;
+  private int[] position = new int[2];
 
   public RenderOverlay(Context context, AttributeSet attrs) {
     super(context, attrs);
-    mRenderView = new RenderView(context);
-    addView(mRenderView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
-    mClients = new ArrayList<>(10);
-    mTouchClients = new ArrayList<>(10);
+    renderView = new RenderView(context);
+    addView(renderView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
+    clients = new ArrayList<>(10);
+    touchClients = new ArrayList<>(10);
     setWillNotDraw(false);
 
     addRenderer(new PieRenderer(context));
   }
 
   public PieRenderer getPieRenderer() {
-    for (Renderer renderer : mClients) {
+    for (Renderer renderer : clients) {
       if (renderer instanceof PieRenderer) {
         return (PieRenderer) renderer;
       }
@@ -70,22 +70,22 @@
   }
 
   public void addRenderer(Renderer renderer) {
-    mClients.add(renderer);
+    clients.add(renderer);
     renderer.setOverlay(this);
     if (renderer.handlesTouch()) {
-      mTouchClients.add(0, renderer);
+      touchClients.add(0, renderer);
     }
     renderer.layout(getLeft(), getTop(), getRight(), getBottom());
   }
 
   public void addRenderer(int pos, Renderer renderer) {
-    mClients.add(pos, renderer);
+    clients.add(pos, renderer);
     renderer.setOverlay(this);
     renderer.layout(getLeft(), getTop(), getRight(), getBottom());
   }
 
   public void remove(Renderer renderer) {
-    mClients.remove(renderer);
+    clients.remove(renderer);
     renderer.setOverlay(null);
   }
 
@@ -95,11 +95,11 @@
   }
 
   private void adjustPosition() {
-    getLocationInWindow(mPosition);
+    getLocationInWindow(position);
   }
 
   public void update() {
-    mRenderView.invalidate();
+    renderView.invalidate();
   }
 
   @SuppressLint("ClickableViewAccessibility")
@@ -112,9 +112,9 @@
 
     @Override
     public boolean onTouchEvent(MotionEvent evt) {
-      if (mTouchClients != null) {
+      if (touchClients != null) {
         boolean res = false;
-        for (Renderer client : mTouchClients) {
+        for (Renderer client : touchClients) {
           res |= client.onTouchEvent(evt);
         }
         return res;
@@ -126,10 +126,10 @@
     public void onLayout(boolean changed, int left, int top, int right, int bottom) {
       adjustPosition();
       super.onLayout(changed, left, top, right, bottom);
-      if (mClients == null) {
+      if (clients == null) {
         return;
       }
-      for (Renderer renderer : mClients) {
+      for (Renderer renderer : clients) {
         renderer.layout(left, top, right, bottom);
       }
     }
@@ -137,11 +137,11 @@
     @Override
     public void draw(Canvas canvas) {
       super.draw(canvas);
-      if (mClients == null) {
+      if (clients == null) {
         return;
       }
       boolean redraw = false;
-      for (Renderer renderer : mClients) {
+      for (Renderer renderer : clients) {
         renderer.draw(canvas);
         redraw = redraw || ((OverlayRenderer) renderer).isVisible();
       }
diff --git a/java/com/android/dialer/callcomposer/camera/exif/CountedDataInputStream.java b/java/com/android/dialer/callcomposer/camera/exif/CountedDataInputStream.java
index e2c8185..cb5143a 100644
--- a/java/com/android/dialer/callcomposer/camera/exif/CountedDataInputStream.java
+++ b/java/com/android/dialer/callcomposer/camera/exif/CountedDataInputStream.java
@@ -27,45 +27,45 @@
 
 class CountedDataInputStream extends FilterInputStream {
 
-  private int mCount = 0;
+  private int count = 0;
 
   // allocate a byte buffer for a long value;
-  private final byte[] mByteArray = new byte[8];
-  private final ByteBuffer mByteBuffer = ByteBuffer.wrap(mByteArray);
+  private final byte[] byteArray = new byte[8];
+  private final ByteBuffer byteBuffer = ByteBuffer.wrap(byteArray);
 
   CountedDataInputStream(InputStream in) {
     super(in);
   }
 
   int getReadByteCount() {
-    return mCount;
+    return count;
   }
 
   @Override
   public int read(byte[] b) throws IOException {
     int r = in.read(b);
-    mCount += (r >= 0) ? r : 0;
+    count += (r >= 0) ? r : 0;
     return r;
   }
 
   @Override
   public int read(byte[] b, int off, int len) throws IOException {
     int r = in.read(b, off, len);
-    mCount += (r >= 0) ? r : 0;
+    count += (r >= 0) ? r : 0;
     return r;
   }
 
   @Override
   public int read() throws IOException {
     int r = in.read();
-    mCount += (r >= 0) ? 1 : 0;
+    count += (r >= 0) ? 1 : 0;
     return r;
   }
 
   @Override
   public long skip(long length) throws IOException {
     long skip = in.skip(length);
-    mCount += skip;
+    count += skip;
     return skip;
   }
 
@@ -76,7 +76,7 @@
   }
 
   void skipTo(long target) throws IOException {
-    long cur = mCount;
+    long cur = count;
     long diff = target - cur;
     Assert.checkArgument(diff >= 0);
     skipOrThrow(diff);
@@ -94,17 +94,17 @@
   }
 
   void setByteOrder(ByteOrder order) {
-    mByteBuffer.order(order);
+    byteBuffer.order(order);
   }
 
   ByteOrder getByteOrder() {
-    return mByteBuffer.order();
+    return byteBuffer.order();
   }
 
   short readShort() throws IOException {
-    readOrThrow(mByteArray, 0, 2);
-    mByteBuffer.rewind();
-    return mByteBuffer.getShort();
+    readOrThrow(byteArray, 0, 2);
+    byteBuffer.rewind();
+    return byteBuffer.getShort();
   }
 
   int readUnsignedShort() throws IOException {
@@ -112,9 +112,9 @@
   }
 
   int readInt() throws IOException {
-    readOrThrow(mByteArray, 0, 4);
-    mByteBuffer.rewind();
-    return mByteBuffer.getInt();
+    readOrThrow(byteArray, 0, 4);
+    byteBuffer.rewind();
+    return byteBuffer.getInt();
   }
 
   long readUnsignedInt() throws IOException {
diff --git a/java/com/android/dialer/callcomposer/camera/exif/ExifData.java b/java/com/android/dialer/callcomposer/camera/exif/ExifData.java
index 27936ae..fef9d87 100644
--- a/java/com/android/dialer/callcomposer/camera/exif/ExifData.java
+++ b/java/com/android/dialer/callcomposer/camera/exif/ExifData.java
@@ -25,20 +25,20 @@
  */
 public class ExifData {
 
-  private final IfdData[] mIfdDatas = new IfdData[IfdId.TYPE_IFD_COUNT];
+  private final IfdData[] ifdDatas = new IfdData[IfdId.TYPE_IFD_COUNT];
 
   /**
    * Adds IFD data. If IFD data of the same type already exists, it will be replaced by the new
    * data.
    */
   void addIfdData(IfdData data) {
-    mIfdDatas[data.getId()] = data;
+    ifdDatas[data.getId()] = data;
   }
 
   /** Returns the {@link IfdData} object corresponding to a given IFD if it exists or null. */
   IfdData getIfdData(int ifdId) {
     if (ExifTag.isValidIfd(ifdId)) {
-      return mIfdDatas[ifdId];
+      return ifdDatas[ifdId];
     }
     return null;
   }
@@ -47,7 +47,7 @@
    * Returns the tag with a given TID in the given IFD if the tag exists. Otherwise returns null.
    */
   protected ExifTag getTag(short tag, int ifd) {
-    IfdData ifdData = mIfdDatas[ifd];
+    IfdData ifdData = ifdDatas[ifd];
     return (ifdData == null) ? null : ifdData.getTag(tag);
   }
 
@@ -79,10 +79,10 @@
    * Returns the {@link IfdData} object corresponding to a given IFD or generates one if none exist.
    */
   private IfdData getOrCreateIfdData(int ifdId) {
-    IfdData ifdData = mIfdDatas[ifdId];
+    IfdData ifdData = ifdDatas[ifdId];
     if (ifdData == null) {
       ifdData = new IfdData(ifdId);
-      mIfdDatas[ifdId] = ifdData;
+      ifdDatas[ifdId] = ifdData;
     }
     return ifdData;
   }
diff --git a/java/com/android/dialer/callcomposer/camera/exif/ExifInterface.java b/java/com/android/dialer/callcomposer/camera/exif/ExifInterface.java
index 1bf9519..737401f 100644
--- a/java/com/android/dialer/callcomposer/camera/exif/ExifInterface.java
+++ b/java/com/android/dialer/callcomposer/camera/exif/ExifInterface.java
@@ -61,21 +61,21 @@
   static final int TAG_INTEROPERABILITY_IFD = defineTag(IfdId.TYPE_IFD_EXIF, (short) 0xA005);
 
   /** Tags that contain offset markers. These are included in the banned defines. */
-  private static HashSet<Short> sOffsetTags = new HashSet<>();
+  private static HashSet<Short> offsetTags = new HashSet<>();
 
   static {
-    sOffsetTags.add(getTrueTagKey(TAG_GPS_IFD));
-    sOffsetTags.add(getTrueTagKey(TAG_EXIF_IFD));
-    sOffsetTags.add(getTrueTagKey(TAG_JPEG_INTERCHANGE_FORMAT));
-    sOffsetTags.add(getTrueTagKey(TAG_INTEROPERABILITY_IFD));
-    sOffsetTags.add(getTrueTagKey(TAG_STRIP_OFFSETS));
+    offsetTags.add(getTrueTagKey(TAG_GPS_IFD));
+    offsetTags.add(getTrueTagKey(TAG_EXIF_IFD));
+    offsetTags.add(getTrueTagKey(TAG_JPEG_INTERCHANGE_FORMAT));
+    offsetTags.add(getTrueTagKey(TAG_INTEROPERABILITY_IFD));
+    offsetTags.add(getTrueTagKey(TAG_STRIP_OFFSETS));
   }
 
   private static final String NULL_ARGUMENT_STRING = "Argument is null";
 
   private static final String GPS_DATE_FORMAT_STR = "yyyy:MM:dd";
 
-  private ExifData mData = new ExifData();
+  private ExifData data = new ExifData();
 
   @SuppressLint("SimpleDateFormat")
   public ExifInterface() {
@@ -110,7 +110,7 @@
     } catch (ExifInvalidFormatException e) {
       throw new IOException("Invalid exif format : " + e);
     }
-    mData = d;
+    data = d;
   }
 
   /** Returns the TID for a tag constant. */
@@ -151,17 +151,17 @@
    * @return true if the TID is that of an offset tag.
    */
   static boolean isOffsetTag(short tag) {
-    return sOffsetTags.contains(tag);
+    return offsetTags.contains(tag);
   }
 
-  private SparseIntArray mTagInfo = null;
+  private SparseIntArray tagInfo = null;
 
   SparseIntArray getTagInfo() {
-    if (mTagInfo == null) {
-      mTagInfo = new SparseIntArray();
+    if (tagInfo == null) {
+      tagInfo = new SparseIntArray();
       initTagInfo();
     }
-    return mTagInfo;
+    return tagInfo;
   }
 
   private void initTagInfo() {
@@ -173,24 +173,24 @@
     // IFD0 tags
     int[] ifdAllowedIfds = {IfdId.TYPE_IFD_0, IfdId.TYPE_IFD_1};
     int ifdFlags = getFlagsFromAllowedIfds(ifdAllowedIfds) << 24;
-    mTagInfo.put(ExifInterface.TAG_STRIP_OFFSETS, ifdFlags | ExifTag.TYPE_UNSIGNED_LONG << 16);
-    mTagInfo.put(ExifInterface.TAG_EXIF_IFD, ifdFlags | ExifTag.TYPE_UNSIGNED_LONG << 16 | 1);
-    mTagInfo.put(ExifInterface.TAG_GPS_IFD, ifdFlags | ExifTag.TYPE_UNSIGNED_LONG << 16 | 1);
-    mTagInfo.put(ExifInterface.TAG_ORIENTATION, ifdFlags | ExifTag.TYPE_UNSIGNED_SHORT << 16 | 1);
-    mTagInfo.put(ExifInterface.TAG_STRIP_BYTE_COUNTS, ifdFlags | ExifTag.TYPE_UNSIGNED_LONG << 16);
+    tagInfo.put(ExifInterface.TAG_STRIP_OFFSETS, ifdFlags | ExifTag.TYPE_UNSIGNED_LONG << 16);
+    tagInfo.put(ExifInterface.TAG_EXIF_IFD, ifdFlags | ExifTag.TYPE_UNSIGNED_LONG << 16 | 1);
+    tagInfo.put(ExifInterface.TAG_GPS_IFD, ifdFlags | ExifTag.TYPE_UNSIGNED_LONG << 16 | 1);
+    tagInfo.put(ExifInterface.TAG_ORIENTATION, ifdFlags | ExifTag.TYPE_UNSIGNED_SHORT << 16 | 1);
+    tagInfo.put(ExifInterface.TAG_STRIP_BYTE_COUNTS, ifdFlags | ExifTag.TYPE_UNSIGNED_LONG << 16);
     // IFD1 tags
     int[] ifd1AllowedIfds = {IfdId.TYPE_IFD_1};
     int ifdFlags1 = getFlagsFromAllowedIfds(ifd1AllowedIfds) << 24;
-    mTagInfo.put(
+    tagInfo.put(
         ExifInterface.TAG_JPEG_INTERCHANGE_FORMAT,
         ifdFlags1 | ExifTag.TYPE_UNSIGNED_LONG << 16 | 1);
-    mTagInfo.put(
+    tagInfo.put(
         ExifInterface.TAG_JPEG_INTERCHANGE_FORMAT_LENGTH,
         ifdFlags1 | ExifTag.TYPE_UNSIGNED_LONG << 16 | 1);
     // Exif tags
     int[] exifAllowedIfds = {IfdId.TYPE_IFD_EXIF};
     int exifFlags = getFlagsFromAllowedIfds(exifAllowedIfds) << 24;
-    mTagInfo.put(
+    tagInfo.put(
         ExifInterface.TAG_INTEROPERABILITY_IFD, exifFlags | ExifTag.TYPE_UNSIGNED_LONG << 16 | 1);
   }
 
@@ -232,7 +232,7 @@
     if (!ExifTag.isValidIfd(ifdId)) {
       return null;
     }
-    return mData.getTag(getTrueTagKey(tagId), ifdId);
+    return data.getTag(getTrueTagKey(tagId), ifdId);
   }
 
   public Integer getTagIntValue(int tagId) {
@@ -328,7 +328,7 @@
 
   /** Clears this ExifInterface object's existing exif tags. */
   public void clearExif() {
-    mData = new ExifData();
+    data = new ExifData();
   }
 
   /**
@@ -340,7 +340,7 @@
    * @return the previous ExifTag with the same TID and IFD or null if none exists.
    */
   public ExifTag setTag(ExifTag tag) {
-    return mData.addTag(tag);
+    return data.addTag(tag);
   }
 
   /**
diff --git a/java/com/android/dialer/callcomposer/camera/exif/ExifParser.java b/java/com/android/dialer/callcomposer/camera/exif/ExifParser.java
index c728845..1aec4ab 100644
--- a/java/com/android/dialer/callcomposer/camera/exif/ExifParser.java
+++ b/java/com/android/dialer/callcomposer/camera/exif/ExifParser.java
@@ -119,20 +119,20 @@
 
   private static final int DEFAULT_IFD0_OFFSET = 8;
 
-  private final CountedDataInputStream mTiffStream;
-  private final int mOptions;
-  private int mIfdStartOffset = 0;
-  private int mNumOfTagInIfd = 0;
-  private int mIfdType;
-  private ExifTag mTag;
-  private ImageEvent mImageEvent;
-  private ExifTag mStripSizeTag;
-  private ExifTag mJpegSizeTag;
-  private boolean mNeedToParseOffsetsInCurrentIfd;
-  private boolean mContainExifData = false;
-  private int mApp1End;
-  private byte[] mDataAboveIfd0;
-  private int mIfd0Position;
+  private final CountedDataInputStream tiffStream;
+  private final int options;
+  private int ifdStartOffset = 0;
+  private int numOfTagInIfd = 0;
+  private int ifdType;
+  private ExifTag tag;
+  private ImageEvent imageEvent;
+  private ExifTag stripSizeTag;
+  private ExifTag jpegSizeTag;
+  private boolean needToParseOffsetsInCurrentIfd;
+  private boolean containExifData = false;
+  private int app1End;
+  private byte[] dataAboveIfd0;
+  private int ifd0Position;
   private final ExifInterface mInterface;
 
   private static final short TAG_EXIF_IFD = ExifInterface.getTrueTagKey(ExifInterface.TAG_EXIF_IFD);
@@ -148,26 +148,26 @@
   private static final short TAG_STRIP_BYTE_COUNTS =
       ExifInterface.getTrueTagKey(ExifInterface.TAG_STRIP_BYTE_COUNTS);
 
-  private final TreeMap<Integer, Object> mCorrespondingEvent = new TreeMap<>();
+  private final TreeMap<Integer, Object> correspondingEvent = new TreeMap<>();
 
   private boolean isIfdRequested(int ifdType) {
     switch (ifdType) {
       case IfdId.TYPE_IFD_0:
-        return (mOptions & OPTION_IFD_0) != 0;
+        return (options & OPTION_IFD_0) != 0;
       case IfdId.TYPE_IFD_1:
-        return (mOptions & OPTION_IFD_1) != 0;
+        return (options & OPTION_IFD_1) != 0;
       case IfdId.TYPE_IFD_EXIF:
-        return (mOptions & OPTION_IFD_EXIF) != 0;
+        return (options & OPTION_IFD_EXIF) != 0;
       case IfdId.TYPE_IFD_GPS:
-        return (mOptions & OPTION_IFD_GPS) != 0;
+        return (options & OPTION_IFD_GPS) != 0;
       case IfdId.TYPE_IFD_INTEROPERABILITY:
-        return (mOptions & OPTION_IFD_INTEROPERABILITY) != 0;
+        return (options & OPTION_IFD_INTEROPERABILITY) != 0;
     }
     return false;
   }
 
   private boolean isThumbnailRequested() {
-    return (mOptions & OPTION_THUMBNAIL) != 0;
+    return (options & OPTION_THUMBNAIL) != 0;
   }
 
   private ExifParser(InputStream inputStream, int options, ExifInterface iRef)
@@ -179,25 +179,25 @@
       LogUtil.v("ExifParser.ExifParser", "Reading exif...");
     }
     mInterface = iRef;
-    mContainExifData = seekTiffData(inputStream);
-    mTiffStream = new CountedDataInputStream(inputStream);
-    mOptions = options;
-    if (!mContainExifData) {
+    containExifData = seekTiffData(inputStream);
+    tiffStream = new CountedDataInputStream(inputStream);
+    this.options = options;
+    if (!containExifData) {
       return;
     }
 
     parseTiffHeader();
-    long offset = mTiffStream.readUnsignedInt();
+    long offset = tiffStream.readUnsignedInt();
     if (offset > Integer.MAX_VALUE) {
       throw new ExifInvalidFormatException("Invalid offset " + offset);
     }
-    mIfd0Position = (int) offset;
-    mIfdType = IfdId.TYPE_IFD_0;
+    ifd0Position = (int) offset;
+    ifdType = IfdId.TYPE_IFD_0;
     if (isIfdRequested(IfdId.TYPE_IFD_0) || needToParseOffsetsInCurrentIfd()) {
       registerIfd(IfdId.TYPE_IFD_0, offset);
       if (offset != DEFAULT_IFD0_OFFSET) {
-        mDataAboveIfd0 = new byte[(int) offset - DEFAULT_IFD0_OFFSET];
-        read(mDataAboveIfd0);
+        dataAboveIfd0 = new byte[(int) offset - DEFAULT_IFD0_OFFSET];
+        read(dataAboveIfd0);
       }
     }
   }
@@ -247,23 +247,23 @@
    * @see #EVENT_END
    */
   protected int next() throws IOException, ExifInvalidFormatException {
-    if (!mContainExifData) {
+    if (!containExifData) {
       return EVENT_END;
     }
-    int offset = mTiffStream.getReadByteCount();
-    int endOfTags = mIfdStartOffset + OFFSET_SIZE + TAG_SIZE * mNumOfTagInIfd;
+    int offset = tiffStream.getReadByteCount();
+    int endOfTags = ifdStartOffset + OFFSET_SIZE + TAG_SIZE * numOfTagInIfd;
     if (offset < endOfTags) {
-      mTag = readTag();
-      if (mTag == null) {
+      tag = readTag();
+      if (tag == null) {
         return next();
       }
-      if (mNeedToParseOffsetsInCurrentIfd) {
-        checkOffsetOrImageTag(mTag);
+      if (needToParseOffsetsInCurrentIfd) {
+        checkOffsetOrImageTag(tag);
       }
       return EVENT_NEW_TAG;
     } else if (offset == endOfTags) {
       // There is a link to ifd1 at the end of ifd0
-      if (mIfdType == IfdId.TYPE_IFD_0) {
+      if (ifdType == IfdId.TYPE_IFD_0) {
         long ifdOffset = readUnsignedLong();
         if (isIfdRequested(IfdId.TYPE_IFD_1) || isThumbnailRequested()) {
           if (ifdOffset != 0) {
@@ -273,8 +273,8 @@
       } else {
         int offsetSize = 4;
         // Some camera models use invalid length of the offset
-        if (mCorrespondingEvent.size() > 0) {
-          offsetSize = mCorrespondingEvent.firstEntry().getKey() - mTiffStream.getReadByteCount();
+        if (correspondingEvent.size() > 0) {
+          offsetSize = correspondingEvent.firstEntry().getKey() - tiffStream.getReadByteCount();
         }
         if (offsetSize < 4) {
           LogUtil.i("ExifParser.next", "Invalid size of link to next IFD: " + offsetSize);
@@ -286,8 +286,8 @@
         }
       }
     }
-    while (mCorrespondingEvent.size() != 0) {
-      Entry<Integer, Object> entry = mCorrespondingEvent.pollFirstEntry();
+    while (correspondingEvent.size() != 0) {
+      Entry<Integer, Object> entry = correspondingEvent.pollFirstEntry();
       Object event = entry.getValue();
       try {
         skipTo(entry.getKey());
@@ -302,30 +302,30 @@
         continue;
       }
       if (event instanceof IfdEvent) {
-        mIfdType = ((IfdEvent) event).ifd;
-        mNumOfTagInIfd = mTiffStream.readUnsignedShort();
-        mIfdStartOffset = entry.getKey();
+        ifdType = ((IfdEvent) event).ifd;
+        numOfTagInIfd = tiffStream.readUnsignedShort();
+        ifdStartOffset = entry.getKey();
 
-        if (mNumOfTagInIfd * TAG_SIZE + mIfdStartOffset + OFFSET_SIZE > mApp1End) {
-          LogUtil.i("ExifParser.next", "Invalid size of IFD " + mIfdType);
+        if (numOfTagInIfd * TAG_SIZE + ifdStartOffset + OFFSET_SIZE > app1End) {
+          LogUtil.i("ExifParser.next", "Invalid size of IFD " + ifdType);
           return EVENT_END;
         }
 
-        mNeedToParseOffsetsInCurrentIfd = needToParseOffsetsInCurrentIfd();
+        needToParseOffsetsInCurrentIfd = needToParseOffsetsInCurrentIfd();
         if (((IfdEvent) event).isRequested) {
           return EVENT_START_OF_IFD;
         } else {
           skipRemainingTagsInCurrentIfd();
         }
       } else if (event instanceof ImageEvent) {
-        mImageEvent = (ImageEvent) event;
-        return mImageEvent.type;
+        imageEvent = (ImageEvent) event;
+        return imageEvent.type;
       } else {
         ExifTagEvent tagEvent = (ExifTagEvent) event;
-        mTag = tagEvent.tag;
-        if (mTag.getDataType() != ExifTag.TYPE_UNDEFINED) {
-          readFullTagValue(mTag);
-          checkOffsetOrImageTag(mTag);
+        tag = tagEvent.tag;
+        if (tag.getDataType() != ExifTag.TYPE_UNDEFINED) {
+          readFullTagValue(tag);
+          checkOffsetOrImageTag(tag);
         }
         if (tagEvent.isRequested) {
           return EVENT_VALUE_OF_REGISTERED_TAG;
@@ -342,26 +342,26 @@
    * @throws ExifInvalidFormatException
    */
   private void skipRemainingTagsInCurrentIfd() throws IOException, ExifInvalidFormatException {
-    int endOfTags = mIfdStartOffset + OFFSET_SIZE + TAG_SIZE * mNumOfTagInIfd;
-    int offset = mTiffStream.getReadByteCount();
+    int endOfTags = ifdStartOffset + OFFSET_SIZE + TAG_SIZE * numOfTagInIfd;
+    int offset = tiffStream.getReadByteCount();
     if (offset > endOfTags) {
       return;
     }
-    if (mNeedToParseOffsetsInCurrentIfd) {
+    if (needToParseOffsetsInCurrentIfd) {
       while (offset < endOfTags) {
-        mTag = readTag();
+        tag = readTag();
         offset += TAG_SIZE;
-        if (mTag == null) {
+        if (tag == null) {
           continue;
         }
-        checkOffsetOrImageTag(mTag);
+        checkOffsetOrImageTag(tag);
       }
     } else {
       skipTo(endOfTags);
     }
     long ifdOffset = readUnsignedLong();
     // For ifd0, there is a link to ifd1 in the end of all tags
-    if (mIfdType == IfdId.TYPE_IFD_0
+    if (ifdType == IfdId.TYPE_IFD_0
         && (isIfdRequested(IfdId.TYPE_IFD_1) || isThumbnailRequested())) {
       if (ifdOffset > 0) {
         registerIfd(IfdId.TYPE_IFD_1, ifdOffset);
@@ -370,7 +370,7 @@
   }
 
   private boolean needToParseOffsetsInCurrentIfd() {
-    switch (mIfdType) {
+    switch (ifdType) {
       case IfdId.TYPE_IFD_0:
         return isIfdRequested(IfdId.TYPE_IFD_EXIF)
             || isIfdRequested(IfdId.TYPE_IFD_GPS)
@@ -408,7 +408,7 @@
    * @see #readString(int, java.nio.charset.Charset)
    */
   protected ExifTag getTag() {
-    return mTag;
+    return tag;
   }
 
   /**
@@ -421,7 +421,7 @@
    * @see IfdId#TYPE_IFD_EXIF
    */
   int getCurrentIfd() {
-    return mIfdType;
+    return ifdType;
   }
 
   /**
@@ -429,31 +429,31 @@
    * strip.
    */
   int getStripIndex() {
-    return mImageEvent.stripIndex;
+    return imageEvent.stripIndex;
   }
 
   /** When receiving {@link #EVENT_UNCOMPRESSED_STRIP}, call this function to get the strip size. */
   int getStripSize() {
-    if (mStripSizeTag == null) {
+    if (stripSizeTag == null) {
       return 0;
     }
-    return (int) mStripSizeTag.getValueAt(0);
+    return (int) stripSizeTag.getValueAt(0);
   }
 
   /**
    * When receiving {@link #EVENT_COMPRESSED_IMAGE}, call this function to get the image data size.
    */
   int getCompressedImageSize() {
-    if (mJpegSizeTag == null) {
+    if (jpegSizeTag == null) {
       return 0;
     }
-    return (int) mJpegSizeTag.getValueAt(0);
+    return (int) jpegSizeTag.getValueAt(0);
   }
 
   private void skipTo(int offset) throws IOException {
-    mTiffStream.skipTo(offset);
-    while (!mCorrespondingEvent.isEmpty() && mCorrespondingEvent.firstKey() < offset) {
-      mCorrespondingEvent.pollFirstEntry();
+    tiffStream.skipTo(offset);
+    while (!correspondingEvent.isEmpty() && correspondingEvent.firstKey() < offset) {
+      correspondingEvent.pollFirstEntry();
     }
   }
 
@@ -466,37 +466,37 @@
    * @see #EVENT_VALUE_OF_REGISTERED_TAG
    */
   void registerForTagValue(ExifTag tag) {
-    if (tag.getOffset() >= mTiffStream.getReadByteCount()) {
-      mCorrespondingEvent.put(tag.getOffset(), new ExifTagEvent(tag, true));
+    if (tag.getOffset() >= tiffStream.getReadByteCount()) {
+      correspondingEvent.put(tag.getOffset(), new ExifTagEvent(tag, true));
     }
   }
 
   private void registerIfd(int ifdType, long offset) {
     // Cast unsigned int to int since the offset is always smaller
     // than the size of APP1 (65536)
-    mCorrespondingEvent.put((int) offset, new IfdEvent(ifdType, isIfdRequested(ifdType)));
+    correspondingEvent.put((int) offset, new IfdEvent(ifdType, isIfdRequested(ifdType)));
   }
 
   private void registerCompressedImage(long offset) {
-    mCorrespondingEvent.put((int) offset, new ImageEvent(EVENT_COMPRESSED_IMAGE));
+    correspondingEvent.put((int) offset, new ImageEvent(EVENT_COMPRESSED_IMAGE));
   }
 
   private void registerUncompressedStrip(int stripIndex, long offset) {
-    mCorrespondingEvent.put((int) offset, new ImageEvent(EVENT_UNCOMPRESSED_STRIP, stripIndex));
+    correspondingEvent.put((int) offset, new ImageEvent(EVENT_UNCOMPRESSED_STRIP, stripIndex));
   }
 
   @SuppressLint("DefaultLocale")
   private ExifTag readTag() throws IOException, ExifInvalidFormatException {
-    short tagId = mTiffStream.readShort();
-    short dataFormat = mTiffStream.readShort();
-    long numOfComp = mTiffStream.readUnsignedInt();
+    short tagId = tiffStream.readShort();
+    short dataFormat = tiffStream.readShort();
+    long numOfComp = tiffStream.readUnsignedInt();
     if (numOfComp > Integer.MAX_VALUE) {
       throw new ExifInvalidFormatException("Number of component is larger then Integer.MAX_VALUE");
     }
     // Some invalid image file contains invalid data type. Ignore those tags
     if (!ExifTag.isValidType(dataFormat)) {
       LogUtil.i("ExifParser.readTag", "Tag %04x: Invalid data type %d", tagId, dataFormat);
-      mTiffStream.skip(4);
+      tiffStream.skip(4);
       return null;
     }
     // TODO(blemmon): handle numOfComp overflow
@@ -505,20 +505,20 @@
             tagId,
             dataFormat,
             (int) numOfComp,
-            mIfdType,
+            ifdType,
             ((int) numOfComp) != ExifTag.SIZE_UNDEFINED);
     int dataSize = tag.getDataSize();
     if (dataSize > 4) {
-      long offset = mTiffStream.readUnsignedInt();
+      long offset = tiffStream.readUnsignedInt();
       if (offset > Integer.MAX_VALUE) {
         throw new ExifInvalidFormatException("offset is larger then Integer.MAX_VALUE");
       }
       // Some invalid images put some undefined data before IFD0.
       // Read the data here.
-      if ((offset < mIfd0Position) && (dataFormat == ExifTag.TYPE_UNDEFINED)) {
+      if ((offset < ifd0Position) && (dataFormat == ExifTag.TYPE_UNDEFINED)) {
         byte[] buf = new byte[(int) numOfComp];
         System.arraycopy(
-            mDataAboveIfd0, (int) offset - DEFAULT_IFD0_OFFSET, buf, 0, (int) numOfComp);
+            dataAboveIfd0, (int) offset - DEFAULT_IFD0_OFFSET, buf, 0, (int) numOfComp);
         tag.setValue(buf);
       } else {
         tag.setOffset((int) offset);
@@ -530,9 +530,9 @@
       // Read value
       readFullTagValue(tag);
       tag.setHasDefinedCount(defCount);
-      mTiffStream.skip(4 - dataSize);
+      tiffStream.skip(4 - dataSize);
       // Set the offset to the position of value.
-      tag.setOffset(mTiffStream.getReadByteCount() - 4);
+      tag.setOffset(tiffStream.getReadByteCount() - 4);
     }
     return tag;
   }
@@ -569,7 +569,7 @@
     } else if (tid == TAG_JPEG_INTERCHANGE_FORMAT_LENGTH
         && checkAllowed(ifd, ExifInterface.TAG_JPEG_INTERCHANGE_FORMAT_LENGTH)) {
       if (isThumbnailRequested()) {
-        mJpegSizeTag = tag;
+        jpegSizeTag = tag;
       }
     } else if (tid == TAG_STRIP_OFFSETS && checkAllowed(ifd, ExifInterface.TAG_STRIP_OFFSETS)) {
       if (isThumbnailRequested()) {
@@ -582,14 +582,14 @@
             }
           }
         } else {
-          mCorrespondingEvent.put(tag.getOffset(), new ExifTagEvent(tag, false));
+          correspondingEvent.put(tag.getOffset(), new ExifTagEvent(tag, false));
         }
       }
     } else if (tid == TAG_STRIP_BYTE_COUNTS
         && checkAllowed(ifd, ExifInterface.TAG_STRIP_BYTE_COUNTS)
         && isThumbnailRequested()
         && tag.hasValue()) {
-      mStripSizeTag = tag;
+      stripSizeTag = tag;
     }
   }
 
@@ -605,15 +605,15 @@
         || type == ExifTag.TYPE_UNDEFINED
         || type == ExifTag.TYPE_UNSIGNED_BYTE) {
       int size = tag.getComponentCount();
-      if (mCorrespondingEvent.size() > 0) {
-        if (mCorrespondingEvent.firstEntry().getKey() < mTiffStream.getReadByteCount() + size) {
-          Object event = mCorrespondingEvent.firstEntry().getValue();
+      if (correspondingEvent.size() > 0) {
+        if (correspondingEvent.firstEntry().getKey() < tiffStream.getReadByteCount() + size) {
+          Object event = correspondingEvent.firstEntry().getValue();
           if (event instanceof ImageEvent) {
             // Tag value overlaps thumbnail, ignore thumbnail.
             LogUtil.i(
                 "ExifParser.readFullTagValue",
                 "Thumbnail overlaps value for tag: \n" + tag.toString());
-            Entry<Integer, Object> entry = mCorrespondingEvent.pollFirstEntry();
+            Entry<Integer, Object> entry = correspondingEvent.pollFirstEntry();
             LogUtil.i("ExifParser.readFullTagValue", "Invalid thumbnail offset: " + entry.getKey());
           } else {
             // Tag value overlaps another shorten count
@@ -629,7 +629,7 @@
                       + " overlaps value for tag: \n"
                       + tag.toString());
             }
-            size = mCorrespondingEvent.firstEntry().getKey() - mTiffStream.getReadByteCount();
+            size = correspondingEvent.firstEntry().getKey() - tiffStream.getReadByteCount();
             LogUtil.i(
                 "ExifParser.readFullTagValue",
                 "Invalid size of tag: \n" + tag.toString() + " setting count to: " + size);
@@ -702,16 +702,16 @@
   }
 
   private void parseTiffHeader() throws IOException, ExifInvalidFormatException {
-    short byteOrder = mTiffStream.readShort();
+    short byteOrder = tiffStream.readShort();
     if (LITTLE_ENDIAN_TAG == byteOrder) {
-      mTiffStream.setByteOrder(ByteOrder.LITTLE_ENDIAN);
+      tiffStream.setByteOrder(ByteOrder.LITTLE_ENDIAN);
     } else if (BIG_ENDIAN_TAG == byteOrder) {
-      mTiffStream.setByteOrder(ByteOrder.BIG_ENDIAN);
+      tiffStream.setByteOrder(ByteOrder.BIG_ENDIAN);
     } else {
       throw new ExifInvalidFormatException("Invalid TIFF header");
     }
 
-    if (mTiffStream.readShort() != TIFF_HEADER_TAIL) {
+    if (tiffStream.readShort() != TIFF_HEADER_TAIL) {
       throw new ExifInvalidFormatException("Invalid TIFF header");
     }
   }
@@ -736,7 +736,7 @@
           headerTail = dataStream.readShort();
           length -= 6;
           if (header == EXIF_HEADER && headerTail == EXIF_HEADER_TAIL) {
-            mApp1End = length;
+            app1End = length;
             return true;
           }
         }
@@ -752,12 +752,12 @@
 
   /** Reads bytes from the InputStream. */
   protected int read(byte[] buffer, int offset, int length) throws IOException {
-    return mTiffStream.read(buffer, offset, length);
+    return tiffStream.read(buffer, offset, length);
   }
 
   /** Equivalent to read(buffer, 0, buffer.length). */
   protected int read(byte[] buffer) throws IOException {
-    return mTiffStream.read(buffer);
+    return tiffStream.read(buffer);
   }
 
   /**
@@ -774,7 +774,7 @@
    */
   private String readString(int n, Charset charset) throws IOException {
     if (n > 0) {
-      return mTiffStream.readString(n, charset);
+      return tiffStream.readString(n, charset);
     } else {
       return "";
     }
@@ -782,7 +782,7 @@
 
   /** Reads value of type {@link ExifTag#TYPE_UNSIGNED_SHORT} from the InputStream. */
   private int readUnsignedShort() throws IOException {
-    return mTiffStream.readShort() & 0xffff;
+    return tiffStream.readShort() & 0xffff;
   }
 
   /** Reads value of type {@link ExifTag#TYPE_UNSIGNED_LONG} from the InputStream. */
@@ -799,7 +799,7 @@
 
   /** Reads value of type {@link ExifTag#TYPE_LONG} from the InputStream. */
   private int readLong() throws IOException {
-    return mTiffStream.readInt();
+    return tiffStream.readInt();
   }
 
   /** Reads value of type {@link ExifTag#TYPE_RATIONAL} from the InputStream. */
diff --git a/java/com/android/dialer/callcomposer/camera/exif/ExifTag.java b/java/com/android/dialer/callcomposer/camera/exif/ExifTag.java
index 9a03c10..23948ed 100644
--- a/java/com/android/dialer/callcomposer/camera/exif/ExifTag.java
+++ b/java/com/android/dialer/callcomposer/camera/exif/ExifTag.java
@@ -81,19 +81,19 @@
   static final int SIZE_UNDEFINED = 0;
 
   // Exif TagId
-  private final short mTagId;
+  private final short tagId;
   // Exif Tag Type
-  private final short mDataType;
+  private final short dataType;
   // If tag has defined count
-  private boolean mHasDefinedDefaultComponentCount;
+  private boolean hasDefinedDefaultComponentCount;
   // Actual data count in tag (should be number of elements in value array)
-  private int mComponentCountActual;
+  private int componentCountActual;
   // The ifd that this tag should be put in
-  private int mIfd;
+  private int ifd;
   // The value (array of elements of type Tag Type)
-  private Object mValue;
+  private Object value;
   // Value offset in exif header.
-  private int mOffset;
+  private int offset;
 
   /** Returns true if the given IFD is a valid IFD. */
   static boolean isValidIfd(int ifdId) {
@@ -118,12 +118,12 @@
 
   // Use builtTag in ExifInterface instead of constructor.
   ExifTag(short tagId, short type, int componentCount, int ifd, boolean hasDefinedComponentCount) {
-    mTagId = tagId;
-    mDataType = type;
-    mComponentCountActual = componentCount;
-    mHasDefinedDefaultComponentCount = hasDefinedComponentCount;
-    mIfd = ifd;
-    mValue = null;
+    this.tagId = tagId;
+    dataType = type;
+    componentCountActual = componentCount;
+    hasDefinedDefaultComponentCount = hasDefinedComponentCount;
+    this.ifd = ifd;
+    value = null;
   }
 
   /**
@@ -152,16 +152,16 @@
    * @see IfdId#TYPE_IFD_INTEROPERABILITY
    */
   int getIfd() {
-    return mIfd;
+    return ifd;
   }
 
   void setIfd(int ifdId) {
-    mIfd = ifdId;
+    ifd = ifdId;
   }
 
   /** Gets the TID of this tag. */
   short getTagId() {
-    return mTagId;
+    return tagId;
   }
 
   /**
@@ -177,7 +177,7 @@
    * @see #TYPE_UNSIGNED_SHORT
    */
   short getDataType() {
-    return mDataType;
+    return dataType;
   }
 
   /** Gets the total data size in bytes of the value of this tag. */
@@ -189,7 +189,7 @@
 
   // TODO(blemmon): fix integer overflows with this
   int getComponentCount() {
-    return mComponentCountActual;
+    return componentCountActual;
   }
 
   /**
@@ -197,7 +197,7 @@
    * value does not match the component count.
    */
   void forceSetComponentCount(int count) {
-    mComponentCountActual = count;
+    componentCountActual = count;
   }
 
   /**
@@ -205,7 +205,7 @@
    * that is determined when the tag is written.
    */
   boolean hasValue() {
-    return mValue != null;
+    return value != null;
   }
 
   /**
@@ -223,14 +223,14 @@
     if (checkBadComponentCount(value.length)) {
       return false;
     }
-    if (mDataType != TYPE_UNSIGNED_SHORT
-        && mDataType != TYPE_LONG
-        && mDataType != TYPE_UNSIGNED_LONG) {
+    if (dataType != TYPE_UNSIGNED_SHORT
+        && dataType != TYPE_LONG
+        && dataType != TYPE_UNSIGNED_LONG) {
       return false;
     }
-    if (mDataType == TYPE_UNSIGNED_SHORT && checkOverflowForUnsignedShort(value)) {
+    if (dataType == TYPE_UNSIGNED_SHORT && checkOverflowForUnsignedShort(value)) {
       return false;
-    } else if (mDataType == TYPE_UNSIGNED_LONG && checkOverflowForUnsignedLong(value)) {
+    } else if (dataType == TYPE_UNSIGNED_LONG && checkOverflowForUnsignedLong(value)) {
       return false;
     }
 
@@ -238,8 +238,8 @@
     for (int i = 0; i < value.length; i++) {
       data[i] = value[i];
     }
-    mValue = data;
-    mComponentCountActual = value.length;
+    this.value = data;
+    componentCountActual = value.length;
     return true;
   }
 
@@ -254,14 +254,14 @@
    * </ul>
    */
   boolean setValue(long[] value) {
-    if (checkBadComponentCount(value.length) || mDataType != TYPE_UNSIGNED_LONG) {
+    if (checkBadComponentCount(value.length) || dataType != TYPE_UNSIGNED_LONG) {
       return false;
     }
     if (checkOverflowForUnsignedLong(value)) {
       return false;
     }
-    mValue = value;
-    mComponentCountActual = value.length;
+    this.value = value;
+    componentCountActual = value.length;
     return true;
   }
 
@@ -280,7 +280,7 @@
    * </ul>
    */
   boolean setValue(String value) {
-    if (mDataType != TYPE_ASCII && mDataType != TYPE_UNDEFINED) {
+    if (dataType != TYPE_ASCII && dataType != TYPE_UNDEFINED) {
       return false;
     }
 
@@ -288,18 +288,18 @@
     byte[] finalBuf = buf;
     if (buf.length > 0) {
       finalBuf =
-          (buf[buf.length - 1] == 0 || mDataType == TYPE_UNDEFINED)
+          (buf[buf.length - 1] == 0 || dataType == TYPE_UNDEFINED)
               ? buf
               : Arrays.copyOf(buf, buf.length + 1);
-    } else if (mDataType == TYPE_ASCII && mComponentCountActual == 1) {
+    } else if (dataType == TYPE_ASCII && componentCountActual == 1) {
       finalBuf = new byte[] {0};
     }
     int count = finalBuf.length;
     if (checkBadComponentCount(count)) {
       return false;
     }
-    mComponentCountActual = count;
-    mValue = finalBuf;
+    componentCountActual = count;
+    this.value = finalBuf;
     return true;
   }
 
@@ -320,17 +320,17 @@
     if (checkBadComponentCount(value.length)) {
       return false;
     }
-    if (mDataType != TYPE_UNSIGNED_RATIONAL && mDataType != TYPE_RATIONAL) {
+    if (dataType != TYPE_UNSIGNED_RATIONAL && dataType != TYPE_RATIONAL) {
       return false;
     }
-    if (mDataType == TYPE_UNSIGNED_RATIONAL && checkOverflowForUnsignedRational(value)) {
+    if (dataType == TYPE_UNSIGNED_RATIONAL && checkOverflowForUnsignedRational(value)) {
       return false;
-    } else if (mDataType == TYPE_RATIONAL && checkOverflowForRational(value)) {
+    } else if (dataType == TYPE_RATIONAL && checkOverflowForRational(value)) {
       return false;
     }
 
-    mValue = value;
-    mComponentCountActual = value.length;
+    this.value = value;
+    componentCountActual = value.length;
     return true;
   }
 
@@ -348,12 +348,12 @@
     if (checkBadComponentCount(length)) {
       return false;
     }
-    if (mDataType != TYPE_UNSIGNED_BYTE && mDataType != TYPE_UNDEFINED) {
+    if (dataType != TYPE_UNSIGNED_BYTE && dataType != TYPE_UNDEFINED) {
       return false;
     }
-    mValue = new byte[length];
-    System.arraycopy(value, offset, mValue, 0, length);
-    mComponentCountActual = length;
+    this.value = new byte[length];
+    System.arraycopy(value, offset, this.value, 0, length);
+    componentCountActual = length;
     return true;
   }
 
@@ -370,10 +370,10 @@
    *     be converted to an array of ints.
    */
   int[] getValueAsInts() {
-    if (mValue == null) {
+    if (value == null) {
       return null;
-    } else if (mValue instanceof long[]) {
-      long[] val = (long[]) mValue;
+    } else if (value instanceof long[]) {
+      long[] val = (long[]) value;
       int[] arr = new int[val.length];
       for (int i = 0; i < val.length; i++) {
         arr[i] = (int) val[i]; // Truncates
@@ -385,38 +385,38 @@
 
   /** Gets the tag's value or null if none exists. */
   public Object getValue() {
-    return mValue;
+    return value;
   }
 
   /** Gets a string representation of the value. */
   private String forceGetValueAsString() {
-    if (mValue == null) {
+    if (value == null) {
       return "";
-    } else if (mValue instanceof byte[]) {
-      if (mDataType == TYPE_ASCII) {
-        return new String((byte[]) mValue, US_ASCII);
+    } else if (value instanceof byte[]) {
+      if (dataType == TYPE_ASCII) {
+        return new String((byte[]) value, US_ASCII);
       } else {
-        return Arrays.toString((byte[]) mValue);
+        return Arrays.toString((byte[]) value);
       }
-    } else if (mValue instanceof long[]) {
-      if (((long[]) mValue).length == 1) {
-        return String.valueOf(((long[]) mValue)[0]);
+    } else if (value instanceof long[]) {
+      if (((long[]) value).length == 1) {
+        return String.valueOf(((long[]) value)[0]);
       } else {
-        return Arrays.toString((long[]) mValue);
+        return Arrays.toString((long[]) value);
       }
-    } else if (mValue instanceof Object[]) {
-      if (((Object[]) mValue).length == 1) {
-        Object val = ((Object[]) mValue)[0];
+    } else if (value instanceof Object[]) {
+      if (((Object[]) value).length == 1) {
+        Object val = ((Object[]) value)[0];
         if (val == null) {
           return "";
         } else {
           return val.toString();
         }
       } else {
-        return Arrays.toString((Object[]) mValue);
+        return Arrays.toString((Object[]) value);
       }
     } else {
-      return mValue.toString();
+      return value.toString();
     }
   }
 
@@ -428,13 +428,13 @@
    *     #TYPE_UNSIGNED_RATIONAL}.
    */
   long getValueAt(int index) {
-    if (mValue instanceof long[]) {
-      return ((long[]) mValue)[index];
-    } else if (mValue instanceof byte[]) {
-      return ((byte[]) mValue)[index];
+    if (value instanceof long[]) {
+      return ((long[]) value)[index];
+    } else if (value instanceof byte[]) {
+      return ((byte[]) value)[index];
     }
     throw new IllegalArgumentException(
-        "Cannot get integer value from " + convertTypeToString(mDataType));
+        "Cannot get integer value from " + convertTypeToString(dataType));
   }
 
   /**
@@ -443,11 +443,11 @@
    * @exception IllegalArgumentException If the type is NOT {@link #TYPE_ASCII}.
    */
   protected String getString() {
-    if (mDataType != TYPE_ASCII) {
+    if (dataType != TYPE_ASCII) {
       throw new IllegalArgumentException(
-          "Cannot get ASCII value from " + convertTypeToString(mDataType));
+          "Cannot get ASCII value from " + convertTypeToString(dataType));
     }
-    return new String((byte[]) mValue, US_ASCII);
+    return new String((byte[]) value, US_ASCII);
   }
 
   /**
@@ -455,24 +455,24 @@
    * the location of the actual value.
    */
   protected int getOffset() {
-    return mOffset;
+    return offset;
   }
 
   /** Sets the offset of this tag. */
   protected void setOffset(int offset) {
-    mOffset = offset;
+    this.offset = offset;
   }
 
   void setHasDefinedCount(boolean d) {
-    mHasDefinedDefaultComponentCount = d;
+    hasDefinedDefaultComponentCount = d;
   }
 
   boolean hasDefinedCount() {
-    return mHasDefinedDefaultComponentCount;
+    return hasDefinedDefaultComponentCount;
   }
 
   private boolean checkBadComponentCount(int count) {
-    return mHasDefinedDefaultComponentCount && (mComponentCountActual != count);
+    return hasDefinedDefaultComponentCount && (componentCountActual != count);
   }
 
   private static String convertTypeToString(short type) {
@@ -556,34 +556,34 @@
     }
     if (obj instanceof ExifTag) {
       ExifTag tag = (ExifTag) obj;
-      if (tag.mTagId != this.mTagId
-          || tag.mComponentCountActual != this.mComponentCountActual
-          || tag.mDataType != this.mDataType) {
+      if (tag.tagId != this.tagId
+          || tag.componentCountActual != this.componentCountActual
+          || tag.dataType != this.dataType) {
         return false;
       }
-      if (mValue != null) {
-        if (tag.mValue == null) {
+      if (value != null) {
+        if (tag.value == null) {
           return false;
-        } else if (mValue instanceof long[]) {
-          if (!(tag.mValue instanceof long[])) {
+        } else if (value instanceof long[]) {
+          if (!(tag.value instanceof long[])) {
             return false;
           }
-          return Arrays.equals((long[]) mValue, (long[]) tag.mValue);
-        } else if (mValue instanceof Rational[]) {
-          if (!(tag.mValue instanceof Rational[])) {
+          return Arrays.equals((long[]) value, (long[]) tag.value);
+        } else if (value instanceof Rational[]) {
+          if (!(tag.value instanceof Rational[])) {
             return false;
           }
-          return Arrays.equals((Rational[]) mValue, (Rational[]) tag.mValue);
-        } else if (mValue instanceof byte[]) {
-          if (!(tag.mValue instanceof byte[])) {
+          return Arrays.equals((Rational[]) value, (Rational[]) tag.value);
+        } else if (value instanceof byte[]) {
+          if (!(tag.value instanceof byte[])) {
             return false;
           }
-          return Arrays.equals((byte[]) mValue, (byte[]) tag.mValue);
+          return Arrays.equals((byte[]) value, (byte[]) tag.value);
         } else {
-          return mValue.equals(tag.mValue);
+          return value.equals(tag.value);
         }
       } else {
-        return tag.mValue == null;
+        return tag.value == null;
       }
     }
     return false;
@@ -592,26 +592,20 @@
   @Override
   public int hashCode() {
     return Objects.hash(
-        mTagId,
-        mDataType,
-        mHasDefinedDefaultComponentCount,
-        mComponentCountActual,
-        mIfd,
-        mValue,
-        mOffset);
+        tagId, dataType, hasDefinedDefaultComponentCount, componentCountActual, ifd, value, offset);
   }
 
   @Override
   public String toString() {
-    return String.format("tag id: %04X\n", mTagId)
+    return String.format("tag id: %04X\n", tagId)
         + "ifd id: "
-        + mIfd
+        + ifd
         + "\ntype: "
-        + convertTypeToString(mDataType)
+        + convertTypeToString(dataType)
         + "\ncount: "
-        + mComponentCountActual
+        + componentCountActual
         + "\noffset: "
-        + mOffset
+        + offset
         + "\nvalue: "
         + forceGetValueAsString()
         + "\n";
diff --git a/java/com/android/dialer/callcomposer/camera/exif/IfdData.java b/java/com/android/dialer/callcomposer/camera/exif/IfdData.java
index b808def..e85919e 100644
--- a/java/com/android/dialer/callcomposer/camera/exif/IfdData.java
+++ b/java/com/android/dialer/callcomposer/camera/exif/IfdData.java
@@ -16,7 +16,7 @@
 
 package com.android.dialer.callcomposer.camera.exif;
 
-import java.util.HashMap;
+import android.support.v4.util.ArrayMap;
 import java.util.Map;
 import java.util.Objects;
 
@@ -28,9 +28,9 @@
  */
 class IfdData {
 
-  private final int mIfdId;
-  private final Map<Short, ExifTag> mExifTags = new HashMap<>();
-  private static final int[] sIfds = {
+  private final int ifdId;
+  private final Map<Short, ExifTag> exifTags = new ArrayMap<>();
+  private static final int[] ifds = {
     IfdId.TYPE_IFD_0,
     IfdId.TYPE_IFD_1,
     IfdId.TYPE_IFD_EXIF,
@@ -47,16 +47,16 @@
    * @see IfdId#TYPE_IFD_INTEROPERABILITY
    */
   IfdData(int ifdId) {
-    mIfdId = ifdId;
+    this.ifdId = ifdId;
   }
 
   static int[] getIfds() {
-    return sIfds;
+    return ifds;
   }
 
   /** Get a array the contains all {@link ExifTag} in this IFD. */
   private ExifTag[] getAllTags() {
-    return mExifTags.values().toArray(new ExifTag[mExifTags.size()]);
+    return exifTags.values().toArray(new ExifTag[exifTags.size()]);
   }
 
   /**
@@ -69,23 +69,23 @@
    * @see IfdId#TYPE_IFD_INTEROPERABILITY
    */
   protected int getId() {
-    return mIfdId;
+    return ifdId;
   }
 
   /** Gets the {@link ExifTag} with given tag id. Return null if there is no such tag. */
   protected ExifTag getTag(short tagId) {
-    return mExifTags.get(tagId);
+    return exifTags.get(tagId);
   }
 
   /** Adds or replaces a {@link ExifTag}. */
   protected ExifTag setTag(ExifTag tag) {
-    tag.setIfd(mIfdId);
-    return mExifTags.put(tag.getTagId(), tag);
+    tag.setIfd(ifdId);
+    return exifTags.put(tag.getTagId(), tag);
   }
 
   /** Gets the tags count in the IFD. */
   private int getTagCount() {
-    return mExifTags.size();
+    return exifTags.size();
   }
 
   /**
@@ -102,13 +102,13 @@
     }
     if (obj instanceof IfdData) {
       IfdData data = (IfdData) obj;
-      if (data.getId() == mIfdId && data.getTagCount() == getTagCount()) {
+      if (data.getId() == ifdId && data.getTagCount() == getTagCount()) {
         ExifTag[] tags = data.getAllTags();
         for (ExifTag tag : tags) {
           if (ExifInterface.isOffsetTag(tag.getTagId())) {
             continue;
           }
-          ExifTag tag2 = mExifTags.get(tag.getTagId());
+          ExifTag tag2 = exifTags.get(tag.getTagId());
           if (!tag.equals(tag2)) {
             return false;
           }
@@ -121,6 +121,6 @@
 
   @Override
   public int hashCode() {
-    return Objects.hash(mIfdId, mExifTags);
+    return Objects.hash(ifdId, exifTags);
   }
 }
diff --git a/java/com/android/dialer/callcomposer/camera/exif/Rational.java b/java/com/android/dialer/callcomposer/camera/exif/Rational.java
index 9afca84..d07778c 100644
--- a/java/com/android/dialer/callcomposer/camera/exif/Rational.java
+++ b/java/com/android/dialer/callcomposer/camera/exif/Rational.java
@@ -24,23 +24,23 @@
  */
 public class Rational {
 
-  private final long mNumerator;
-  private final long mDenominator;
+  private final long numerator;
+  private final long denominator;
 
   /** Create a Rational with a given numerator and denominator. */
   Rational(long nominator, long denominator) {
-    mNumerator = nominator;
-    mDenominator = denominator;
+    numerator = nominator;
+    this.denominator = denominator;
   }
 
   /** Gets the numerator of the rational. */
   long getNumerator() {
-    return mNumerator;
+    return numerator;
   }
 
   /** Gets the denominator of the rational */
   long getDenominator() {
-    return mDenominator;
+    return denominator;
   }
 
   @Override
@@ -53,18 +53,18 @@
     }
     if (obj instanceof Rational) {
       Rational data = (Rational) obj;
-      return mNumerator == data.mNumerator && mDenominator == data.mDenominator;
+      return numerator == data.numerator && denominator == data.denominator;
     }
     return false;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(mNumerator, mDenominator);
+    return Objects.hash(numerator, denominator);
   }
 
   @Override
   public String toString() {
-    return mNumerator + "/" + mDenominator;
+    return numerator + "/" + denominator;
   }
 }
diff --git a/java/com/android/dialer/callcomposer/cameraui/CameraMediaChooserView.java b/java/com/android/dialer/callcomposer/cameraui/CameraMediaChooserView.java
index 85c64e4..df0e7ad 100644
--- a/java/com/android/dialer/callcomposer/cameraui/CameraMediaChooserView.java
+++ b/java/com/android/dialer/callcomposer/cameraui/CameraMediaChooserView.java
@@ -36,7 +36,7 @@
 
   // True if we have at least queued an update to the view tree to support software rendering
   // fallback
-  private boolean mIsSoftwareFallbackActive;
+  private boolean isSoftwareFallbackActive;
 
   public CameraMediaChooserView(final Context context, final AttributeSet attrs) {
     super(context, attrs);
@@ -80,8 +80,8 @@
     super.onDraw(canvas);
     // If the canvas isn't hardware accelerated, we have to replace the HardwareCameraPreview
     // with a SoftwareCameraPreview which supports software rendering
-    if (!canvas.isHardwareAccelerated() && !mIsSoftwareFallbackActive) {
-      mIsSoftwareFallbackActive = true;
+    if (!canvas.isHardwareAccelerated() && !isSoftwareFallbackActive) {
+      isSoftwareFallbackActive = true;
       // Post modifying the tree since we can't modify the view tree during a draw pass
       post(
           new Runnable() {
diff --git a/java/com/android/dialer/calllogutils/CallTypeHelper.java b/java/com/android/dialer/calllogutils/CallTypeHelper.java
index e3c711d..6feaeb9 100644
--- a/java/com/android/dialer/calllogutils/CallTypeHelper.java
+++ b/java/com/android/dialer/calllogutils/CallTypeHelper.java
@@ -24,65 +24,65 @@
 public class CallTypeHelper {
 
   /** Name used to identify incoming calls. */
-  private final CharSequence mIncomingName;
+  private final CharSequence incomingName;
   /** Name used to identify incoming calls which were transferred to another device. */
-  private final CharSequence mIncomingPulledName;
+  private final CharSequence incomingPulledName;
   /** Name used to identify outgoing calls. */
-  private final CharSequence mOutgoingName;
+  private final CharSequence outgoingName;
   /** Name used to identify outgoing calls which were transferred to another device. */
-  private final CharSequence mOutgoingPulledName;
+  private final CharSequence outgoingPulledName;
   /** Name used to identify missed calls. */
-  private final CharSequence mMissedName;
+  private final CharSequence missedName;
   /** Name used to identify incoming video calls. */
-  private final CharSequence mIncomingVideoName;
+  private final CharSequence incomingVideoName;
   /** Name used to identify incoming video calls which were transferred to another device. */
-  private final CharSequence mIncomingVideoPulledName;
+  private final CharSequence incomingVideoPulledName;
   /** Name used to identify outgoing video calls. */
-  private final CharSequence mOutgoingVideoName;
+  private final CharSequence outgoingVideoName;
   /** Name used to identify outgoing video calls which were transferred to another device. */
-  private final CharSequence mOutgoingVideoPulledName;
+  private final CharSequence outgoingVideoPulledName;
   /** Name used to identify missed video calls. */
-  private final CharSequence mMissedVideoName;
+  private final CharSequence missedVideoName;
   /** Name used to identify voicemail calls. */
-  private final CharSequence mVoicemailName;
+  private final CharSequence voicemailName;
   /** Name used to identify rejected calls. */
-  private final CharSequence mRejectedName;
+  private final CharSequence rejectedName;
   /** Name used to identify blocked calls. */
-  private final CharSequence mBlockedName;
+  private final CharSequence blockedName;
   /** Name used to identify calls which were answered on another device. */
-  private final CharSequence mAnsweredElsewhereName;
+  private final CharSequence answeredElsewhereName;
   /** Name used to identify incoming Duo calls. */
-  private final CharSequence mIncomingDuoCall;
+  private final CharSequence incomingDuoCall;
   /** Name used to identify outgoing Duo calls. */
-  private final CharSequence mOutgoingDuoCall;
+  private final CharSequence outgoingDuoCall;
 
   public CallTypeHelper(Resources resources, Duo duo) {
     // Cache these values so that we do not need to look them up each time.
-    mIncomingName = resources.getString(R.string.type_incoming);
-    mIncomingPulledName = resources.getString(R.string.type_incoming_pulled);
-    mOutgoingName = resources.getString(R.string.type_outgoing);
-    mOutgoingPulledName = resources.getString(R.string.type_outgoing_pulled);
-    mMissedName = resources.getString(R.string.type_missed);
-    mIncomingVideoName = resources.getString(R.string.type_incoming_video);
-    mIncomingVideoPulledName = resources.getString(R.string.type_incoming_video_pulled);
-    mOutgoingVideoName = resources.getString(R.string.type_outgoing_video);
-    mOutgoingVideoPulledName = resources.getString(R.string.type_outgoing_video_pulled);
-    mMissedVideoName = resources.getString(R.string.type_missed_video);
-    mVoicemailName = resources.getString(R.string.type_voicemail);
-    mRejectedName = resources.getString(R.string.type_rejected);
-    mBlockedName = resources.getString(R.string.type_blocked);
-    mAnsweredElsewhereName = resources.getString(R.string.type_answered_elsewhere);
+    incomingName = resources.getString(R.string.type_incoming);
+    incomingPulledName = resources.getString(R.string.type_incoming_pulled);
+    outgoingName = resources.getString(R.string.type_outgoing);
+    outgoingPulledName = resources.getString(R.string.type_outgoing_pulled);
+    missedName = resources.getString(R.string.type_missed);
+    incomingVideoName = resources.getString(R.string.type_incoming_video);
+    incomingVideoPulledName = resources.getString(R.string.type_incoming_video_pulled);
+    outgoingVideoName = resources.getString(R.string.type_outgoing_video);
+    outgoingVideoPulledName = resources.getString(R.string.type_outgoing_video_pulled);
+    missedVideoName = resources.getString(R.string.type_missed_video);
+    voicemailName = resources.getString(R.string.type_voicemail);
+    rejectedName = resources.getString(R.string.type_rejected);
+    blockedName = resources.getString(R.string.type_blocked);
+    answeredElsewhereName = resources.getString(R.string.type_answered_elsewhere);
 
     if (duo.getIncomingCallTypeText() != -1) {
-      mIncomingDuoCall = resources.getString(duo.getIncomingCallTypeText());
+      incomingDuoCall = resources.getString(duo.getIncomingCallTypeText());
     } else {
-      mIncomingDuoCall = mIncomingVideoName;
+      incomingDuoCall = incomingVideoName;
     }
 
     if (duo.getOutgoingCallTypeText() != -1) {
-      mOutgoingDuoCall = resources.getString(duo.getOutgoingCallTypeText());
+      outgoingDuoCall = resources.getString(duo.getOutgoingCallTypeText());
     } else {
-      mOutgoingDuoCall = mOutgoingVideoName;
+      outgoingDuoCall = outgoingVideoName;
     }
   }
 
@@ -100,60 +100,60 @@
       case AppCompatConstants.CALLS_INCOMING_TYPE:
         if (isVideoCall) {
           if (isPulledCall) {
-            return mIncomingVideoPulledName;
+            return incomingVideoPulledName;
           } else {
             if (isDuoCall) {
-              return mIncomingDuoCall;
+              return incomingDuoCall;
             }
-            return mIncomingVideoName;
+            return incomingVideoName;
           }
         } else {
           if (isPulledCall) {
-            return mIncomingPulledName;
+            return incomingPulledName;
           } else {
-            return mIncomingName;
+            return incomingName;
           }
         }
 
       case AppCompatConstants.CALLS_OUTGOING_TYPE:
         if (isVideoCall) {
           if (isPulledCall) {
-            return mOutgoingVideoPulledName;
+            return outgoingVideoPulledName;
           } else {
             if (isDuoCall) {
-              return mOutgoingDuoCall;
+              return outgoingDuoCall;
             }
-            return mOutgoingVideoName;
+            return outgoingVideoName;
           }
         } else {
           if (isPulledCall) {
-            return mOutgoingPulledName;
+            return outgoingPulledName;
           } else {
-            return mOutgoingName;
+            return outgoingName;
           }
         }
 
       case AppCompatConstants.CALLS_MISSED_TYPE:
         if (isVideoCall) {
-          return mMissedVideoName;
+          return missedVideoName;
         } else {
-          return mMissedName;
+          return missedName;
         }
 
       case AppCompatConstants.CALLS_VOICEMAIL_TYPE:
-        return mVoicemailName;
+        return voicemailName;
 
       case AppCompatConstants.CALLS_REJECTED_TYPE:
-        return mRejectedName;
+        return rejectedName;
 
       case AppCompatConstants.CALLS_BLOCKED_TYPE:
-        return mBlockedName;
+        return blockedName;
 
       case AppCompatConstants.CALLS_ANSWERED_EXTERNALLY_TYPE:
-        return mAnsweredElsewhereName;
+        return answeredElsewhereName;
 
       default:
-        return mMissedName;
+        return missedName;
     }
   }
 }
diff --git a/java/com/android/dialer/calllogutils/CallTypeIconsView.java b/java/com/android/dialer/calllogutils/CallTypeIconsView.java
index 0c28a97..c7840c5 100644
--- a/java/com/android/dialer/calllogutils/CallTypeIconsView.java
+++ b/java/com/android/dialer/calllogutils/CallTypeIconsView.java
@@ -43,14 +43,14 @@
 
   private final boolean useLargeIcons;
 
-  private static Resources sResources;
-  private static Resources sLargeResouces;
-  private List<Integer> mCallTypes = new ArrayList<>(3);
-  private boolean mShowVideo;
-  private boolean mShowHd;
-  private boolean mShowWifi;
-  private int mWidth;
-  private int mHeight;
+  private static Resources resources;
+  private static Resources largeResouces;
+  private List<Integer> callTypes = new ArrayList<>(3);
+  private boolean showVideo;
+  private boolean showHd;
+  private boolean showWifi;
+  private int width;
+  private int height;
 
   public CallTypeIconsView(Context context) {
     this(context, null);
@@ -62,27 +62,27 @@
         context.getTheme().obtainStyledAttributes(attrs, R.styleable.CallTypeIconsView, 0, 0);
     useLargeIcons = typedArray.getBoolean(R.styleable.CallTypeIconsView_useLargeIcons, false);
     typedArray.recycle();
-    if (sResources == null) {
-      sResources = new Resources(context, false);
+    if (resources == null) {
+      resources = new Resources(context, false);
     }
-    if (sLargeResouces == null && useLargeIcons) {
-      sLargeResouces = new Resources(context, true);
+    if (largeResouces == null && useLargeIcons) {
+      largeResouces = new Resources(context, true);
     }
   }
 
   public void clear() {
-    mCallTypes.clear();
-    mWidth = 0;
-    mHeight = 0;
+    callTypes.clear();
+    width = 0;
+    height = 0;
     invalidate();
   }
 
   public void add(int callType) {
-    mCallTypes.add(callType);
+    callTypes.add(callType);
 
     final Drawable drawable = getCallTypeDrawable(callType);
-    mWidth += drawable.getIntrinsicWidth() + sResources.iconMargin;
-    mHeight = Math.max(mHeight, drawable.getIntrinsicWidth());
+    width += drawable.getIntrinsicWidth() + resources.iconMargin;
+    height = Math.max(height, drawable.getIntrinsicWidth());
     invalidate();
   }
 
@@ -92,10 +92,10 @@
    * @param showVideo True where the video icon should be shown.
    */
   public void setShowVideo(boolean showVideo) {
-    mShowVideo = showVideo;
+    this.showVideo = showVideo;
     if (showVideo) {
-      mWidth += sResources.videoCall.getIntrinsicWidth() + sResources.iconMargin;
-      mHeight = Math.max(mHeight, sResources.videoCall.getIntrinsicHeight());
+      width += resources.videoCall.getIntrinsicWidth() + resources.iconMargin;
+      height = Math.max(height, resources.videoCall.getIntrinsicHeight());
       invalidate();
     }
   }
@@ -106,42 +106,42 @@
    * @return True if the video icon should be shown.
    */
   public boolean isVideoShown() {
-    return mShowVideo;
+    return showVideo;
   }
 
   public void setShowHd(boolean showHd) {
-    mShowHd = showHd;
+    this.showHd = showHd;
     if (showHd) {
-      mWidth += sResources.hdCall.getIntrinsicWidth() + sResources.iconMargin;
-      mHeight = Math.max(mHeight, sResources.hdCall.getIntrinsicHeight());
+      width += resources.hdCall.getIntrinsicWidth() + resources.iconMargin;
+      height = Math.max(height, resources.hdCall.getIntrinsicHeight());
       invalidate();
     }
   }
 
   @VisibleForTesting
   public boolean isHdShown() {
-    return mShowHd;
+    return showHd;
   }
 
   public void setShowWifi(boolean showWifi) {
-    mShowWifi = showWifi;
+    this.showWifi = showWifi;
     if (showWifi) {
-      mWidth += sResources.wifiCall.getIntrinsicWidth() + sResources.iconMargin;
-      mHeight = Math.max(mHeight, sResources.wifiCall.getIntrinsicHeight());
+      width += resources.wifiCall.getIntrinsicWidth() + resources.iconMargin;
+      height = Math.max(height, resources.wifiCall.getIntrinsicHeight());
       invalidate();
     }
   }
 
   public int getCount() {
-    return mCallTypes.size();
+    return callTypes.size();
   }
 
   public int getCallType(int index) {
-    return mCallTypes.get(index);
+    return callTypes.get(index);
   }
 
   private Drawable getCallTypeDrawable(int callType) {
-    Resources resources = useLargeIcons ? sLargeResouces : sResources;
+    Resources resources = useLargeIcons ? largeResouces : CallTypeIconsView.resources;
     switch (callType) {
       case AppCompatConstants.CALLS_INCOMING_TYPE:
       case AppCompatConstants.CALLS_ANSWERED_EXTERNALLY_TYPE:
@@ -165,17 +165,17 @@
 
   @Override
   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-    setMeasuredDimension(mWidth, mHeight);
+    setMeasuredDimension(width, height);
   }
 
   @Override
   protected void onDraw(Canvas canvas) {
-    Resources resources = useLargeIcons ? sLargeResouces : sResources;
+    Resources resources = useLargeIcons ? largeResouces : CallTypeIconsView.resources;
     int left = 0;
     // If we are using large icons, we should only show one icon (video, hd or call type) with
     // priority give to HD or Video. So we skip the call type icon if we plan to show them.
-    if (!useLargeIcons || !(mShowHd || mShowVideo || mShowWifi)) {
-      for (Integer callType : mCallTypes) {
+    if (!useLargeIcons || !(showHd || showVideo || showWifi)) {
+      for (Integer callType : callTypes) {
         final Drawable drawable = getCallTypeDrawable(callType);
         final int right = left + drawable.getIntrinsicWidth();
         drawable.setBounds(left, 0, right, drawable.getIntrinsicHeight());
@@ -185,15 +185,15 @@
     }
 
     // If showing the video call icon, draw it scaled appropriately.
-    if (mShowVideo) {
+    if (showVideo) {
       left = addDrawable(canvas, resources.videoCall, left) + resources.iconMargin;
     }
     // If showing HD call icon, draw it scaled appropriately.
-    if (mShowHd) {
+    if (showHd) {
       left = addDrawable(canvas, resources.hdCall, left) + resources.iconMargin;
     }
     // If showing HD call icon, draw it scaled appropriately.
-    if (mShowWifi) {
+    if (showWifi) {
       left = addDrawable(canvas, resources.wifiCall, left) + resources.iconMargin;
     }
   }
diff --git a/java/com/android/dialer/common/concurrent/AsyncTaskExecutors.java b/java/com/android/dialer/common/concurrent/AsyncTaskExecutors.java
index a25e9fb..5beae4d 100644
--- a/java/com/android/dialer/common/concurrent/AsyncTaskExecutors.java
+++ b/java/com/android/dialer/common/concurrent/AsyncTaskExecutors.java
@@ -35,15 +35,15 @@
    * A single instance of the {@link AsyncTaskExecutorFactory}, to which we delegate if it is
    * non-null, for injecting when testing.
    */
-  private static AsyncTaskExecutorFactory mInjectedAsyncTaskExecutorFactory = null;
+  private static AsyncTaskExecutorFactory injectedAsyncTaskExecutorFactory = null;
 
   /**
    * Creates an AsyncTaskExecutor that submits tasks to run with {@link AsyncTask#SERIAL_EXECUTOR}.
    */
   public static AsyncTaskExecutor createAsyncTaskExecutor() {
     synchronized (AsyncTaskExecutors.class) {
-      if (mInjectedAsyncTaskExecutorFactory != null) {
-        return mInjectedAsyncTaskExecutorFactory.createAsyncTaskExeuctor();
+      if (injectedAsyncTaskExecutorFactory != null) {
+        return injectedAsyncTaskExecutorFactory.createAsyncTaskExeuctor();
       }
       return new SimpleAsyncTaskExecutor(AsyncTask.SERIAL_EXECUTOR);
     }
@@ -55,8 +55,8 @@
    */
   public static AsyncTaskExecutor createThreadPoolExecutor() {
     synchronized (AsyncTaskExecutors.class) {
-      if (mInjectedAsyncTaskExecutorFactory != null) {
-        return mInjectedAsyncTaskExecutorFactory.createAsyncTaskExeuctor();
+      if (injectedAsyncTaskExecutorFactory != null) {
+        return injectedAsyncTaskExecutorFactory.createAsyncTaskExeuctor();
       }
       return new SimpleAsyncTaskExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
     }
@@ -64,7 +64,7 @@
 
   public static void setFactoryForTest(AsyncTaskExecutorFactory factory) {
     synchronized (AsyncTaskExecutors.class) {
-      mInjectedAsyncTaskExecutorFactory = factory;
+      injectedAsyncTaskExecutorFactory = factory;
     }
   }
 
@@ -76,17 +76,17 @@
 
   static class SimpleAsyncTaskExecutor implements AsyncTaskExecutor {
 
-    private final Executor mExecutor;
+    private final Executor executor;
 
     public SimpleAsyncTaskExecutor(Executor executor) {
-      mExecutor = executor;
+      this.executor = executor;
     }
 
     @Override
     @MainThread
     public <T> AsyncTask<T, ?, ?> submit(Object identifer, AsyncTask<T, ?, ?> task, T... params) {
       Assert.isMainThread();
-      return task.executeOnExecutor(mExecutor, params);
+      return task.executeOnExecutor(executor, params);
     }
   }
 }
diff --git a/java/com/android/dialer/compat/PathInterpolatorCompat.java b/java/com/android/dialer/compat/PathInterpolatorCompat.java
index 7139bc4..d0d410d 100644
--- a/java/com/android/dialer/compat/PathInterpolatorCompat.java
+++ b/java/com/android/dialer/compat/PathInterpolatorCompat.java
@@ -37,8 +37,8 @@
     /** Governs the accuracy of the approximation of the {@link Path}. */
     private static final float PRECISION = 0.002f;
 
-    private final float[] mX;
-    private final float[] mY;
+    private final float[] x;
+    private final float[] y;
 
     public PathInterpolatorBase(Path path) {
       final PathMeasure pathMeasure = new PathMeasure(path, false /* forceClosed */);
@@ -46,16 +46,16 @@
       final float pathLength = pathMeasure.getLength();
       final int numPoints = (int) (pathLength / PRECISION) + 1;
 
-      mX = new float[numPoints];
-      mY = new float[numPoints];
+      x = new float[numPoints];
+      y = new float[numPoints];
 
       final float[] position = new float[2];
       for (int i = 0; i < numPoints; ++i) {
         final float distance = (i * pathLength) / (numPoints - 1);
         pathMeasure.getPosTan(distance, position, null /* tangent */);
 
-        mX[i] = position[0];
-        mY[i] = position[1];
+        x[i] = position[0];
+        y[i] = position[1];
       }
     }
 
@@ -93,26 +93,26 @@
 
       // Do a binary search for the correct x to interpolate between.
       int startIndex = 0;
-      int endIndex = mX.length - 1;
+      int endIndex = x.length - 1;
       while (endIndex - startIndex > 1) {
         int midIndex = (startIndex + endIndex) / 2;
-        if (t < mX[midIndex]) {
+        if (t < x[midIndex]) {
           endIndex = midIndex;
         } else {
           startIndex = midIndex;
         }
       }
 
-      final float xRange = mX[endIndex] - mX[startIndex];
+      final float xRange = x[endIndex] - x[startIndex];
       if (xRange == 0) {
-        return mY[startIndex];
+        return y[startIndex];
       }
 
-      final float tInRange = t - mX[startIndex];
+      final float tInRange = t - x[startIndex];
       final float fraction = tInRange / xRange;
 
-      final float startY = mY[startIndex];
-      final float endY = mY[endIndex];
+      final float startY = y[startIndex];
+      final float endY = y[endIndex];
 
       return startY + (fraction * (endY - startY));
     }
diff --git a/java/com/android/dialer/contactphoto/ContactPhotoManager.java b/java/com/android/dialer/contactphoto/ContactPhotoManager.java
index 4598379..353c1ee 100644
--- a/java/com/android/dialer/contactphoto/ContactPhotoManager.java
+++ b/java/com/android/dialer/contactphoto/ContactPhotoManager.java
@@ -57,7 +57,7 @@
   private static final String DEFAULT_IMAGE_URI_SCHEME = "defaultimage";
   private static final Uri DEFAULT_IMAGE_URI = Uri.parse(DEFAULT_IMAGE_URI_SCHEME + "://");
   public static final DefaultImageProvider DEFAULT_AVATAR = new LetterTileDefaultImageProvider();
-  private static ContactPhotoManager sInstance;
+  private static ContactPhotoManager instance;
 
   /**
    * Given a {@link DefaultImageRequest}, returns an Uri that can be used to request a letter tile
@@ -179,15 +179,15 @@
   }
 
   public static ContactPhotoManager getInstance(Context context) {
-    if (sInstance == null) {
+    if (instance == null) {
       Context applicationContext = context.getApplicationContext();
-      sInstance = createContactPhotoManager(applicationContext);
-      applicationContext.registerComponentCallbacks(sInstance);
+      instance = createContactPhotoManager(applicationContext);
+      applicationContext.registerComponentCallbacks(instance);
       if (PermissionsUtil.hasContactsReadPermissions(context)) {
-        sInstance.preloadPhotosInBackground();
+        instance.preloadPhotosInBackground();
       }
     }
-    return sInstance;
+    return instance;
   }
 
   public static synchronized ContactPhotoManager createContactPhotoManager(Context context) {
@@ -196,7 +196,7 @@
 
   @VisibleForTesting
   public static void injectContactPhotoManagerForTesting(ContactPhotoManager photoManager) {
-    sInstance = photoManager;
+    instance = photoManager;
   }
 
   protected boolean isDefaultImageUri(Uri uri) {
diff --git a/java/com/android/dialer/contactphoto/ContactPhotoManagerImpl.java b/java/com/android/dialer/contactphoto/ContactPhotoManagerImpl.java
index 5dbdf5e..edeeb78 100644
--- a/java/com/android/dialer/contactphoto/ContactPhotoManagerImpl.java
+++ b/java/com/android/dialer/contactphoto/ContactPhotoManagerImpl.java
@@ -95,57 +95,57 @@
    * Dummy object used to indicate that a bitmap for a given key could not be stored in the cache.
    */
   private static final BitmapHolder BITMAP_UNAVAILABLE;
-  /** Cache size for {@link #mBitmapHolderCache} for devices with "large" RAM. */
+  /** Cache size for {@link #bitmapHolderCache} for devices with "large" RAM. */
   private static final int HOLDER_CACHE_SIZE = 2000000;
-  /** Cache size for {@link #mBitmapCache} for devices with "large" RAM. */
+  /** Cache size for {@link #bitmapCache} for devices with "large" RAM. */
   private static final int BITMAP_CACHE_SIZE = 36864 * 48; // 1728K
   /** Height/width of a thumbnail image */
-  private static int mThumbnailSize;
+  private static int thumbnailSize;
 
   static {
     BITMAP_UNAVAILABLE = new BitmapHolder(new byte[0], 0);
     BITMAP_UNAVAILABLE.bitmapRef = new SoftReference<Bitmap>(null);
   }
 
-  private final Context mContext;
+  private final Context context;
   /**
    * An LRU cache for bitmap holders. The cache contains bytes for photos just as they come from the
    * database. Each holder has a soft reference to the actual bitmap.
    */
-  private final LruCache<Object, BitmapHolder> mBitmapHolderCache;
+  private final LruCache<Object, BitmapHolder> bitmapHolderCache;
   /** Cache size threshold at which bitmaps will not be preloaded. */
-  private final int mBitmapHolderCacheRedZoneBytes;
+  private final int bitmapHolderCacheRedZoneBytes;
   /**
    * Level 2 LRU cache for bitmaps. This is a smaller cache that holds the most recently used
    * bitmaps to save time on decoding them from bytes (the bytes are stored in {@link
-   * #mBitmapHolderCache}.
+   * #bitmapHolderCache}.
    */
-  private final LruCache<Object, Bitmap> mBitmapCache;
+  private final LruCache<Object, Bitmap> bitmapCache;
   /**
    * A map from ImageView to the corresponding photo ID or uri, encapsulated in a request. The
    * request may swapped out before the photo loading request is started.
    */
-  private final ConcurrentHashMap<ImageView, Request> mPendingRequests =
+  private final ConcurrentHashMap<ImageView, Request> pendingRequests =
       new ConcurrentHashMap<ImageView, Request>();
   /** Handler for messages sent to the UI thread. */
-  private final Handler mMainThreadHandler = new Handler(this);
+  private final Handler mainThreadHandler = new Handler(this);
   /** For debug: How many times we had to reload cached photo for a stale entry */
-  private final AtomicInteger mStaleCacheOverwrite = new AtomicInteger();
+  private final AtomicInteger staleCacheOverwrite = new AtomicInteger();
   /** For debug: How many times we had to reload cached photo for a fresh entry. Should be 0. */
-  private final AtomicInteger mFreshCacheOverwrite = new AtomicInteger();
-  /** {@code true} if ALL entries in {@link #mBitmapHolderCache} are NOT fresh. */
-  private volatile boolean mBitmapHolderCacheAllUnfresh = true;
+  private final AtomicInteger freshCacheOverwrite = new AtomicInteger();
+  /** {@code true} if ALL entries in {@link #bitmapHolderCache} are NOT fresh. */
+  private volatile boolean bitmapHolderCacheAllUnfresh = true;
   /** Thread responsible for loading photos from the database. Created upon the first request. */
-  private LoaderThread mLoaderThread;
+  private LoaderThread loaderThread;
   /** A gate to make sure we only send one instance of MESSAGE_PHOTOS_NEEDED at a time. */
-  private boolean mLoadingRequested;
+  private boolean loadingRequested;
   /** Flag indicating if the image loading is paused. */
-  private boolean mPaused;
+  private boolean paused;
   /** The user agent string to use when loading URI based photos. */
-  private String mUserAgent;
+  private String userAgent;
 
   public ContactPhotoManagerImpl(Context context) {
-    mContext = context;
+    this.context = context;
 
     final ActivityManager am =
         ((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE));
@@ -153,7 +153,7 @@
     final float cacheSizeAdjustment = (am.isLowRamDevice()) ? 0.5f : 1.0f;
 
     final int bitmapCacheSize = (int) (cacheSizeAdjustment * BITMAP_CACHE_SIZE);
-    mBitmapCache =
+    bitmapCache =
         new LruCache<Object, Bitmap>(bitmapCacheSize) {
           @Override
           protected int sizeOf(Object key, Bitmap value) {
@@ -169,7 +169,7 @@
           }
         };
     final int holderCacheSize = (int) (cacheSizeAdjustment * HOLDER_CACHE_SIZE);
-    mBitmapHolderCache =
+    bitmapHolderCache =
         new LruCache<Object, BitmapHolder>(holderCacheSize) {
           @Override
           protected int sizeOf(Object key, BitmapHolder value) {
@@ -184,22 +184,22 @@
             }
           }
         };
-    mBitmapHolderCacheRedZoneBytes = (int) (holderCacheSize * 0.75);
+    bitmapHolderCacheRedZoneBytes = (int) (holderCacheSize * 0.75);
     LogUtil.i(
         "ContactPhotoManagerImpl.ContactPhotoManagerImpl", "cache adj: " + cacheSizeAdjustment);
     if (DEBUG) {
       LogUtil.d(
           "ContactPhotoManagerImpl.ContactPhotoManagerImpl",
-          "Cache size: " + btk(mBitmapHolderCache.maxSize()) + " + " + btk(mBitmapCache.maxSize()));
+          "Cache size: " + btk(bitmapHolderCache.maxSize()) + " + " + btk(bitmapCache.maxSize()));
     }
 
-    mThumbnailSize =
+    thumbnailSize =
         context.getResources().getDimensionPixelSize(R.dimen.contact_browser_list_item_photo_size);
 
     // Get a user agent string to use for URI photo requests.
-    mUserAgent = Constants.get().getUserAgent(context);
-    if (mUserAgent == null) {
-      mUserAgent = "";
+    userAgent = Constants.get().getUserAgent(context);
+    if (userAgent == null) {
+      userAgent = "";
     }
   }
 
@@ -221,7 +221,7 @@
 
   /**
    * If necessary, decodes bytes stored in the holder to Bitmap. As long as the bitmap is held
-   * either by {@link #mBitmapCache} or by a soft reference in the holder, it will not be necessary
+   * either by {@link #bitmapCache} or by a soft reference in the holder, it will not be necessary
    * to decode the bitmap.
    */
   private static void inflateBitmap(BitmapHolder holder, int requestedExtent) {
@@ -256,7 +256,7 @@
       // The smaller dimension of a scaled bitmap can range from anywhere from 0 to just
       // below twice the length of a thumbnail image due to the way we calculate the optimal
       // sample size.
-      if (height != width && Math.min(height, width) <= mThumbnailSize * 2) {
+      if (height != width && Math.min(height, width) <= thumbnailSize * 2) {
         final int dimension = Math.min(height, width);
         bitmap = ThumbnailUtils.extractThumbnail(bitmap, dimension, dimension);
       }
@@ -306,7 +306,7 @@
       int rawBytes = 0;
       int bitmapBytes = 0;
       int numBitmaps = 0;
-      for (BitmapHolder h : mBitmapHolderCache.snapshot().values()) {
+      for (BitmapHolder h : bitmapHolderCache.snapshot().values()) {
         numHolders++;
         if (h.bytes != null) {
           rawBytes += h.bytes.length;
@@ -336,17 +336,17 @@
       LogUtil.d(
           "ContactPhotoManagerImpl.dumpStats",
           "L1 Stats: "
-              + mBitmapHolderCache.toString()
+              + bitmapHolderCache.toString()
               + ", overwrite: fresh="
-              + mFreshCacheOverwrite.get()
+              + freshCacheOverwrite.get()
               + " stale="
-              + mStaleCacheOverwrite.get());
+              + staleCacheOverwrite.get());
     }
 
     {
       int numBitmaps = 0;
       int bitmapBytes = 0;
-      for (Bitmap b : mBitmapCache.snapshot().values()) {
+      for (Bitmap b : bitmapCache.snapshot().values()) {
         numBitmaps++;
         bitmapBytes += b.getByteCount();
       }
@@ -377,7 +377,7 @@
   @Override
   public void preloadPhotosInBackground() {
     ensureLoaderThread();
-    mLoaderThread.requestPreloading();
+    loaderThread.requestPreloading();
   }
 
   @Override
@@ -391,7 +391,7 @@
     if (photoId == 0) {
       // No photo is needed
       defaultProvider.applyDefaultImage(view, -1, darkTheme, defaultImageRequest);
-      mPendingRequests.remove(view);
+      pendingRequests.remove(view);
     } else {
       if (DEBUG) {
         LogUtil.d("ContactPhotoManagerImpl.loadThumbnail", "loadPhoto request: " + photoId);
@@ -413,7 +413,7 @@
     if (photoUri == null) {
       // No photo is needed
       defaultProvider.applyDefaultImage(view, requestedExtent, darkTheme, defaultImageRequest);
-      mPendingRequests.remove(view);
+      pendingRequests.remove(view);
     } else {
       if (DEBUG) {
         LogUtil.d("ContactPhotoManagerImpl.loadPhoto", "loadPhoto request: " + photoUri);
@@ -445,10 +445,10 @@
   private void loadPhotoByIdOrUri(ImageView view, Request request) {
     boolean loaded = loadCachedPhoto(view, request, false);
     if (loaded) {
-      mPendingRequests.remove(view);
+      pendingRequests.remove(view);
     } else {
-      mPendingRequests.put(view, request);
-      if (!mPaused) {
+      pendingRequests.put(view, request);
+      if (!paused) {
         // Send a request to start loading photos
         requestLoading();
       }
@@ -458,7 +458,7 @@
   @Override
   public void removePhoto(ImageView view) {
     view.setImageDrawable(null);
-    mPendingRequests.remove(view);
+    pendingRequests.remove(view);
   }
 
   /**
@@ -468,10 +468,10 @@
   @Override
   public void cancelPendingRequests(View fragmentRootView) {
     if (fragmentRootView == null) {
-      mPendingRequests.clear();
+      pendingRequests.clear();
       return;
     }
-    final Iterator<Entry<ImageView, Request>> iterator = mPendingRequests.entrySet().iterator();
+    final Iterator<Entry<ImageView, Request>> iterator = pendingRequests.entrySet().iterator();
     while (iterator.hasNext()) {
       final ImageView imageView = iterator.next().getKey();
       // If an ImageView is orphaned (currently scrap) or a child of fragmentRootView, then
@@ -484,7 +484,7 @@
 
   @Override
   public void refreshCache() {
-    if (mBitmapHolderCacheAllUnfresh) {
+    if (bitmapHolderCacheAllUnfresh) {
       if (DEBUG) {
         LogUtil.d("ContactPhotoManagerImpl.refreshCache", "refreshCache -- no fresh entries.");
       }
@@ -493,8 +493,8 @@
     if (DEBUG) {
       LogUtil.d("ContactPhotoManagerImpl.refreshCache", "refreshCache");
     }
-    mBitmapHolderCacheAllUnfresh = true;
-    for (BitmapHolder holder : mBitmapHolderCache.snapshot().values()) {
+    bitmapHolderCacheAllUnfresh = true;
+    for (BitmapHolder holder : bitmapHolderCache.snapshot().values()) {
       if (holder != BITMAP_UNAVAILABLE) {
         holder.fresh = false;
       }
@@ -508,21 +508,21 @@
    */
   @UiThread
   private boolean loadCachedPhoto(ImageView view, Request request, boolean fadeIn) {
-    BitmapHolder holder = mBitmapHolderCache.get(request.getKey());
+    BitmapHolder holder = bitmapHolderCache.get(request.getKey());
     if (holder == null) {
       // The bitmap has not been loaded ==> show default avatar
-      request.applyDefaultImage(view, request.mIsCircular);
+      request.applyDefaultImage(view, request.isCircular);
       return false;
     }
 
     if (holder.bytes == null) {
-      request.applyDefaultImage(view, request.mIsCircular);
+      request.applyDefaultImage(view, request.isCircular);
       return holder.fresh;
     }
 
     Bitmap cachedBitmap = holder.bitmapRef == null ? null : holder.bitmapRef.get();
     if (cachedBitmap == null) {
-      request.applyDefaultImage(view, request.mIsCircular);
+      request.applyDefaultImage(view, request.isCircular);
       return false;
     }
 
@@ -538,18 +538,18 @@
       } else {
         layers[0] = previousDrawable;
       }
-      layers[1] = getDrawableForBitmap(mContext.getResources(), cachedBitmap, request);
+      layers[1] = getDrawableForBitmap(context.getResources(), cachedBitmap, request);
       TransitionDrawable drawable = new TransitionDrawable(layers);
       view.setImageDrawable(drawable);
       drawable.startTransition(FADE_TRANSITION_DURATION);
     } else {
-      view.setImageDrawable(getDrawableForBitmap(mContext.getResources(), cachedBitmap, request));
+      view.setImageDrawable(getDrawableForBitmap(context.getResources(), cachedBitmap, request));
     }
 
     // Put the bitmap in the LRU cache. But only do this for images that are small enough
     // (we require that at least six of those can be cached at the same time)
-    if (cachedBitmap.getByteCount() < mBitmapCache.maxSize() / 6) {
-      mBitmapCache.put(request.getKey(), cachedBitmap);
+    if (cachedBitmap.getByteCount() < bitmapCache.maxSize() / 6) {
+      bitmapCache.put(request.getKey(), cachedBitmap);
     }
 
     // Soften the reference
@@ -563,7 +563,7 @@
    * specified request.
    */
   private Drawable getDrawableForBitmap(Resources resources, Bitmap bitmap, Request request) {
-    if (request.mIsCircular) {
+    if (request.isCircular) {
       final RoundedBitmapDrawable drawable = RoundedBitmapDrawableFactory.create(resources, bitmap);
       drawable.setAntiAlias(true);
       drawable.setCornerRadius(drawable.getIntrinsicHeight() / 2);
@@ -577,23 +577,23 @@
     if (DEBUG) {
       LogUtil.d("ContactPhotoManagerImpl.clear", "clear");
     }
-    mPendingRequests.clear();
-    mBitmapHolderCache.evictAll();
-    mBitmapCache.evictAll();
+    pendingRequests.clear();
+    bitmapHolderCache.evictAll();
+    bitmapCache.evictAll();
   }
 
   @Override
   public void pause() {
-    mPaused = true;
+    paused = true;
   }
 
   @Override
   public void resume() {
-    mPaused = false;
+    paused = false;
     if (DEBUG) {
       dumpStats();
     }
-    if (!mPendingRequests.isEmpty()) {
+    if (!pendingRequests.isEmpty()) {
       requestLoading();
     }
   }
@@ -604,9 +604,9 @@
    * photos before any of those requests are executed. This allows us to load images in bulk.
    */
   private void requestLoading() {
-    if (!mLoadingRequested) {
-      mLoadingRequested = true;
-      mMainThreadHandler.sendEmptyMessage(MESSAGE_REQUEST_LOADING);
+    if (!loadingRequested) {
+      loadingRequested = true;
+      mainThreadHandler.sendEmptyMessage(MESSAGE_REQUEST_LOADING);
     }
   }
 
@@ -616,17 +616,17 @@
     switch (msg.what) {
       case MESSAGE_REQUEST_LOADING:
         {
-          mLoadingRequested = false;
-          if (!mPaused) {
+          loadingRequested = false;
+          if (!paused) {
             ensureLoaderThread();
-            mLoaderThread.requestLoading();
+            loaderThread.requestLoading();
           }
           return true;
         }
 
       case MESSAGE_PHOTOS_LOADED:
         {
-          if (!mPaused) {
+          if (!paused) {
             processLoadedImages();
           }
           if (DEBUG) {
@@ -640,9 +640,9 @@
   }
 
   public void ensureLoaderThread() {
-    if (mLoaderThread == null) {
-      mLoaderThread = new LoaderThread(mContext.getContentResolver());
-      mLoaderThread.start();
+    if (loaderThread == null) {
+      loaderThread = new LoaderThread(context.getContentResolver());
+      loaderThread.start();
     }
   }
 
@@ -651,7 +651,7 @@
    * haven't been loaded, sends another request for image loading.
    */
   private void processLoadedImages() {
-    final Iterator<Entry<ImageView, Request>> iterator = mPendingRequests.entrySet().iterator();
+    final Iterator<Entry<ImageView, Request>> iterator = pendingRequests.entrySet().iterator();
     while (iterator.hasNext()) {
       final Entry<ImageView, Request> entry = iterator.next();
       // TODO: Temporarily disable contact photo fading in, until issues with
@@ -664,17 +664,17 @@
 
     softenCache();
 
-    if (!mPendingRequests.isEmpty()) {
+    if (!pendingRequests.isEmpty()) {
       requestLoading();
     }
   }
 
   /**
    * Removes strong references to loaded bitmaps to allow them to be garbage collected if needed.
-   * Some of the bitmaps will still be retained by {@link #mBitmapCache}.
+   * Some of the bitmaps will still be retained by {@link #bitmapCache}.
    */
   private void softenCache() {
-    for (BitmapHolder holder : mBitmapHolderCache.snapshot().values()) {
+    for (BitmapHolder holder : bitmapHolderCache.snapshot().values()) {
       holder.bitmap = null;
     }
   }
@@ -682,15 +682,15 @@
   /** Stores the supplied bitmap in cache. */
   private void cacheBitmap(Object key, byte[] bytes, boolean preloading, int requestedExtent) {
     if (DEBUG) {
-      BitmapHolder prev = mBitmapHolderCache.get(key);
+      BitmapHolder prev = bitmapHolderCache.get(key);
       if (prev != null && prev.bytes != null) {
         LogUtil.d(
             "ContactPhotoManagerImpl.cacheBitmap",
             "overwriting cache: key=" + key + (prev.fresh ? " FRESH" : " stale"));
         if (prev.fresh) {
-          mFreshCacheOverwrite.incrementAndGet();
+          freshCacheOverwrite.incrementAndGet();
         } else {
-          mStaleCacheOverwrite.incrementAndGet();
+          staleCacheOverwrite.incrementAndGet();
         }
       }
       LogUtil.d(
@@ -707,16 +707,16 @@
     }
 
     if (bytes != null) {
-      mBitmapHolderCache.put(key, holder);
-      if (mBitmapHolderCache.get(key) != holder) {
+      bitmapHolderCache.put(key, holder);
+      if (bitmapHolderCache.get(key) != holder) {
         LogUtil.w("ContactPhotoManagerImpl.cacheBitmap", "bitmap too big to fit in cache.");
-        mBitmapHolderCache.put(key, BITMAP_UNAVAILABLE);
+        bitmapHolderCache.put(key, BITMAP_UNAVAILABLE);
       }
     } else {
-      mBitmapHolderCache.put(key, BITMAP_UNAVAILABLE);
+      bitmapHolderCache.put(key, BITMAP_UNAVAILABLE);
     }
 
-    mBitmapHolderCacheAllUnfresh = false;
+    bitmapHolderCacheAllUnfresh = false;
   }
 
   /**
@@ -739,10 +739,10 @@
      * concurrent change, we will need to check the map again once loading
      * is complete.
      */
-    Iterator<Request> iterator = mPendingRequests.values().iterator();
+    Iterator<Request> iterator = pendingRequests.values().iterator();
     while (iterator.hasNext()) {
       Request request = iterator.next();
-      final BitmapHolder holder = mBitmapHolderCache.get(request.getKey());
+      final BitmapHolder holder = bitmapHolderCache.get(request.getKey());
       if (holder == BITMAP_UNAVAILABLE) {
         continue;
       }
@@ -759,14 +759,14 @@
             uris.add(request);
           } else {
             photoIds.add(request.getId());
-            photoIdsAsStrings.add(String.valueOf(request.mId));
+            photoIdsAsStrings.add(String.valueOf(request.id));
           }
         }
       }
     }
 
     if (jpegsDecoded) {
-      mMainThreadHandler.sendEmptyMessage(MESSAGE_PHOTOS_LOADED);
+      mainThreadHandler.sendEmptyMessage(MESSAGE_PHOTOS_LOADED);
     }
   }
 
@@ -794,13 +794,13 @@
    */
   private static final class Request {
 
-    private final long mId;
-    private final Uri mUri;
-    private final boolean mDarkTheme;
-    private final int mRequestedExtent;
-    private final DefaultImageProvider mDefaultProvider;
+    private final long id;
+    private final Uri uri;
+    private final boolean darkTheme;
+    private final int requestedExtent;
+    private final DefaultImageProvider defaultProvider;
     /** Whether or not the contact photo is to be displayed as a circle */
-    private final boolean mIsCircular;
+    private final boolean isCircular;
 
     private Request(
         long id,
@@ -809,12 +809,12 @@
         boolean darkTheme,
         boolean isCircular,
         DefaultImageProvider defaultProvider) {
-      mId = id;
-      mUri = uri;
-      mDarkTheme = darkTheme;
-      mIsCircular = isCircular;
-      mRequestedExtent = requestedExtent;
-      mDefaultProvider = defaultProvider;
+      this.id = id;
+      this.uri = uri;
+      this.darkTheme = darkTheme;
+      this.isCircular = isCircular;
+      this.requestedExtent = requestedExtent;
+      this.defaultProvider = defaultProvider;
     }
 
     public static Request createFromThumbnailId(
@@ -833,28 +833,28 @@
     }
 
     public boolean isUriRequest() {
-      return mUri != null;
+      return uri != null;
     }
 
     public Uri getUri() {
-      return mUri;
+      return uri;
     }
 
     public long getId() {
-      return mId;
+      return id;
     }
 
     public int getRequestedExtent() {
-      return mRequestedExtent;
+      return requestedExtent;
     }
 
     @Override
     public int hashCode() {
       final int prime = 31;
       int result = 1;
-      result = prime * result + (int) (mId ^ (mId >>> 32));
-      result = prime * result + mRequestedExtent;
-      result = prime * result + ((mUri == null) ? 0 : mUri.hashCode());
+      result = prime * result + (int) (id ^ (id >>> 32));
+      result = prime * result + requestedExtent;
+      result = prime * result + ((uri == null) ? 0 : uri.hashCode());
       return result;
     }
 
@@ -870,13 +870,13 @@
         return false;
       }
       final Request that = (Request) obj;
-      if (mId != that.mId) {
+      if (id != that.id) {
         return false;
       }
-      if (mRequestedExtent != that.mRequestedExtent) {
+      if (requestedExtent != that.requestedExtent) {
         return false;
       }
-      if (!UriUtils.areEqual(mUri, that.mUri)) {
+      if (!UriUtils.areEqual(uri, that.uri)) {
         return false;
       }
       // Don't compare equality of mDarkTheme because it is only used in the default contact
@@ -887,7 +887,7 @@
     }
 
     public Object getKey() {
-      return mUri == null ? mId : mUri;
+      return uri == null ? id : uri;
     }
 
     /**
@@ -903,16 +903,16 @@
 
       if (isCircular) {
         request =
-            ContactPhotoManager.isBusinessContactUri(mUri)
+            ContactPhotoManager.isBusinessContactUri(uri)
                 ? DefaultImageRequest.EMPTY_CIRCULAR_BUSINESS_IMAGE_REQUEST
                 : DefaultImageRequest.EMPTY_CIRCULAR_DEFAULT_IMAGE_REQUEST;
       } else {
         request =
-            ContactPhotoManager.isBusinessContactUri(mUri)
+            ContactPhotoManager.isBusinessContactUri(uri)
                 ? DefaultImageRequest.EMPTY_DEFAULT_BUSINESS_IMAGE_REQUEST
                 : DefaultImageRequest.EMPTY_DEFAULT_IMAGE_REQUEST;
       }
-      mDefaultProvider.applyDefaultImage(view, mRequestedExtent, mDarkTheme, request);
+      defaultProvider.applyDefaultImage(view, requestedExtent, darkTheme, request);
     }
   }
 
@@ -938,24 +938,24 @@
     private static final int PRELOAD_STATUS_NOT_STARTED = 0;
     private static final int PRELOAD_STATUS_IN_PROGRESS = 1;
     private static final int PRELOAD_STATUS_DONE = 2;
-    private final ContentResolver mResolver;
-    private final StringBuilder mStringBuilder = new StringBuilder();
-    private final Set<Long> mPhotoIds = new HashSet<>();
-    private final Set<String> mPhotoIdsAsStrings = new HashSet<>();
-    private final Set<Request> mPhotoUris = new HashSet<>();
-    private final List<Long> mPreloadPhotoIds = new ArrayList<>();
-    private Handler mLoaderThreadHandler;
-    private byte[] mBuffer;
-    private int mPreloadStatus = PRELOAD_STATUS_NOT_STARTED;
+    private final ContentResolver resolver;
+    private final StringBuilder stringBuilder = new StringBuilder();
+    private final Set<Long> photoIds = new HashSet<>();
+    private final Set<String> photoIdsAsStrings = new HashSet<>();
+    private final Set<Request> photoUris = new HashSet<>();
+    private final List<Long> preloadPhotoIds = new ArrayList<>();
+    private Handler loaderThreadHandler;
+    private byte[] buffer;
+    private int preloadStatus = PRELOAD_STATUS_NOT_STARTED;
 
     public LoaderThread(ContentResolver resolver) {
       super(LOADER_THREAD_NAME);
-      mResolver = resolver;
+      this.resolver = resolver;
     }
 
     public void ensureHandler() {
-      if (mLoaderThreadHandler == null) {
-        mLoaderThreadHandler = new Handler(getLooper(), this);
+      if (loaderThreadHandler == null) {
+        loaderThreadHandler = new Handler(getLooper(), this);
       }
     }
 
@@ -966,16 +966,16 @@
      * <p>If preloading is already complete, does nothing.
      */
     public void requestPreloading() {
-      if (mPreloadStatus == PRELOAD_STATUS_DONE) {
+      if (preloadStatus == PRELOAD_STATUS_DONE) {
         return;
       }
 
       ensureHandler();
-      if (mLoaderThreadHandler.hasMessages(MESSAGE_LOAD_PHOTOS)) {
+      if (loaderThreadHandler.hasMessages(MESSAGE_LOAD_PHOTOS)) {
         return;
       }
 
-      mLoaderThreadHandler.sendEmptyMessageDelayed(MESSAGE_PRELOAD_PHOTOS, PHOTO_PRELOAD_DELAY);
+      loaderThreadHandler.sendEmptyMessageDelayed(MESSAGE_PRELOAD_PHOTOS, PHOTO_PRELOAD_DELAY);
     }
 
     /**
@@ -984,8 +984,8 @@
      */
     public void requestLoading() {
       ensureHandler();
-      mLoaderThreadHandler.removeMessages(MESSAGE_PRELOAD_PHOTOS);
-      mLoaderThreadHandler.sendEmptyMessage(MESSAGE_LOAD_PHOTOS);
+      loaderThreadHandler.removeMessages(MESSAGE_PRELOAD_PHOTOS);
+      loaderThreadHandler.sendEmptyMessage(MESSAGE_LOAD_PHOTOS);
     }
 
     /**
@@ -1012,53 +1012,53 @@
      */
     @WorkerThread
     private void preloadPhotosInBackground() {
-      if (!PermissionsUtil.hasPermission(mContext, android.Manifest.permission.READ_CONTACTS)) {
+      if (!PermissionsUtil.hasPermission(context, android.Manifest.permission.READ_CONTACTS)) {
         return;
       }
 
-      if (mPreloadStatus == PRELOAD_STATUS_DONE) {
+      if (preloadStatus == PRELOAD_STATUS_DONE) {
         return;
       }
 
-      if (mPreloadStatus == PRELOAD_STATUS_NOT_STARTED) {
+      if (preloadStatus == PRELOAD_STATUS_NOT_STARTED) {
         queryPhotosForPreload();
-        if (mPreloadPhotoIds.isEmpty()) {
-          mPreloadStatus = PRELOAD_STATUS_DONE;
+        if (preloadPhotoIds.isEmpty()) {
+          preloadStatus = PRELOAD_STATUS_DONE;
         } else {
-          mPreloadStatus = PRELOAD_STATUS_IN_PROGRESS;
+          preloadStatus = PRELOAD_STATUS_IN_PROGRESS;
         }
         requestPreloading();
         return;
       }
 
-      if (mBitmapHolderCache.size() > mBitmapHolderCacheRedZoneBytes) {
-        mPreloadStatus = PRELOAD_STATUS_DONE;
+      if (bitmapHolderCache.size() > bitmapHolderCacheRedZoneBytes) {
+        preloadStatus = PRELOAD_STATUS_DONE;
         return;
       }
 
-      mPhotoIds.clear();
-      mPhotoIdsAsStrings.clear();
+      photoIds.clear();
+      photoIdsAsStrings.clear();
 
       int count = 0;
-      int preloadSize = mPreloadPhotoIds.size();
-      while (preloadSize > 0 && mPhotoIds.size() < PRELOAD_BATCH) {
+      int preloadSize = preloadPhotoIds.size();
+      while (preloadSize > 0 && photoIds.size() < PRELOAD_BATCH) {
         preloadSize--;
         count++;
-        Long photoId = mPreloadPhotoIds.get(preloadSize);
-        mPhotoIds.add(photoId);
-        mPhotoIdsAsStrings.add(photoId.toString());
-        mPreloadPhotoIds.remove(preloadSize);
+        Long photoId = preloadPhotoIds.get(preloadSize);
+        photoIds.add(photoId);
+        photoIdsAsStrings.add(photoId.toString());
+        preloadPhotoIds.remove(preloadSize);
       }
 
       loadThumbnails(true);
 
       if (preloadSize == 0) {
-        mPreloadStatus = PRELOAD_STATUS_DONE;
+        preloadStatus = PRELOAD_STATUS_DONE;
       }
 
       LogUtil.v(
           "ContactPhotoManagerImpl.preloadPhotosInBackground",
-          "preloaded " + count + " photos.  cached bytes: " + mBitmapHolderCache.size());
+          "preloaded " + count + " photos.  cached bytes: " + bitmapHolderCache.size());
 
       requestPreloading();
     }
@@ -1076,7 +1076,7 @@
                     ContactsContract.LIMIT_PARAM_KEY, String.valueOf(MAX_PHOTOS_TO_PRELOAD))
                 .build();
         cursor =
-            mResolver.query(
+            resolver.query(
                 uri,
                 new String[] {Contacts.PHOTO_ID},
                 Contacts.PHOTO_ID + " NOT NULL AND " + Contacts.PHOTO_ID + "!=0",
@@ -1087,7 +1087,7 @@
           while (cursor.moveToNext()) {
             // Insert them in reverse order, because we will be taking
             // them from the end of the list for loading.
-            mPreloadPhotoIds.add(0, cursor.getLong(0));
+            preloadPhotoIds.add(0, cursor.getLong(0));
           }
         }
       } finally {
@@ -1099,10 +1099,10 @@
 
     @WorkerThread
     private void loadPhotosInBackground() {
-      if (!PermissionsUtil.hasPermission(mContext, android.Manifest.permission.READ_CONTACTS)) {
+      if (!PermissionsUtil.hasPermission(context, android.Manifest.permission.READ_CONTACTS)) {
         return;
       }
-      obtainPhotoIdsAndUrisToLoad(mPhotoIds, mPhotoIdsAsStrings, mPhotoUris);
+      obtainPhotoIdsAndUrisToLoad(photoIds, photoIdsAsStrings, photoUris);
       loadThumbnails(false);
       loadUriBasedPhotos();
       requestPreloading();
@@ -1111,44 +1111,44 @@
     /** Loads thumbnail photos with ids */
     @WorkerThread
     private void loadThumbnails(boolean preloading) {
-      if (mPhotoIds.isEmpty()) {
+      if (photoIds.isEmpty()) {
         return;
       }
 
       // Remove loaded photos from the preload queue: we don't want
       // the preloading process to load them again.
-      if (!preloading && mPreloadStatus == PRELOAD_STATUS_IN_PROGRESS) {
-        for (Long id : mPhotoIds) {
-          mPreloadPhotoIds.remove(id);
+      if (!preloading && preloadStatus == PRELOAD_STATUS_IN_PROGRESS) {
+        for (Long id : photoIds) {
+          preloadPhotoIds.remove(id);
         }
-        if (mPreloadPhotoIds.isEmpty()) {
-          mPreloadStatus = PRELOAD_STATUS_DONE;
+        if (preloadPhotoIds.isEmpty()) {
+          preloadStatus = PRELOAD_STATUS_DONE;
         }
       }
 
-      mStringBuilder.setLength(0);
-      mStringBuilder.append(Photo._ID + " IN(");
-      for (int i = 0; i < mPhotoIds.size(); i++) {
+      stringBuilder.setLength(0);
+      stringBuilder.append(Photo._ID + " IN(");
+      for (int i = 0; i < photoIds.size(); i++) {
         if (i != 0) {
-          mStringBuilder.append(',');
+          stringBuilder.append(',');
         }
-        mStringBuilder.append('?');
+        stringBuilder.append('?');
       }
-      mStringBuilder.append(')');
+      stringBuilder.append(')');
 
       Cursor cursor = null;
       try {
         if (DEBUG) {
           LogUtil.d(
               "ContactPhotoManagerImpl.loadThumbnails",
-              "loading " + TextUtils.join(",", mPhotoIdsAsStrings));
+              "loading " + TextUtils.join(",", photoIdsAsStrings));
         }
         cursor =
-            mResolver.query(
+            resolver.query(
                 Data.CONTENT_URI,
                 COLUMNS,
-                mStringBuilder.toString(),
-                mPhotoIdsAsStrings.toArray(EMPTY_STRING_ARRAY),
+                stringBuilder.toString(),
+                photoIdsAsStrings.toArray(EMPTY_STRING_ARRAY),
                 null);
 
         if (cursor != null) {
@@ -1156,7 +1156,7 @@
             Long id = cursor.getLong(0);
             byte[] bytes = cursor.getBlob(1);
             cacheBitmap(id, bytes, preloading, -1);
-            mPhotoIds.remove(id);
+            photoIds.remove(id);
           }
         }
       } finally {
@@ -1166,12 +1166,12 @@
       }
 
       // Remaining photos were not found in the contacts database (but might be in profile).
-      for (Long id : mPhotoIds) {
+      for (Long id : photoIds) {
         if (ContactsContract.isProfileId(id)) {
           Cursor profileCursor = null;
           try {
             profileCursor =
-                mResolver.query(
+                resolver.query(
                     ContentUris.withAppendedId(Data.CONTENT_URI, id), COLUMNS, null, null, null);
             if (profileCursor != null && profileCursor.moveToFirst()) {
               cacheBitmap(profileCursor.getLong(0), profileCursor.getBlob(1), preloading, -1);
@@ -1190,7 +1190,7 @@
         }
       }
 
-      mMainThreadHandler.sendEmptyMessage(MESSAGE_PHOTOS_LOADED);
+      mainThreadHandler.sendEmptyMessage(MESSAGE_PHOTOS_LOADED);
     }
 
     /**
@@ -1199,7 +1199,7 @@
      */
     @WorkerThread
     private void loadUriBasedPhotos() {
-      for (Request uriRequest : mPhotoUris) {
+      for (Request uriRequest : photoUris) {
         // Keep the original URI and use this to key into the cache.  Failure to do so will
         // result in an image being continually reloaded into cache if the original URI
         // has a contact type encodedFragment (eg nearby places business photo URLs).
@@ -1209,8 +1209,8 @@
         // a business photo -- there is no need to pass this on to the server.
         Uri uri = ContactPhotoManager.removeContactType(originalUri);
 
-        if (mBuffer == null) {
-          mBuffer = new byte[BUFFER_SIZE];
+        if (buffer == null) {
+          buffer = new byte[BUFFER_SIZE];
         }
         try {
           if (DEBUG) {
@@ -1225,8 +1225,8 @@
                   (HttpURLConnection) new URL(uri.toString()).openConnection();
 
               // Include the user agent if it is specified.
-              if (!TextUtils.isEmpty(mUserAgent)) {
-                connection.setRequestProperty("User-Agent", mUserAgent);
+              if (!TextUtils.isEmpty(userAgent)) {
+                connection.setRequestProperty("User-Agent", userAgent);
               }
               try {
                 is = connection.getInputStream();
@@ -1238,20 +1238,20 @@
               TrafficStats.clearThreadStatsTag();
             }
           } else {
-            is = mResolver.openInputStream(uri);
+            is = resolver.openInputStream(uri);
           }
           if (is != null) {
             ByteArrayOutputStream baos = new ByteArrayOutputStream();
             try {
               int size;
-              while ((size = is.read(mBuffer)) != -1) {
-                baos.write(mBuffer, 0, size);
+              while ((size = is.read(buffer)) != -1) {
+                baos.write(buffer, 0, size);
               }
             } finally {
               is.close();
             }
             cacheBitmap(originalUri, baos.toByteArray(), false, uriRequest.getRequestedExtent());
-            mMainThreadHandler.sendEmptyMessage(MESSAGE_PHOTOS_LOADED);
+            mainThreadHandler.sendEmptyMessage(MESSAGE_PHOTOS_LOADED);
           } else {
             LogUtil.v("ContactPhotoManagerImpl.loadUriBasedPhotos", "cannot load photo " + uri);
             cacheBitmap(originalUri, null, false, uriRequest.getRequestedExtent());
diff --git a/java/com/android/dialer/database/CallLogQueryHandler.java b/java/com/android/dialer/database/CallLogQueryHandler.java
index 35250d6..1aa1251 100644
--- a/java/com/android/dialer/database/CallLogQueryHandler.java
+++ b/java/com/android/dialer/database/CallLogQueryHandler.java
@@ -66,10 +66,10 @@
   /** The token for the query to fetch the number of missed calls. */
   private static final int QUERY_MISSED_CALLS_UNREAD_COUNT_TOKEN = 59;
 
-  private final int mLogLimit;
-  private final WeakReference<Listener> mListener;
+  private final int logLimit;
+  private final WeakReference<Listener> listener;
 
-  private final Context mContext;
+  private final Context context;
 
   public CallLogQueryHandler(Context context, ContentResolver contentResolver, Listener listener) {
     this(context, contentResolver, listener, -1);
@@ -78,9 +78,9 @@
   public CallLogQueryHandler(
       Context context, ContentResolver contentResolver, Listener listener, int limit) {
     super(contentResolver);
-    mContext = context.getApplicationContext();
-    mListener = new WeakReference<>(listener);
-    mLogLimit = limit;
+    this.context = context.getApplicationContext();
+    this.listener = new WeakReference<>(listener);
+    logLimit = limit;
   }
 
   @Override
@@ -97,7 +97,7 @@
    */
   public void fetchCalls(int callType, long newerThan) {
     cancelFetch();
-    if (PermissionsUtil.hasPhonePermissions(mContext)) {
+    if (PermissionsUtil.hasPhonePermissions(context)) {
       fetchCalls(QUERY_CALLLOG_TOKEN, callType, false /* newOnly */, newerThan);
     } else {
       updateAdapterData(null);
@@ -108,11 +108,11 @@
     StringBuilder where = new StringBuilder();
     List<String> selectionArgs = new ArrayList<>();
 
-    VoicemailComponent.get(mContext)
+    VoicemailComponent.get(context)
         .getVoicemailClient()
-        .appendOmtpVoicemailStatusSelectionClause(mContext, where, selectionArgs);
+        .appendOmtpVoicemailStatusSelectionClause(context, where, selectionArgs);
 
-    if (TelecomUtil.hasReadWriteVoicemailPermissions(mContext)) {
+    if (TelecomUtil.hasReadWriteVoicemailPermissions(context)) {
       startQuery(
           QUERY_VOICEMAIL_STATUS_TOKEN,
           null,
@@ -125,15 +125,15 @@
   }
 
   public void fetchVoicemailUnreadCount() {
-    if (TelecomUtil.hasReadWriteVoicemailPermissions(mContext)) {
+    if (TelecomUtil.hasReadWriteVoicemailPermissions(context)) {
       // Only count voicemails that have not been read and have not been deleted.
       StringBuilder where =
           new StringBuilder(Voicemails.IS_READ + "=0" + " AND " + Voicemails.DELETED + "=0 ");
       List<String> selectionArgs = new ArrayList<>();
 
-      VoicemailComponent.get(mContext)
+      VoicemailComponent.get(context)
           .getVoicemailClient()
-          .appendOmtpVoicemailSelectionClause(mContext, where, selectionArgs);
+          .appendOmtpVoicemailSelectionClause(context, where, selectionArgs);
 
       startQuery(
           QUERY_VOICEMAIL_UNREAD_COUNT_TOKEN,
@@ -178,9 +178,9 @@
     }
 
     if (callType == Calls.VOICEMAIL_TYPE) {
-      VoicemailComponent.get(mContext)
+      VoicemailComponent.get(context)
           .getVoicemailClient()
-          .appendOmtpVoicemailSelectionClause(mContext, where, selectionArgs);
+          .appendOmtpVoicemailSelectionClause(context, where, selectionArgs);
     } else {
       // Filter out all Duo entries other than video calls
       where
@@ -197,10 +197,10 @@
           .append(")");
     }
 
-    final int limit = (mLogLimit == -1) ? NUM_LOGS_TO_DISPLAY : mLogLimit;
+    final int limit = (logLimit == -1) ? NUM_LOGS_TO_DISPLAY : logLimit;
     final String selection = where.length() > 0 ? where.toString() : null;
     Uri uri =
-        TelecomUtil.getCallLogUri(mContext)
+        TelecomUtil.getCallLogUri(context)
             .buildUpon()
             .appendQueryParameter(Calls.LIMIT_PARAM_KEY, Integer.toString(limit))
             .build();
@@ -221,7 +221,7 @@
 
   /** Updates all missed calls to mark them as read. */
   public void markMissedCallsAsRead() {
-    if (!PermissionsUtil.hasPhonePermissions(mContext)) {
+    if (!PermissionsUtil.hasPhonePermissions(context)) {
       return;
     }
 
@@ -239,7 +239,7 @@
 
   /** Fetch all missed calls received since last time the tab was opened. */
   public void fetchMissedCallsUnreadCount() {
-    if (!PermissionsUtil.hasPhonePermissions(mContext)) {
+    if (!PermissionsUtil.hasPhonePermissions(context)) {
       return;
     }
 
@@ -286,7 +286,7 @@
    * listener took ownership of the cursor.
    */
   private boolean updateAdapterData(Cursor cursor) {
-    final Listener listener = mListener.get();
+    final Listener listener = this.listener.get();
     return listener != null && listener.onCallsFetched(cursor);
   }
 
@@ -303,21 +303,21 @@
   }
 
   private void updateVoicemailStatus(Cursor statusCursor) {
-    final Listener listener = mListener.get();
+    final Listener listener = this.listener.get();
     if (listener != null) {
       listener.onVoicemailStatusFetched(statusCursor);
     }
   }
 
   private void updateVoicemailUnreadCount(Cursor statusCursor) {
-    final Listener listener = mListener.get();
+    final Listener listener = this.listener.get();
     if (listener != null) {
       listener.onVoicemailUnreadCountFetched(statusCursor);
     }
   }
 
   private void updateMissedCallsUnreadCount(Cursor statusCursor) {
-    final Listener listener = mListener.get();
+    final Listener listener = this.listener.get();
     if (listener != null) {
       listener.onMissedCallsUnreadCountFetched(statusCursor);
     }
diff --git a/java/com/android/dialer/database/DialerDatabaseHelper.java b/java/com/android/dialer/database/DialerDatabaseHelper.java
index 3fb8730..d12b4e8 100644
--- a/java/com/android/dialer/database/DialerDatabaseHelper.java
+++ b/java/com/android/dialer/database/DialerDatabaseHelper.java
@@ -78,16 +78,16 @@
   private static final String DATABASE_VERSION_PROPERTY = "database_version";
   private static final int MAX_ENTRIES = 20;
 
-  private final Context mContext;
-  private boolean mIsTestInstance = false;
+  private final Context context;
+  private boolean isTestInstance = false;
 
   protected DialerDatabaseHelper(Context context, String databaseName, int dbVersion) {
     super(context, databaseName, null, dbVersion);
-    mContext = Objects.requireNonNull(context, "Context must not be null");
+    this.context = Objects.requireNonNull(context, "Context must not be null");
   }
 
   public void setIsTestInstance(boolean isTestInstance) {
-    mIsTestInstance = isTestInstance;
+    this.isTestInstance = isTestInstance;
   }
 
   /**
@@ -188,7 +188,7 @@
             + ");");
 
     setProperty(db, DATABASE_VERSION_PROPERTY, String.valueOf(DATABASE_VERSION));
-    if (!mIsTestInstance) {
+    if (!isTestInstance) {
       resetSmartDialLastUpdatedTime();
     }
   }
@@ -325,7 +325,7 @@
 
   private void resetSmartDialLastUpdatedTime() {
     final SharedPreferences databaseLastUpdateSharedPref =
-        mContext.getSharedPreferences(DATABASE_LAST_CREATED_SHARED_PREF, Context.MODE_PRIVATE);
+        context.getSharedPreferences(DATABASE_LAST_CREATED_SHARED_PREF, Context.MODE_PRIVATE);
     final SharedPreferences.Editor editor = databaseLastUpdateSharedPref.edit();
     editor.putLong(LAST_UPDATED_MILLIS, 0);
     editor.apply();
@@ -333,8 +333,8 @@
 
   /** Starts the database upgrade process in the background. */
   public void startSmartDialUpdateThread() {
-    if (PermissionsUtil.hasContactsReadPermissions(mContext)) {
-      DialerExecutorComponent.get(mContext)
+    if (PermissionsUtil.hasContactsReadPermissions(context)) {
+      DialerExecutorComponent.get(context)
           .dialerExecutorFactory()
           .createNonUiTaskBuilder(new UpdateSmartDialWorker())
           .build()
@@ -373,7 +373,7 @@
   }
 
   private Cursor getDeletedContactCursor(String lastUpdateMillis) {
-    return mContext
+    return context
         .getContentResolver()
         .query(
             DeleteContactQuery.URI,
@@ -517,7 +517,7 @@
 
         final String displayName = updatedContactCursor.getString(PhoneQuery.PHONE_DISPLAY_NAME);
         if (displayName == null) {
-          insert.bindString(5, mContext.getResources().getString(R.string.missing_name));
+          insert.bindString(5, context.getResources().getString(R.string.missing_name));
         } else {
           insert.bindString(5, displayName);
         }
@@ -535,7 +535,7 @@
         insert.executeInsert();
         final String contactPhoneNumber = updatedContactCursor.getString(PhoneQuery.PHONE_NUMBER);
         final ArrayList<String> numberPrefixes =
-            SmartDialPrefix.parseToNumberTokens(mContext, contactPhoneNumber);
+            SmartDialPrefix.parseToNumberTokens(context, contactPhoneNumber);
 
         for (String numberPrefix : numberPrefixes) {
           numberInsert.bindLong(1, updatedContactCursor.getLong(PhoneQuery.PHONE_CONTACT_ID));
@@ -578,7 +578,7 @@
       while (nameCursor.moveToNext()) {
         /** Computes a list of prefixes of a given contact name. */
         final ArrayList<String> namePrefixes =
-            SmartDialPrefix.generateNamePrefixes(mContext, nameCursor.getString(columnIndexName));
+            SmartDialPrefix.generateNamePrefixes(context, nameCursor.getString(columnIndexName));
 
         for (String namePrefix : namePrefixes) {
           insert.bindLong(1, nameCursor.getLong(columnIndexContactId));
@@ -611,7 +611,7 @@
 
     /** Gets the last update time on the database. */
     final SharedPreferences databaseLastUpdateSharedPref =
-        mContext.getSharedPreferences(DATABASE_LAST_CREATED_SHARED_PREF, Context.MODE_PRIVATE);
+        context.getSharedPreferences(DATABASE_LAST_CREATED_SHARED_PREF, Context.MODE_PRIVATE);
     final String lastUpdateMillis =
         String.valueOf(databaseLastUpdateSharedPref.getLong(LAST_UPDATED_MILLIS, 0));
 
@@ -644,7 +644,7 @@
        * up in updatedPhoneCursor (since all of its phone numbers have been deleted).
        */
       final Cursor updatedContactCursor =
-          mContext
+          context
               .getContentResolver()
               .query(
                   UpdatedContactQuery.URI,
@@ -673,7 +673,7 @@
      * update time.
      */
     final Cursor updatedPhoneCursor =
-        mContext
+        context
             .getContentResolver()
             .query(
                 PhoneQuery.URI,
@@ -804,8 +804,8 @@
 
     // Notify content observers that smart dial database has been updated.
     Intent intent = new Intent(ACTION_SMART_DIAL_UPDATED);
-    intent.setPackage(mContext.getPackageName());
-    mContext.sendBroadcast(intent);
+    intent.setPackage(context.getPackageName());
+    context.sendBroadcast(intent);
   }
 
   /**
@@ -912,9 +912,9 @@
         /**
          * If the contact has either the name or number that matches the query, add to the result.
          */
-        final boolean nameMatches = nameMatcher.matches(mContext, displayName);
+        final boolean nameMatches = nameMatcher.matches(context, displayName);
         final boolean numberMatches =
-            (nameMatcher.matchesNumber(mContext, phoneNumber, query) != null);
+            (nameMatcher.matchesNumber(context, phoneNumber, query) != null);
         if (nameMatches || numberMatches) {
           /** If a contact has not been added, add it to the result and the hash set. */
           duplicates.add(contactMatch);
diff --git a/java/com/android/dialer/dialpadview/DialpadFragment.java b/java/com/android/dialer/dialpadview/DialpadFragment.java
index 4673d9e..0418009 100644
--- a/java/com/android/dialer/dialpadview/DialpadFragment.java
+++ b/java/com/android/dialer/dialpadview/DialpadFragment.java
@@ -137,45 +137,45 @@
 
   private static Optional<String> currentCountryIsoForTesting = Optional.absent();
 
-  private final Object mToneGeneratorLock = new Object();
+  private final Object toneGeneratorLock = new Object();
   /** Set of dialpad keys that are currently being pressed */
-  private final HashSet<View> mPressedDialpadKeys = new HashSet<>(12);
+  private final HashSet<View> pressedDialpadKeys = new HashSet<>(12);
 
-  private OnDialpadQueryChangedListener mDialpadQueryListener;
-  private DialpadView mDialpadView;
-  private EditText mDigits;
-  private int mDialpadSlideInDuration;
+  private OnDialpadQueryChangedListener dialpadQueryListener;
+  private DialpadView dialpadView;
+  private EditText digits;
+  private int dialpadSlideInDuration;
   /** Remembers if we need to clear digits field when the screen is completely gone. */
-  private boolean mClearDigitsOnStop;
+  private boolean clearDigitsOnStop;
 
-  private View mOverflowMenuButton;
-  private PopupMenu mOverflowPopupMenu;
-  private View mDelete;
-  private ToneGenerator mToneGenerator;
-  private FloatingActionButtonController mFloatingActionButtonController;
-  private FloatingActionButton mFloatingActionButton;
-  private ListView mDialpadChooser;
-  private DialpadChooserAdapter mDialpadChooserAdapter;
+  private View overflowMenuButton;
+  private PopupMenu overflowPopupMenu;
+  private View delete;
+  private ToneGenerator toneGenerator;
+  private FloatingActionButtonController floatingActionButtonController;
+  private FloatingActionButton floatingActionButton;
+  private ListView dialpadChooser;
+  private DialpadChooserAdapter dialpadChooserAdapter;
   /** Regular expression prohibiting manual phone call. Can be empty, which means "no rule". */
-  private String mProhibitedPhoneNumberRegexp;
+  private String prohibitedPhoneNumberRegexp;
 
-  private PseudoEmergencyAnimator mPseudoEmergencyAnimator;
-  private String mLastNumberDialed = EMPTY_NUMBER;
+  private PseudoEmergencyAnimator pseudoEmergencyAnimator;
+  private String lastNumberDialed = EMPTY_NUMBER;
 
   // determines if we want to playback local DTMF tones.
-  private boolean mDTMFToneEnabled;
-  private CallStateReceiver mCallStateReceiver;
-  private boolean mWasEmptyBeforeTextChange;
+  private boolean dTMFToneEnabled;
+  private CallStateReceiver callStateReceiver;
+  private boolean wasEmptyBeforeTextChange;
   /**
    * This field is set to true while processing an incoming DIAL intent, in order to make sure that
    * SpecialCharSequenceMgr actions can be triggered by user input but *not* by a tel: URI passed by
    * some other app. It will be set to false when all digits are cleared.
    */
-  private boolean mDigitsFilledByIntent;
+  private boolean digitsFilledByIntent;
 
-  private boolean mStartedFromNewIntent = false;
-  private boolean mFirstLaunch = false;
-  private boolean mAnimate = false;
+  private boolean startedFromNewIntent = false;
+  private boolean firstLaunch = false;
+  private boolean animate = false;
 
   private DialerExecutor<String> initPhoneNumberFormattingTextWatcherExecutor;
 
@@ -283,16 +283,16 @@
 
   @Override
   public void beforeTextChanged(CharSequence s, int start, int count, int after) {
-    mWasEmptyBeforeTextChange = TextUtils.isEmpty(s);
+    wasEmptyBeforeTextChange = TextUtils.isEmpty(s);
   }
 
   @Override
   public void onTextChanged(CharSequence input, int start, int before, int changeCount) {
-    if (mWasEmptyBeforeTextChange != TextUtils.isEmpty(input)) {
+    if (wasEmptyBeforeTextChange != TextUtils.isEmpty(input)) {
       final Activity activity = getActivity();
       if (activity != null) {
         activity.invalidateOptionsMenu();
-        updateMenuOverflowButton(mWasEmptyBeforeTextChange);
+        updateMenuOverflowButton(wasEmptyBeforeTextChange);
       }
     }
 
@@ -305,19 +305,19 @@
     // When DTMF dialpad buttons are being pressed, we delay SpecialCharSequenceMgr sequence,
     // since some of SpecialCharSequenceMgr's behavior is too abrupt for the "touch-down"
     // behavior.
-    if (!mDigitsFilledByIntent
-        && SpecialCharSequenceMgr.handleChars(getActivity(), input.toString(), mDigits)) {
+    if (!digitsFilledByIntent
+        && SpecialCharSequenceMgr.handleChars(getActivity(), input.toString(), digits)) {
       // A special sequence was entered, clear the digits
-      mDigits.getText().clear();
+      digits.getText().clear();
     }
 
     if (isDigitsEmpty()) {
-      mDigitsFilledByIntent = false;
-      mDigits.setCursorVisible(false);
+      digitsFilledByIntent = false;
+      digits.setCursorVisible(false);
     }
 
-    if (mDialpadQueryListener != null) {
-      mDialpadQueryListener.onDialpadQueryChanged(mDigits.getText().toString());
+    if (dialpadQueryListener != null) {
+      dialpadQueryListener.onDialpadQueryChanged(digits.getText().toString());
     }
 
     updateDeleteButtonEnabledState();
@@ -329,22 +329,22 @@
     LogUtil.enterBlock("DialpadFragment.onCreate");
     super.onCreate(state);
 
-    mFirstLaunch = state == null;
+    firstLaunch = state == null;
 
-    mProhibitedPhoneNumberRegexp =
+    prohibitedPhoneNumberRegexp =
         getResources().getString(R.string.config_prohibited_phone_number_regexp);
 
     if (state != null) {
-      mDigitsFilledByIntent = state.getBoolean(PREF_DIGITS_FILLED_BY_INTENT);
+      digitsFilledByIntent = state.getBoolean(PREF_DIGITS_FILLED_BY_INTENT);
     }
 
-    mDialpadSlideInDuration = getResources().getInteger(R.integer.dialpad_slide_in_duration);
+    dialpadSlideInDuration = getResources().getInteger(R.integer.dialpad_slide_in_duration);
 
-    if (mCallStateReceiver == null) {
+    if (callStateReceiver == null) {
       IntentFilter callStateIntentFilter =
           new IntentFilter(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
-      mCallStateReceiver = new CallStateReceiver();
-      getActivity().registerReceiver(mCallStateReceiver, callStateIntentFilter);
+      callStateReceiver = new CallStateReceiver();
+      getActivity().registerReceiver(callStateReceiver, callStateIntentFilter);
     }
 
     initPhoneNumberFormattingTextWatcherExecutor =
@@ -354,7 +354,7 @@
                 getFragmentManager(),
                 "DialpadFragment.initPhoneNumberFormattingTextWatcher",
                 new InitPhoneNumberFormattingTextWatcherWorker())
-            .onSuccess(watcher -> mDialpadView.getDigits().addTextChangedListener(watcher))
+            .onSuccess(watcher -> dialpadView.getDigits().addTextChangedListener(watcher))
             .build();
     Trace.endSection();
   }
@@ -372,15 +372,15 @@
 
     Trace.beginSection(TAG + " setup views");
 
-    mDialpadView = fragmentView.findViewById(R.id.dialpad_view);
-    mDialpadView.setCanDigitsBeEdited(true);
-    mDigits = mDialpadView.getDigits();
-    mDigits.setKeyListener(UnicodeDialerKeyListener.INSTANCE);
-    mDigits.setOnClickListener(this);
-    mDigits.setOnKeyListener(this);
-    mDigits.setOnLongClickListener(this);
-    mDigits.addTextChangedListener(this);
-    mDigits.setElegantTextHeight(false);
+    dialpadView = fragmentView.findViewById(R.id.dialpad_view);
+    dialpadView.setCanDigitsBeEdited(true);
+    digits = dialpadView.getDigits();
+    digits.setKeyListener(UnicodeDialerKeyListener.INSTANCE);
+    digits.setOnClickListener(this);
+    digits.setOnKeyListener(this);
+    digits.setOnLongClickListener(this);
+    digits.addTextChangedListener(this);
+    digits.setElegantTextHeight(false);
 
     initPhoneNumberFormattingTextWatcherExecutor.executeSerial(getCurrentCountryIso());
 
@@ -390,11 +390,11 @@
       configureKeypadListeners(fragmentView);
     }
 
-    mDelete = mDialpadView.getDeleteButton();
+    delete = dialpadView.getDeleteButton();
 
-    if (mDelete != null) {
-      mDelete.setOnClickListener(this);
-      mDelete.setOnLongClickListener(this);
+    if (delete != null) {
+      delete.setOnClickListener(this);
+      delete.setOnLongClickListener(this);
     }
 
     fragmentView
@@ -411,16 +411,16 @@
               return false;
             });
 
-    mDigits.setCursorVisible(false);
+    digits.setCursorVisible(false);
 
     // Set up the "dialpad chooser" UI; see showDialpadChooser().
-    mDialpadChooser = fragmentView.findViewById(R.id.dialpadChooser);
-    mDialpadChooser.setOnItemClickListener(this);
+    dialpadChooser = fragmentView.findViewById(R.id.dialpadChooser);
+    dialpadChooser.setOnItemClickListener(this);
 
-    mFloatingActionButton = fragmentView.findViewById(R.id.dialpad_floating_action_button);
-    mFloatingActionButton.setOnClickListener(this);
-    mFloatingActionButtonController =
-        new FloatingActionButtonController(getActivity(), mFloatingActionButton);
+    floatingActionButton = fragmentView.findViewById(R.id.dialpad_floating_action_button);
+    floatingActionButton.setOnClickListener(this);
+    floatingActionButtonController =
+        new FloatingActionButtonController(getActivity(), floatingActionButton);
     Trace.endSection();
     Trace.endSection();
     return fragmentView;
@@ -440,18 +440,18 @@
   }
 
   private boolean isLayoutReady() {
-    return mDigits != null;
+    return digits != null;
   }
 
   public EditText getDigitsWidget() {
-    return mDigits;
+    return digits;
   }
 
-  /** @return true when {@link #mDigits} is actually filled by the Intent. */
+  /** @return true when {@link #digits} is actually filled by the Intent. */
   private boolean fillDigitsIfNecessary(Intent intent) {
     // Only fills digits from an intent if it is a new intent.
     // Otherwise falls back to the previously used number.
-    if (!mFirstLaunch && !mStartedFromNewIntent) {
+    if (!firstLaunch && !startedFromNewIntent) {
       return false;
     }
 
@@ -463,7 +463,7 @@
           // Put the requested number into the input area
           String data = uri.getSchemeSpecificPart();
           // Remember it is filled via Intent.
-          mDigitsFilledByIntent = true;
+          digitsFilledByIntent = true;
           final String converted =
               PhoneNumberUtils.convertKeypadLettersToDigits(
                   PhoneNumberUtils.replaceUnicodeDigits(data));
@@ -489,7 +489,7 @@
               try {
                 if (c.moveToFirst()) {
                   // Remember it is filled via Intent.
-                  mDigitsFilledByIntent = true;
+                  digitsFilledByIntent = true;
                   // Put the number into the input area
                   setFormattedDigits(c.getString(0), c.getString(1));
                   return true;
@@ -550,7 +550,7 @@
     // i.e. User clicks a telephone link from gmail for example.
     // In this case, we want to show the dialpad with the phone number.
     boolean digitsFilled = fillDigitsIfNecessary(intent);
-    if (!(mStartedFromNewIntent && digitsFilled) && isPhoneInUse()) {
+    if (!(startedFromNewIntent && digitsFilled) && isPhoneInUse()) {
       // If there's already an active call, bring up an intermediate UI to
       // make the user confirm what they really want to do.
       LogUtil.i("DialpadFragment.configureScreenFromIntent", "Dialpad chooser mode");
@@ -565,7 +565,7 @@
   }
 
   public void setStartedFromNewIntent(boolean value) {
-    mStartedFromNewIntent = value;
+    startedFromNewIntent = value;
   }
 
   public void clearCallRateInformation() {
@@ -573,14 +573,14 @@
   }
 
   public void setCallRateInformation(String countryName, String displayRate) {
-    mDialpadView.setCallRateInformation(countryName, displayRate);
+    dialpadView.setCallRateInformation(countryName, displayRate);
   }
 
   /** Sets formatted digits to digits field. */
   private void setFormattedDigits(String data, String normalizedNumber) {
     final String formatted = getFormattedDigits(data, normalizedNumber, getCurrentCountryIso());
     if (!TextUtils.isEmpty(formatted)) {
-      Editable digits = mDigits.getText();
+      Editable digits = this.digits.getText();
       digits.replace(0, digits.length(), formatted);
       // for some reason this isn't getting called in the digits.replace call above..
       // but in any case, this will make sure the background drawable looks right
@@ -623,21 +623,21 @@
 
   @Override
   public void onStart() {
-    LogUtil.i("DialpadFragment.onStart", "first launch: %b", mFirstLaunch);
+    LogUtil.i("DialpadFragment.onStart", "first launch: %b", firstLaunch);
     Trace.beginSection(TAG + " onStart");
     super.onStart();
     // if the mToneGenerator creation fails, just continue without it.  It is
     // a local audio signal, and is not as important as the dtmf tone itself.
     final long start = System.currentTimeMillis();
-    synchronized (mToneGeneratorLock) {
-      if (mToneGenerator == null) {
+    synchronized (toneGeneratorLock) {
+      if (toneGenerator == null) {
         try {
-          mToneGenerator = new ToneGenerator(DIAL_TONE_STREAM_TYPE, TONE_RELATIVE_VOLUME);
+          toneGenerator = new ToneGenerator(DIAL_TONE_STREAM_TYPE, TONE_RELATIVE_VOLUME);
         } catch (RuntimeException e) {
           LogUtil.e(
               "DialpadFragment.onStart",
               "Exception caught while creating local tone generator: " + e);
-          mToneGenerator = null;
+          toneGenerator = null;
         }
       }
     }
@@ -659,11 +659,10 @@
     if (MotorolaUtils.isWifiCallingAvailable(getContext())) {
       iconId = R.drawable.ic_wifi_calling;
     }
-    mFloatingActionButtonController.changeIcon(
+    floatingActionButtonController.changeIcon(
         getContext(), iconId, res.getString(R.string.description_dial_button));
 
-    mDialpadQueryListener =
-        FragmentUtils.getParentUnsafe(this, OnDialpadQueryChangedListener.class);
+    dialpadQueryListener = FragmentUtils.getParentUnsafe(this, OnDialpadQueryChangedListener.class);
 
     final StopWatch stopWatch = StopWatch.start("Dialpad.onResume");
 
@@ -676,14 +675,14 @@
     final ContentResolver contentResolver = getActivity().getContentResolver();
 
     // retrieve the DTMF tone play back setting.
-    mDTMFToneEnabled =
+    dTMFToneEnabled =
         Settings.System.getInt(contentResolver, Settings.System.DTMF_TONE_WHEN_DIALING, 1) == 1;
 
     stopWatch.lap("dtwd");
 
     stopWatch.lap("hptc");
 
-    mPressedDialpadKeys.clear();
+    pressedDialpadKeys.clear();
 
     configureScreenFromIntent(getActivity().getIntent());
 
@@ -706,19 +705,19 @@
     // Populate the overflow menu in onResume instead of onCreate, so that if the SMS activity
     // is disabled while Dialer is paused, the "Send a text message" option can be correctly
     // removed when resumed.
-    mOverflowMenuButton = mDialpadView.getOverflowMenuButton();
-    mOverflowPopupMenu = buildOptionsMenu(mOverflowMenuButton);
-    mOverflowMenuButton.setOnTouchListener(mOverflowPopupMenu.getDragToOpenListener());
-    mOverflowMenuButton.setOnClickListener(this);
-    mOverflowMenuButton.setVisibility(isDigitsEmpty() ? View.INVISIBLE : View.VISIBLE);
+    overflowMenuButton = dialpadView.getOverflowMenuButton();
+    overflowPopupMenu = buildOptionsMenu(overflowMenuButton);
+    overflowMenuButton.setOnTouchListener(overflowPopupMenu.getDragToOpenListener());
+    overflowMenuButton.setOnClickListener(this);
+    overflowMenuButton.setVisibility(isDigitsEmpty() ? View.INVISIBLE : View.VISIBLE);
 
-    if (mFirstLaunch) {
+    if (firstLaunch) {
       // The onHiddenChanged callback does not get called the first time the fragment is
       // attached, so call it ourselves here.
       onHiddenChanged(false);
     }
 
-    mFirstLaunch = false;
+    firstLaunch = false;
     Trace.endSection();
   }
 
@@ -728,14 +727,14 @@
 
     // Make sure we don't leave this activity with a tone still playing.
     stopTone();
-    mPressedDialpadKeys.clear();
+    pressedDialpadKeys.clear();
 
     // TODO: I wonder if we should not check if the AsyncTask that
     // lookup the last dialed number has completed.
-    mLastNumberDialed = EMPTY_NUMBER; // Since we are going to query again, free stale number.
+    lastNumberDialed = EMPTY_NUMBER; // Since we are going to query again, free stale number.
 
     SpecialCharSequenceMgr.cleanup();
-    mOverflowPopupMenu.dismiss();
+    overflowPopupMenu.dismiss();
   }
 
   @Override
@@ -743,15 +742,15 @@
     LogUtil.enterBlock("DialpadFragment.onStop");
     super.onStop();
 
-    synchronized (mToneGeneratorLock) {
-      if (mToneGenerator != null) {
-        mToneGenerator.release();
-        mToneGenerator = null;
+    synchronized (toneGeneratorLock) {
+      if (toneGenerator != null) {
+        toneGenerator.release();
+        toneGenerator = null;
       }
     }
 
-    if (mClearDigitsOnStop) {
-      mClearDigitsOnStop = false;
+    if (clearDigitsOnStop) {
+      clearDigitsOnStop = false;
       clearDialpad();
     }
   }
@@ -759,17 +758,17 @@
   @Override
   public void onSaveInstanceState(Bundle outState) {
     super.onSaveInstanceState(outState);
-    outState.putBoolean(PREF_DIGITS_FILLED_BY_INTENT, mDigitsFilledByIntent);
+    outState.putBoolean(PREF_DIGITS_FILLED_BY_INTENT, digitsFilledByIntent);
   }
 
   @Override
   public void onDestroy() {
     super.onDestroy();
-    if (mPseudoEmergencyAnimator != null) {
-      mPseudoEmergencyAnimator.destroy();
-      mPseudoEmergencyAnimator = null;
+    if (pseudoEmergencyAnimator != null) {
+      pseudoEmergencyAnimator.destroy();
+      pseudoEmergencyAnimator = null;
     }
-    getActivity().unregisterReceiver(mCallStateReceiver);
+    getActivity().unregisterReceiver(callStateReceiver);
   }
 
   private void keyPressed(int keyCode) {
@@ -819,12 +818,12 @@
 
     getView().performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
     KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, keyCode);
-    mDigits.onKeyDown(keyCode, event);
+    digits.onKeyDown(keyCode, event);
 
     // If the cursor is at the end of the text we hide it.
-    final int length = mDigits.length();
-    if (length == mDigits.getSelectionStart() && length == mDigits.getSelectionEnd()) {
-      mDigits.setCursorVisible(false);
+    final int length = digits.length();
+    if (length == digits.getSelectionStart() && length == digits.getSelectionEnd()) {
+      digits.setCursorVisible(false);
     }
   }
 
@@ -877,10 +876,10 @@
         LogUtil.e(
             "DialpadFragment.onPressed", "Unexpected onTouch(ACTION_DOWN) event from: " + view);
       }
-      mPressedDialpadKeys.add(view);
+      pressedDialpadKeys.add(view);
     } else {
-      mPressedDialpadKeys.remove(view);
-      if (mPressedDialpadKeys.isEmpty()) {
+      pressedDialpadKeys.remove(view);
+      if (pressedDialpadKeys.isEmpty()) {
         stopTone();
       }
     }
@@ -925,10 +924,10 @@
       keyPressed(KeyEvent.KEYCODE_DEL);
     } else if (resId == R.id.digits) {
       if (!isDigitsEmpty()) {
-        mDigits.setCursorVisible(true);
+        digits.setCursorVisible(true);
       }
     } else if (resId == R.id.dialpad_overflow) {
-      mOverflowPopupMenu.show();
+      overflowPopupMenu.show();
     } else {
       LogUtil.w("DialpadFragment.onClick", "Unexpected event from: " + view);
     }
@@ -936,13 +935,13 @@
 
   @Override
   public boolean onLongClick(View view) {
-    final Editable digits = mDigits.getText();
+    final Editable digits = this.digits.getText();
     final int id = view.getId();
     if (id == R.id.deleteButton) {
       digits.clear();
       return true;
     } else if (id == R.id.one) {
-      if (isDigitsEmpty() || TextUtils.equals(mDigits.getText(), "1")) {
+      if (isDigitsEmpty() || TextUtils.equals(this.digits.getText(), "1")) {
         // We'll try to initiate voicemail and thus we want to remove irrelevant string.
         removePreviousDigitIfPossible('1');
 
@@ -981,7 +980,7 @@
       }
       return false;
     } else if (id == R.id.zero) {
-      if (mPressedDialpadKeys.contains(view)) {
+      if (pressedDialpadKeys.contains(view)) {
         // If the zero key is currently pressed, then the long press occurred by touch
         // (and not via other means like certain accessibility input methods).
         // Remove the '0' that was input when the key was first pressed.
@@ -989,10 +988,10 @@
       }
       keyPressed(KeyEvent.KEYCODE_PLUS);
       stopTone();
-      mPressedDialpadKeys.remove(view);
+      pressedDialpadKeys.remove(view);
       return true;
     } else if (id == R.id.digits) {
-      mDigits.setCursorVisible(true);
+      this.digits.setCursorVisible(true);
       return false;
     }
     return false;
@@ -1006,10 +1005,10 @@
    * @param digit to remove from the digits view.
    */
   private void removePreviousDigitIfPossible(char digit) {
-    final int currentPosition = mDigits.getSelectionStart();
-    if (currentPosition > 0 && digit == mDigits.getText().charAt(currentPosition - 1)) {
-      mDigits.setSelection(currentPosition);
-      mDigits.getText().delete(currentPosition - 1, currentPosition);
+    final int currentPosition = digits.getSelectionStart();
+    if (currentPosition > 0 && digit == digits.getText().charAt(currentPosition - 1)) {
+      digits.setSelection(currentPosition);
+      digits.getText().delete(currentPosition - 1, currentPosition);
     }
   }
 
@@ -1044,14 +1043,14 @@
       PerformanceReport.recordClick(UiAction.Type.PRESS_CALL_BUTTON_WITHOUT_CALLING);
       handleDialButtonClickWithEmptyDigits();
     } else {
-      final String number = mDigits.getText().toString();
+      final String number = digits.getText().toString();
 
       // "persist.radio.otaspdial" is a temporary hack needed for one carrier's automated
       // test equipment.
       // TODO: clean it up.
       if (number != null
-          && !TextUtils.isEmpty(mProhibitedPhoneNumberRegexp)
-          && number.matches(mProhibitedPhoneNumberRegexp)) {
+          && !TextUtils.isEmpty(prohibitedPhoneNumberRegexp)
+          && number.matches(prohibitedPhoneNumberRegexp)) {
         PerformanceReport.recordClick(UiAction.Type.PRESS_CALL_BUTTON_WITHOUT_CALLING);
         LogUtil.i(
             "DialpadFragment.handleDialButtonPressed",
@@ -1072,8 +1071,8 @@
   }
 
   public void clearDialpad() {
-    if (mDigits != null) {
-      mDigits.getText().clear();
+    if (digits != null) {
+      digits.getText().clear();
     }
   }
 
@@ -1086,13 +1085,13 @@
       // the redial feature.
       startActivity(newFlashIntent());
     } else {
-      if (!TextUtils.isEmpty(mLastNumberDialed)) {
+      if (!TextUtils.isEmpty(lastNumberDialed)) {
         // Dialpad will be filled with last called number,
         // but we don't want to record it as user action
         PerformanceReport.setIgnoreActionOnce(UiAction.Type.TEXT_CHANGE_WITH_INPUT);
 
         // Recall the last number dialed.
-        mDigits.setText(mLastNumberDialed);
+        digits.setText(lastNumberDialed);
 
         // ...and move the cursor to the end of the digits string,
         // so you'll be able to delete digits using the Delete
@@ -1102,7 +1101,7 @@
         // mLastNumberDialed.length(), since the EditText widget now
         // contains a *formatted* version of mLastNumberDialed (due to
         // mTextWatcher) and its length may have changed.
-        mDigits.setSelection(mDigits.getText().length());
+        digits.setSelection(digits.getText().length());
       } else {
         // There's no "last number dialed" or the
         // background query is still running. There's
@@ -1135,7 +1134,7 @@
    */
   private void playTone(int tone, int durationMs) {
     // if local tone playback is disabled, just return.
-    if (!mDTMFToneEnabled) {
+    if (!dTMFToneEnabled) {
       return;
     }
 
@@ -1152,29 +1151,29 @@
       return;
     }
 
-    synchronized (mToneGeneratorLock) {
-      if (mToneGenerator == null) {
+    synchronized (toneGeneratorLock) {
+      if (toneGenerator == null) {
         LogUtil.w("DialpadFragment.playTone", "mToneGenerator == null, tone: " + tone);
         return;
       }
 
       // Start the new tone (will stop any playing tone)
-      mToneGenerator.startTone(tone, durationMs);
+      toneGenerator.startTone(tone, durationMs);
     }
   }
 
   /** Stop the tone if it is played. */
   private void stopTone() {
     // if local tone playback is disabled, just return.
-    if (!mDTMFToneEnabled) {
+    if (!dTMFToneEnabled) {
       return;
     }
-    synchronized (mToneGeneratorLock) {
-      if (mToneGenerator == null) {
+    synchronized (toneGeneratorLock) {
+      if (toneGenerator == null) {
         LogUtil.w("DialpadFragment.stopTone", "mToneGenerator == null");
         return;
       }
-      mToneGenerator.stopTone();
+      toneGenerator.stopTone();
     }
   }
 
@@ -1202,48 +1201,48 @@
 
     if (enabled) {
       LogUtil.i("DialpadFragment.showDialpadChooser", "Showing dialpad chooser!");
-      if (mDialpadView != null) {
-        mDialpadView.setVisibility(View.GONE);
+      if (dialpadView != null) {
+        dialpadView.setVisibility(View.GONE);
       }
 
-      if (mOverflowPopupMenu != null) {
-        mOverflowPopupMenu.dismiss();
+      if (overflowPopupMenu != null) {
+        overflowPopupMenu.dismiss();
       }
 
-      mFloatingActionButtonController.scaleOut();
-      mDialpadChooser.setVisibility(View.VISIBLE);
+      floatingActionButtonController.scaleOut();
+      dialpadChooser.setVisibility(View.VISIBLE);
 
       // Instantiate the DialpadChooserAdapter and hook it up to the
       // ListView.  We do this only once.
-      if (mDialpadChooserAdapter == null) {
-        mDialpadChooserAdapter = new DialpadChooserAdapter(getActivity());
+      if (dialpadChooserAdapter == null) {
+        dialpadChooserAdapter = new DialpadChooserAdapter(getActivity());
       }
-      mDialpadChooser.setAdapter(mDialpadChooserAdapter);
+      dialpadChooser.setAdapter(dialpadChooserAdapter);
     } else {
       LogUtil.i("DialpadFragment.showDialpadChooser", "Displaying normal Dialer UI.");
-      if (mDialpadView != null) {
+      if (dialpadView != null) {
         LogUtil.i("DialpadFragment.showDialpadChooser", "mDialpadView not null");
-        mDialpadView.setVisibility(View.VISIBLE);
-        mFloatingActionButtonController.scaleIn();
+        dialpadView.setVisibility(View.VISIBLE);
+        floatingActionButtonController.scaleIn();
       } else {
         LogUtil.i("DialpadFragment.showDialpadChooser", "mDialpadView null");
-        mDigits.setVisibility(View.VISIBLE);
+        digits.setVisibility(View.VISIBLE);
       }
 
       // mFloatingActionButtonController must also be 'scaled in', in order to be visible after
       // 'scaleOut()' hidden method.
-      if (!mFloatingActionButtonController.isVisible()) {
+      if (!floatingActionButtonController.isVisible()) {
         // Just call 'scaleIn()' method if the mFloatingActionButtonController was not already
         // previously visible.
-        mFloatingActionButtonController.scaleIn();
+        floatingActionButtonController.scaleIn();
       }
-      mDialpadChooser.setVisibility(View.GONE);
+      dialpadChooser.setVisibility(View.GONE);
     }
   }
 
   /** @return true if we're currently showing the "dialpad chooser" UI. */
   private boolean isDialpadChooserVisible() {
-    return mDialpadChooser.getVisibility() == View.VISIBLE;
+    return dialpadChooser.getVisibility() == View.VISIBLE;
   }
 
   /** Handle clicks from the dialpad chooser. */
@@ -1310,7 +1309,7 @@
       updateDialString(WAIT);
       return true;
     } else if (resId == R.id.menu_call_with_note) {
-      CallSubjectDialog.start(getActivity(), mDigits.getText().toString());
+      CallSubjectDialog.start(getActivity(), digits.getText().toString());
       hideAndClearDialpad();
       return true;
     } else {
@@ -1330,24 +1329,24 @@
     int selectionEnd;
 
     // SpannableStringBuilder editable_text = new SpannableStringBuilder(mDigits.getText());
-    int anchor = mDigits.getSelectionStart();
-    int point = mDigits.getSelectionEnd();
+    int anchor = this.digits.getSelectionStart();
+    int point = this.digits.getSelectionEnd();
 
     selectionStart = Math.min(anchor, point);
     selectionEnd = Math.max(anchor, point);
 
     if (selectionStart == -1) {
-      selectionStart = selectionEnd = mDigits.length();
+      selectionStart = selectionEnd = this.digits.length();
     }
 
-    Editable digits = mDigits.getText();
+    Editable digits = this.digits.getText();
 
     if (canAddDigit(digits, selectionStart, selectionEnd, newDigit)) {
       digits.replace(selectionStart, selectionEnd, Character.toString(newDigit));
 
       if (selectionStart != selectionEnd) {
         // Unselect: back to a regular cursor, just pass the character inserted.
-        mDigits.setSelection(selectionStart + 1);
+        this.digits.setSelection(selectionStart + 1);
       }
     }
   }
@@ -1358,7 +1357,7 @@
       return;
     }
     final boolean digitsNotEmpty = !isDigitsEmpty();
-    mDelete.setEnabled(digitsNotEmpty);
+    delete.setEnabled(digitsNotEmpty);
   }
 
   /**
@@ -1369,11 +1368,11 @@
    * @param transitionIn True if transitioning in, False if transitioning out
    */
   private void updateMenuOverflowButton(boolean transitionIn) {
-    mOverflowMenuButton = mDialpadView.getOverflowMenuButton();
+    overflowMenuButton = dialpadView.getOverflowMenuButton();
     if (transitionIn) {
-      AnimUtils.fadeIn(mOverflowMenuButton, AnimUtils.DEFAULT_DURATION);
+      AnimUtils.fadeIn(overflowMenuButton, AnimUtils.DEFAULT_DURATION);
     } else {
-      AnimUtils.fadeOut(mOverflowMenuButton, AnimUtils.DEFAULT_DURATION);
+      AnimUtils.fadeOut(overflowMenuButton, AnimUtils.DEFAULT_DURATION);
     }
   }
 
@@ -1406,7 +1405,7 @@
 
   /** @return true if the widget with the phone number digits is empty. */
   private boolean isDigitsEmpty() {
-    return mDigits.length() == 0;
+    return digits.length() == 0;
   }
 
   /**
@@ -1415,7 +1414,7 @@
    * yet.
    */
   private void queryLastOutgoingCall() {
-    mLastNumberDialed = EMPTY_NUMBER;
+    lastNumberDialed = EMPTY_NUMBER;
     if (!PermissionsUtil.hasCallLogReadPermissions(getContext())) {
       return;
     }
@@ -1429,7 +1428,7 @@
               if (getActivity() == null) {
                 return;
               }
-              mLastNumberDialed = number;
+              lastNumberDialed = number;
               updateDeleteButtonEnabledState();
             });
   }
@@ -1447,30 +1446,30 @@
       return;
     }
     if (!hidden && !isDialpadChooserVisible()) {
-      if (mAnimate) {
-        mDialpadView.animateShow();
+      if (animate) {
+        dialpadView.animateShow();
       }
       ThreadUtil.getUiThreadHandler()
           .postDelayed(
               () -> {
                 if (!isDialpadChooserVisible()) {
-                  mFloatingActionButtonController.scaleIn();
+                  floatingActionButtonController.scaleIn();
                 }
               },
-              mAnimate ? mDialpadSlideInDuration : 0);
+              animate ? dialpadSlideInDuration : 0);
       FragmentUtils.getParentUnsafe(this, DialpadListener.class).onDialpadShown();
-      mDigits.requestFocus();
+      digits.requestFocus();
     } else if (hidden) {
-      mFloatingActionButtonController.scaleOut();
+      floatingActionButtonController.scaleOut();
     }
   }
 
   public boolean getAnimate() {
-    return mAnimate;
+    return animate;
   }
 
   public void setAnimate(boolean value) {
-    mAnimate = value;
+    animate = value;
   }
 
   public void setYFraction(float yFraction) {
@@ -1478,21 +1477,21 @@
   }
 
   public int getDialpadHeight() {
-    if (mDialpadView == null) {
+    if (dialpadView == null) {
       return 0;
     }
-    return mDialpadView.getHeight();
+    return dialpadView.getHeight();
   }
 
   public void process_quote_emergency_unquote(String query) {
     if (PseudoEmergencyAnimator.PSEUDO_EMERGENCY_NUMBER.equals(query)) {
-      if (mPseudoEmergencyAnimator == null) {
-        mPseudoEmergencyAnimator =
+      if (pseudoEmergencyAnimator == null) {
+        pseudoEmergencyAnimator =
             new PseudoEmergencyAnimator(
                 new PseudoEmergencyAnimator.ViewProvider() {
                   @Override
                   public View getFab() {
-                    return mFloatingActionButton;
+                    return floatingActionButton;
                   }
 
                   @Override
@@ -1501,10 +1500,10 @@
                   }
                 });
       }
-      mPseudoEmergencyAnimator.start();
+      pseudoEmergencyAnimator.start();
     } else {
-      if (mPseudoEmergencyAnimator != null) {
-        mPseudoEmergencyAnimator.end();
+      if (pseudoEmergencyAnimator != null) {
+        pseudoEmergencyAnimator.end();
       }
     }
   }
@@ -1561,8 +1560,8 @@
 
     private static final String ARG_TITLE_RES_ID = "argTitleResId";
     private static final String ARG_MESSAGE_RES_ID = "argMessageResId";
-    private int mTitleResId;
-    private int mMessageResId;
+    private int titleResId;
+    private int messageResId;
 
     public static ErrorDialogFragment newInstance(int messageResId) {
       return newInstance(0, messageResId);
@@ -1580,18 +1579,18 @@
     @Override
     public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
-      mTitleResId = getArguments().getInt(ARG_TITLE_RES_ID);
-      mMessageResId = getArguments().getInt(ARG_MESSAGE_RES_ID);
+      titleResId = getArguments().getInt(ARG_TITLE_RES_ID);
+      messageResId = getArguments().getInt(ARG_MESSAGE_RES_ID);
     }
 
     @Override
     public Dialog onCreateDialog(Bundle savedInstanceState) {
       AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
-      if (mTitleResId != 0) {
-        builder.setTitle(mTitleResId);
+      if (titleResId != 0) {
+        builder.setTitle(titleResId);
       }
-      if (mMessageResId != 0) {
-        builder.setMessage(mMessageResId);
+      if (messageResId != 0) {
+        builder.setMessage(messageResId);
       }
       builder.setPositiveButton(android.R.string.ok, (dialog, which) -> dismiss());
       return builder.create();
@@ -1609,18 +1608,18 @@
     static final int DIALPAD_CHOICE_RETURN_TO_CALL = 102;
     static final int DIALPAD_CHOICE_ADD_NEW_CALL = 103;
     private static final int NUM_ITEMS = 3;
-    private LayoutInflater mInflater;
-    private ChoiceItem[] mChoiceItems = new ChoiceItem[NUM_ITEMS];
+    private LayoutInflater inflater;
+    private ChoiceItem[] choiceItems = new ChoiceItem[NUM_ITEMS];
 
     DialpadChooserAdapter(Context context) {
       // Cache the LayoutInflate to avoid asking for a new one each time.
-      mInflater = LayoutInflater.from(context);
+      inflater = LayoutInflater.from(context);
 
       // Initialize the possible choices.
       // TODO: could this be specified entirely in XML?
 
       // - "Use touch tone keypad"
-      mChoiceItems[0] =
+      choiceItems[0] =
           new ChoiceItem(
               context.getString(R.string.dialer_useDtmfDialpad),
               BitmapFactory.decodeResource(
@@ -1628,7 +1627,7 @@
               DIALPAD_CHOICE_USE_DTMF_DIALPAD);
 
       // - "Return to call in progress"
-      mChoiceItems[1] =
+      choiceItems[1] =
           new ChoiceItem(
               context.getString(R.string.dialer_returnToInCallScreen),
               BitmapFactory.decodeResource(
@@ -1636,7 +1635,7 @@
               DIALPAD_CHOICE_RETURN_TO_CALL);
 
       // - "Add call"
-      mChoiceItems[2] =
+      choiceItems[2] =
           new ChoiceItem(
               context.getString(R.string.dialer_addAnotherCall),
               BitmapFactory.decodeResource(
@@ -1652,7 +1651,7 @@
     /** Return the ChoiceItem for a given position. */
     @Override
     public Object getItem(int position) {
-      return mChoiceItems[position];
+      return choiceItems[position];
     }
 
     /** Return a unique ID for each possible choice. */
@@ -1667,14 +1666,14 @@
       // When convertView is non-null, we can reuse it (there's no need
       // to reinflate it.)
       if (convertView == null) {
-        convertView = mInflater.inflate(R.layout.dialpad_chooser_list_item, null);
+        convertView = inflater.inflate(R.layout.dialpad_chooser_list_item, null);
       }
 
       TextView text = convertView.findViewById(R.id.text);
-      text.setText(mChoiceItems[position].text);
+      text.setText(choiceItems[position].text);
 
       ImageView icon = convertView.findViewById(R.id.icon);
-      icon.setImageBitmap(mChoiceItems[position].icon);
+      icon.setImageBitmap(choiceItems[position].icon);
 
       return convertView;
     }
diff --git a/java/com/android/dialer/dialpadview/DialpadKeyButton.java b/java/com/android/dialer/dialpadview/DialpadKeyButton.java
index 0c842eb..84aca14 100644
--- a/java/com/android/dialer/dialpadview/DialpadKeyButton.java
+++ b/java/com/android/dialer/dialpadview/DialpadKeyButton.java
@@ -49,30 +49,30 @@
   private static final int LONG_HOVER_TIMEOUT = ViewConfiguration.getLongPressTimeout() * 2;
 
   /** Accessibility manager instance used to check touch exploration state. */
-  private AccessibilityManager mAccessibilityManager;
+  private AccessibilityManager accessibilityManager;
 
   /** Bounds used to filter HOVER_EXIT events. */
-  private RectF mHoverBounds = new RectF();
+  private RectF hoverBounds = new RectF();
 
   /** Whether this view is currently in the long-hover state. */
-  private boolean mLongHovered;
+  private boolean longHovered;
 
   /** Alternate content description for long-hover state. */
-  private CharSequence mLongHoverContentDesc;
+  private CharSequence longHoverContentDesc;
 
   /** Backup of standard content description. Used for accessibility. */
-  private CharSequence mBackupContentDesc;
+  private CharSequence backupContentDesc;
 
   /** Backup of clickable property. Used for accessibility. */
-  private boolean mWasClickable;
+  private boolean wasClickable;
 
   /** Backup of long-clickable property. Used for accessibility. */
-  private boolean mWasLongClickable;
+  private boolean wasLongClickable;
 
   /** Runnable used to trigger long-click mode for accessibility. */
-  private Runnable mLongHoverRunnable;
+  private Runnable longHoverRunnable;
 
-  private OnPressedListener mOnPressedListener;
+  private OnPressedListener onPressedListener;
 
   public DialpadKeyButton(Context context, AttributeSet attrs) {
     super(context, attrs);
@@ -85,26 +85,26 @@
   }
 
   public void setOnPressedListener(OnPressedListener onPressedListener) {
-    mOnPressedListener = onPressedListener;
+    this.onPressedListener = onPressedListener;
   }
 
   private void initForAccessibility(Context context) {
-    mAccessibilityManager =
+    accessibilityManager =
         (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE);
   }
 
   public void setLongHoverContentDescription(CharSequence contentDescription) {
-    mLongHoverContentDesc = contentDescription;
+    longHoverContentDesc = contentDescription;
 
-    if (mLongHovered) {
-      super.setContentDescription(mLongHoverContentDesc);
+    if (longHovered) {
+      super.setContentDescription(longHoverContentDesc);
     }
   }
 
   @Override
   public void setContentDescription(CharSequence contentDescription) {
-    if (mLongHovered) {
-      mBackupContentDesc = contentDescription;
+    if (longHovered) {
+      backupContentDesc = contentDescription;
     } else {
       super.setContentDescription(contentDescription);
     }
@@ -113,8 +113,8 @@
   @Override
   public void setPressed(boolean pressed) {
     super.setPressed(pressed);
-    if (mOnPressedListener != null) {
-      mOnPressedListener.onPressed(this, pressed);
+    if (onPressedListener != null) {
+      onPressedListener.onPressed(this, pressed);
     }
   }
 
@@ -122,10 +122,10 @@
   public void onSizeChanged(int w, int h, int oldw, int oldh) {
     super.onSizeChanged(w, h, oldw, oldh);
 
-    mHoverBounds.left = getPaddingLeft();
-    mHoverBounds.right = w - getPaddingRight();
-    mHoverBounds.top = getPaddingTop();
-    mHoverBounds.bottom = h - getPaddingBottom();
+    hoverBounds.left = getPaddingLeft();
+    hoverBounds.right = w - getPaddingRight();
+    hoverBounds.top = getPaddingTop();
+    hoverBounds.bottom = h - getPaddingBottom();
   }
 
   @Override
@@ -142,37 +142,37 @@
   public boolean onHoverEvent(MotionEvent event) {
     // When touch exploration is turned on, lifting a finger while inside
     // the button's hover target bounds should perform a click action.
-    if (mAccessibilityManager.isEnabled() && mAccessibilityManager.isTouchExplorationEnabled()) {
+    if (accessibilityManager.isEnabled() && accessibilityManager.isTouchExplorationEnabled()) {
       switch (event.getActionMasked()) {
         case MotionEvent.ACTION_HOVER_ENTER:
           // Lift-to-type temporarily disables double-tap activation.
-          mWasClickable = isClickable();
-          mWasLongClickable = isLongClickable();
-          if (mWasLongClickable && mLongHoverContentDesc != null) {
-            if (mLongHoverRunnable == null) {
-              mLongHoverRunnable =
+          wasClickable = isClickable();
+          wasLongClickable = isLongClickable();
+          if (wasLongClickable && longHoverContentDesc != null) {
+            if (longHoverRunnable == null) {
+              longHoverRunnable =
                   new Runnable() {
                     @Override
                     public void run() {
                       setLongHovered(true);
-                      announceForAccessibility(mLongHoverContentDesc);
+                      announceForAccessibility(longHoverContentDesc);
                     }
                   };
             }
-            postDelayed(mLongHoverRunnable, LONG_HOVER_TIMEOUT);
+            postDelayed(longHoverRunnable, LONG_HOVER_TIMEOUT);
           }
 
           setClickable(false);
           setLongClickable(false);
           break;
         case MotionEvent.ACTION_HOVER_EXIT:
-          if (mHoverBounds.contains(event.getX(), event.getY())) {
+          if (hoverBounds.contains(event.getX(), event.getY())) {
             simulateClickForAccessibility();
           }
 
           cancelLongHover();
-          setClickable(mWasClickable);
-          setLongClickable(mWasLongClickable);
+          setClickable(wasClickable);
+          setLongClickable(wasLongClickable);
           break;
         default: // No-op
           break;
@@ -202,22 +202,22 @@
   }
 
   private void setLongHovered(boolean enabled) {
-    if (mLongHovered != enabled) {
-      mLongHovered = enabled;
+    if (longHovered != enabled) {
+      longHovered = enabled;
 
       // Switch between normal and alternate description, if available.
       if (enabled) {
-        mBackupContentDesc = getContentDescription();
-        super.setContentDescription(mLongHoverContentDesc);
+        backupContentDesc = getContentDescription();
+        super.setContentDescription(longHoverContentDesc);
       } else {
-        super.setContentDescription(mBackupContentDesc);
+        super.setContentDescription(backupContentDesc);
       }
     }
   }
 
   private void cancelLongHover() {
-    if (mLongHoverRunnable != null) {
-      removeCallbacks(mLongHoverRunnable);
+    if (longHoverRunnable != null) {
+      removeCallbacks(longHoverRunnable);
     }
     setLongHovered(false);
   }
diff --git a/java/com/android/dialer/dialpadview/DialpadTextView.java b/java/com/android/dialer/dialpadview/DialpadTextView.java
index b1eee4b..9607195 100644
--- a/java/com/android/dialer/dialpadview/DialpadTextView.java
+++ b/java/com/android/dialer/dialpadview/DialpadTextView.java
@@ -33,8 +33,8 @@
  */
 public class DialpadTextView extends TextView {
 
-  private Rect mTextBounds = new Rect();
-  private String mTextStr;
+  private Rect textBounds = new Rect();
+  private String textStr;
 
   public DialpadTextView(Context context, AttributeSet attrs) {
     super(context, attrs);
@@ -51,7 +51,7 @@
     // The text bounds values are relative and can be negative,, so rather than specifying a
     // standard origin such as 0, 0, we need to use negative of the left/top bounds.
     // For example, the bounds may be: Left: 11, Right: 37, Top: -77, Bottom: 0
-    canvas.drawText(mTextStr, -mTextBounds.left, -mTextBounds.top, paint);
+    canvas.drawText(textStr, -textBounds.left, -textBounds.top, paint);
   }
 
   /**
@@ -61,11 +61,11 @@
   @Override
   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
     super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-    mTextStr = getText().toString();
-    getPaint().getTextBounds(mTextStr, 0, mTextStr.length(), mTextBounds);
+    textStr = getText().toString();
+    getPaint().getTextBounds(textStr, 0, textStr.length(), textBounds);
 
-    int width = resolveSize(mTextBounds.width(), widthMeasureSpec);
-    int height = resolveSize(mTextBounds.height(), heightMeasureSpec);
+    int width = resolveSize(textBounds.width(), widthMeasureSpec);
+    int height = resolveSize(textBounds.height(), heightMeasureSpec);
     setMeasuredDimension(width, height);
   }
 }
diff --git a/java/com/android/dialer/dialpadview/DialpadView.java b/java/com/android/dialer/dialpadview/DialpadView.java
index 7b95ba7..58ba233 100644
--- a/java/com/android/dialer/dialpadview/DialpadView.java
+++ b/java/com/android/dialer/dialpadview/DialpadView.java
@@ -73,21 +73,21 @@
         R.id.pound
       };
 
-  private final AttributeSet mAttributeSet;
-  private final ColorStateList mRippleColor;
-  private final OnPreDrawListenerForKeyLayoutAdjust mOnPreDrawListenerForKeyLayoutAdjust;
-  private final String[] mPrimaryLettersMapping;
-  private final String[] mSecondaryLettersMapping;
-  private final boolean mIsRtl; // whether the dialpad is shown in a right-to-left locale
-  private final int mTranslateDistance;
+  private final AttributeSet attributeSet;
+  private final ColorStateList rippleColor;
+  private final OnPreDrawListenerForKeyLayoutAdjust onPreDrawListenerForKeyLayoutAdjust;
+  private final String[] primaryLettersMapping;
+  private final String[] secondaryLettersMapping;
+  private final boolean isRtl; // whether the dialpad is shown in a right-to-left locale
+  private final int translateDistance;
 
-  private EditText mDigits;
-  private ImageButton mDelete;
-  private View mOverflowMenuButton;
-  private ViewGroup mRateContainer;
-  private TextView mIldCountry;
-  private TextView mIldRate;
-  private boolean mIsLandscapeMode;
+  private EditText digits;
+  private ImageButton delete;
+  private View overflowMenuButton;
+  private ViewGroup rateContainer;
+  private TextView ildCountry;
+  private TextView ildRate;
+  private boolean isLandscapeMode;
 
   public DialpadView(Context context) {
     this(context, null);
@@ -99,27 +99,27 @@
 
   public DialpadView(Context context, AttributeSet attrs, int defStyle) {
     super(context, attrs, defStyle);
-    mAttributeSet = attrs;
+    attributeSet = attrs;
 
     TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.Dialpad);
-    mRippleColor = a.getColorStateList(R.styleable.Dialpad_dialpad_key_button_touch_tint);
+    rippleColor = a.getColorStateList(R.styleable.Dialpad_dialpad_key_button_touch_tint);
     a.recycle();
 
-    mTranslateDistance =
+    translateDistance =
         getResources().getDimensionPixelSize(R.dimen.dialpad_key_button_translate_y);
-    mIsRtl =
+    isRtl =
         TextUtils.getLayoutDirectionFromLocale(Locale.getDefault()) == View.LAYOUT_DIRECTION_RTL;
 
-    mPrimaryLettersMapping = DialpadCharMappings.getDefaultKeyToCharsMap();
-    mSecondaryLettersMapping = DialpadCharMappings.getKeyToCharsMap(context);
+    primaryLettersMapping = DialpadCharMappings.getDefaultKeyToCharsMap();
+    secondaryLettersMapping = DialpadCharMappings.getKeyToCharsMap(context);
 
-    mOnPreDrawListenerForKeyLayoutAdjust = new OnPreDrawListenerForKeyLayoutAdjust();
+    onPreDrawListenerForKeyLayoutAdjust = new OnPreDrawListenerForKeyLayoutAdjust();
   }
 
   @Override
   protected void onDetachedFromWindow() {
     super.onDetachedFromWindow();
-    getViewTreeObserver().removeOnPreDrawListener(mOnPreDrawListenerForKeyLayoutAdjust);
+    getViewTreeObserver().removeOnPreDrawListener(onPreDrawListenerForKeyLayoutAdjust);
   }
 
   @Override
@@ -129,28 +129,28 @@
     // The orientation obtained at this point should be used as the only truth for DialpadView as we
     // observed inconsistency between configurations obtained here and in
     // OnPreDrawListenerForKeyLayoutAdjust under rare circumstances.
-    mIsLandscapeMode =
+    isLandscapeMode =
         (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE);
 
     setupKeypad();
-    mDigits = (EditText) findViewById(R.id.digits);
-    mDelete = (ImageButton) findViewById(R.id.deleteButton);
-    mOverflowMenuButton = findViewById(R.id.dialpad_overflow);
-    mRateContainer = (ViewGroup) findViewById(R.id.rate_container);
-    mIldCountry = (TextView) mRateContainer.findViewById(R.id.ild_country);
-    mIldRate = (TextView) mRateContainer.findViewById(R.id.ild_rate);
+    digits = (EditText) findViewById(R.id.digits);
+    delete = (ImageButton) findViewById(R.id.deleteButton);
+    overflowMenuButton = findViewById(R.id.dialpad_overflow);
+    rateContainer = (ViewGroup) findViewById(R.id.rate_container);
+    ildCountry = (TextView) rateContainer.findViewById(R.id.ild_country);
+    ildRate = (TextView) rateContainer.findViewById(R.id.ild_rate);
 
     AccessibilityManager accessibilityManager =
         (AccessibilityManager) getContext().getSystemService(Context.ACCESSIBILITY_SERVICE);
     if (accessibilityManager.isEnabled()) {
       // The text view must be selected to send accessibility events.
-      mDigits.setSelected(true);
+      digits.setSelected(true);
     }
 
     // As OnPreDrawListenerForKeyLayoutAdjust makes changes to LayoutParams, it is added here to
     // ensure it can only be triggered after the layout is inflated.
-    getViewTreeObserver().removeOnPreDrawListener(mOnPreDrawListenerForKeyLayoutAdjust);
-    getViewTreeObserver().addOnPreDrawListener(mOnPreDrawListenerForKeyLayoutAdjust);
+    getViewTreeObserver().removeOnPreDrawListener(onPreDrawListenerForKeyLayoutAdjust);
+    getViewTreeObserver().addOnPreDrawListener(onPreDrawListenerForKeyLayoutAdjust);
   }
 
   private void setupKeypad() {
@@ -174,7 +174,7 @@
         // The content description is used for Talkback key presses. The number is
         // separated by a "," to introduce a slight delay. Convert letters into a verbatim
         // span so that they are read as letters instead of as one word.
-        String letters = mPrimaryLettersMapping[i];
+        String letters = primaryLettersMapping[i];
         Spannable spannable =
             Spannable.Factory.getInstance().newSpannable(numberString + "," + letters);
         spannable.setSpan(
@@ -187,8 +187,8 @@
 
       final RippleDrawable rippleBackground =
           (RippleDrawable) getContext().getDrawable(R.drawable.btn_dialpad_key);
-      if (mRippleColor != null) {
-        rippleBackground.setColor(mRippleColor);
+      if (rippleColor != null) {
+        rippleBackground.setColor(rippleColor);
       }
 
       numberView.setText(numberString);
@@ -200,20 +200,20 @@
       TextView secondaryLettersView =
           (TextView) dialpadKey.findViewById(R.id.dialpad_key_secondary_letters);
       if (primaryLettersView != null) {
-        primaryLettersView.setText(mPrimaryLettersMapping[i]);
+        primaryLettersView.setText(primaryLettersMapping[i]);
       }
       if (primaryLettersView != null && secondaryLettersView != null) {
-        if (mSecondaryLettersMapping == null) {
+        if (secondaryLettersMapping == null) {
           secondaryLettersView.setVisibility(View.GONE);
         } else {
           secondaryLettersView.setVisibility(View.VISIBLE);
-          secondaryLettersView.setText(mSecondaryLettersMapping[i]);
+          secondaryLettersView.setText(secondaryLettersMapping[i]);
 
           // Adjust the font size of the letters if a secondary alphabet is available.
           TypedArray a =
               getContext()
                   .getTheme()
-                  .obtainStyledAttributes(mAttributeSet, R.styleable.Dialpad, 0, 0);
+                  .obtainStyledAttributes(attributeSet, R.styleable.Dialpad, 0, 0);
           int textSize =
               a.getDimensionPixelSize(
                   R.styleable.Dialpad_dialpad_key_letters_size_for_dual_alphabets, 0);
@@ -260,12 +260,12 @@
 
   public void setCallRateInformation(String countryName, String displayRate) {
     if (TextUtils.isEmpty(countryName) && TextUtils.isEmpty(displayRate)) {
-      mRateContainer.setVisibility(View.GONE);
+      rateContainer.setVisibility(View.GONE);
       return;
     }
-    mRateContainer.setVisibility(View.VISIBLE);
-    mIldCountry.setText(countryName);
-    mIldRate.setText(displayRate);
+    rateContainer.setVisibility(View.VISIBLE);
+    ildCountry.setText(countryName);
+    ildRate.setText(displayRate);
   }
 
   /**
@@ -288,14 +288,14 @@
       final DialpadKeyButton dialpadKey = (DialpadKeyButton) findViewById(BUTTON_IDS[i]);
 
       ViewPropertyAnimator animator = dialpadKey.animate();
-      if (mIsLandscapeMode) {
+      if (isLandscapeMode) {
         // Landscape orientation requires translation along the X axis.
         // For RTL locales, ensure we translate negative on the X axis.
-        dialpadKey.setTranslationX((mIsRtl ? -1 : 1) * mTranslateDistance);
+        dialpadKey.setTranslationX((isRtl ? -1 : 1) * translateDistance);
         animator.translationX(0);
       } else {
         // Portrait orientation requires translation along the Y axis.
-        dialpadKey.setTranslationY(mTranslateDistance);
+        dialpadKey.setTranslationY(translateDistance);
         animator.translationY(0);
       }
       animator
@@ -308,15 +308,15 @@
   }
 
   public EditText getDigits() {
-    return mDigits;
+    return digits;
   }
 
   public ImageButton getDeleteButton() {
-    return mDelete;
+    return delete;
   }
 
   public View getOverflowMenuButton() {
-    return mOverflowMenuButton;
+    return overflowMenuButton;
   }
 
   /**
@@ -327,8 +327,8 @@
    * @return The animation delay.
    */
   private int getKeyButtonAnimationDelay(int buttonId) {
-    if (mIsLandscapeMode) {
-      if (mIsRtl) {
+    if (isLandscapeMode) {
+      if (isRtl) {
         if (buttonId == R.id.three) {
           return KEY_FRAME_DURATION * 1;
         } else if (buttonId == R.id.six) {
@@ -415,8 +415,8 @@
    * @return The animation duration.
    */
   private int getKeyButtonAnimationDuration(int buttonId) {
-    if (mIsLandscapeMode) {
-      if (mIsRtl) {
+    if (isLandscapeMode) {
+      if (isRtl) {
         if (buttonId == R.id.one
             || buttonId == R.id.four
             || buttonId == R.id.seven
@@ -528,7 +528,7 @@
     }
 
     private boolean shouldAdjustKeySizes() {
-      return mIsLandscapeMode ? shouldAdjustKeyWidths() : shouldAdjustDigitKeyHeights();
+      return isLandscapeMode ? shouldAdjustKeyWidths() : shouldAdjustDigitKeyHeights();
     }
 
     /**
@@ -536,7 +536,7 @@
      * device is in landscape mode.
      */
     private boolean shouldAdjustKeyWidths() {
-      Assert.checkState(mIsLandscapeMode);
+      Assert.checkState(isLandscapeMode);
 
       DialpadKeyButton dialpadKeyButton = (DialpadKeyButton) findViewById(BUTTON_IDS[0]);
       LinearLayout keyLayout =
@@ -559,7 +559,7 @@
      * called when the device is in portrait mode.
      */
     private boolean shouldAdjustDigitKeyHeights() {
-      Assert.checkState(!mIsLandscapeMode);
+      Assert.checkState(!isLandscapeMode);
 
       DialpadKeyButton dialpadKey = (DialpadKeyButton) findViewById(BUTTON_IDS[0]);
       LinearLayout keyLayout = (LinearLayout) dialpadKey.findViewById(R.id.dialpad_key_layout);
@@ -579,7 +579,7 @@
     }
 
     private void adjustKeySizes() {
-      if (mIsLandscapeMode) {
+      if (isLandscapeMode) {
         adjustKeyWidths();
       } else {
         adjustDigitKeyHeights();
@@ -597,7 +597,7 @@
      * LinearLayout#setLayoutParams(ViewGroup.LayoutParams)}.
      */
     private void adjustDigitKeyHeights() {
-      Assert.checkState(!mIsLandscapeMode);
+      Assert.checkState(!isLandscapeMode);
 
       int maxHeight = 0;
 
@@ -641,7 +641,7 @@
      * View#setLayoutParams(ViewGroup.LayoutParams)}.
      */
     private void adjustKeyWidths() {
-      Assert.checkState(mIsLandscapeMode);
+      Assert.checkState(isLandscapeMode);
 
       int maxWidth = 0;
       for (int buttonId : BUTTON_IDS) {
diff --git a/java/com/android/dialer/dialpadview/PseudoEmergencyAnimator.java b/java/com/android/dialer/dialpadview/PseudoEmergencyAnimator.java
index 16bdd24..f3442e6 100644
--- a/java/com/android/dialer/dialpadview/PseudoEmergencyAnimator.java
+++ b/java/com/android/dialer/dialpadview/PseudoEmergencyAnimator.java
@@ -35,40 +35,40 @@
   private static final int VIBRATE_LENGTH_MILLIS = 200;
   private static final int ITERATION_LENGTH_MILLIS = 1000;
   private static final int ANIMATION_ITERATION_COUNT = 6;
-  private ViewProvider mViewProvider;
-  private ValueAnimator mPseudoEmergencyColorAnimator;
+  private ViewProvider viewProvider;
+  private ValueAnimator pseudoEmergencyColorAnimator;
 
   PseudoEmergencyAnimator(ViewProvider viewProvider) {
-    mViewProvider = viewProvider;
+    this.viewProvider = viewProvider;
   }
 
   public void destroy() {
     end();
-    mViewProvider = null;
+    viewProvider = null;
   }
 
   public void start() {
-    if (mPseudoEmergencyColorAnimator == null) {
+    if (pseudoEmergencyColorAnimator == null) {
       Integer colorFrom = Color.BLUE;
       Integer colorTo = Color.RED;
-      mPseudoEmergencyColorAnimator =
+      pseudoEmergencyColorAnimator =
           ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo);
 
-      mPseudoEmergencyColorAnimator.addUpdateListener(
+      pseudoEmergencyColorAnimator.addUpdateListener(
           animator -> {
             try {
               int color = (int) animator.getAnimatedValue();
               ColorFilter colorFilter = new LightingColorFilter(Color.BLACK, color);
 
-              if (mViewProvider.getFab() != null) {
-                mViewProvider.getFab().getBackground().setColorFilter(colorFilter);
+              if (viewProvider.getFab() != null) {
+                viewProvider.getFab().getBackground().setColorFilter(colorFilter);
               }
             } catch (Exception e) {
               animator.cancel();
             }
           });
 
-      mPseudoEmergencyColorAnimator.addListener(
+      pseudoEmergencyColorAnimator.addListener(
           new AnimatorListener() {
             @Override
             public void onAnimationCancel(Animator animation) {}
@@ -88,8 +88,8 @@
             @Override
             public void onAnimationEnd(Animator animation) {
               try {
-                if (mViewProvider.getFab() != null) {
-                  mViewProvider.getFab().getBackground().clearColorFilter();
+                if (viewProvider.getFab() != null) {
+                  viewProvider.getFab().getBackground().clearColorFilter();
                 }
 
                 new Handler()
@@ -108,23 +108,23 @@
             }
           });
 
-      mPseudoEmergencyColorAnimator.setDuration(VIBRATE_LENGTH_MILLIS);
-      mPseudoEmergencyColorAnimator.setRepeatMode(ValueAnimator.REVERSE);
-      mPseudoEmergencyColorAnimator.setRepeatCount(ANIMATION_ITERATION_COUNT);
+      pseudoEmergencyColorAnimator.setDuration(VIBRATE_LENGTH_MILLIS);
+      pseudoEmergencyColorAnimator.setRepeatMode(ValueAnimator.REVERSE);
+      pseudoEmergencyColorAnimator.setRepeatCount(ANIMATION_ITERATION_COUNT);
     }
-    if (!mPseudoEmergencyColorAnimator.isStarted()) {
-      mPseudoEmergencyColorAnimator.start();
+    if (!pseudoEmergencyColorAnimator.isStarted()) {
+      pseudoEmergencyColorAnimator.start();
     }
   }
 
   public void end() {
-    if (mPseudoEmergencyColorAnimator != null && mPseudoEmergencyColorAnimator.isStarted()) {
-      mPseudoEmergencyColorAnimator.end();
+    if (pseudoEmergencyColorAnimator != null && pseudoEmergencyColorAnimator.isStarted()) {
+      pseudoEmergencyColorAnimator.end();
     }
   }
 
   private void vibrate(long milliseconds) {
-    Context context = mViewProvider.getContext();
+    Context context = viewProvider.getContext();
     if (context != null) {
       Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
       if (vibrator != null) {
diff --git a/java/com/android/dialer/dialpadview/SpecialCharSequenceMgr.java b/java/com/android/dialer/dialpadview/SpecialCharSequenceMgr.java
index 7ff0d08..e6d405c 100644
--- a/java/com/android/dialer/dialpadview/SpecialCharSequenceMgr.java
+++ b/java/com/android/dialer/dialpadview/SpecialCharSequenceMgr.java
@@ -92,7 +92,7 @@
    * Phone side doesn't have this functionality. Fundamental fix would be to have one shared
    * implementation and resolve this corner case more gracefully.
    */
-  private static QueryHandler sPreviousAdnQueryHandler;
+  private static QueryHandler previousAdnQueryHandler;
 
   /** This class is never instantiated. */
   private SpecialCharSequenceMgr() {}
@@ -124,9 +124,9 @@
   public static void cleanup() {
     Assert.isMainThread();
 
-    if (sPreviousAdnQueryHandler != null) {
-      sPreviousAdnQueryHandler.cancel();
-      sPreviousAdnQueryHandler = null;
+    if (previousAdnQueryHandler != null) {
+      previousAdnQueryHandler.cancel();
+      previousAdnQueryHandler = null;
     }
   }
 
@@ -255,11 +255,11 @@
         null,
         null);
 
-    if (sPreviousAdnQueryHandler != null) {
+    if (previousAdnQueryHandler != null) {
       // It is harmless to call cancel() even after the handler's gone.
-      sPreviousAdnQueryHandler.cancel();
+      previousAdnQueryHandler.cancel();
     }
-    sPreviousAdnQueryHandler = handler;
+    previousAdnQueryHandler = handler;
   }
 
   static boolean handlePinEntry(final Context context, final String input) {
@@ -343,40 +343,40 @@
 
   public static class HandleAdnEntryAccountSelectedCallback extends SelectPhoneAccountListener {
 
-    private final Context mContext;
-    private final QueryHandler mQueryHandler;
-    private final SimContactQueryCookie mCookie;
+    private final Context context;
+    private final QueryHandler queryHandler;
+    private final SimContactQueryCookie cookie;
 
     public HandleAdnEntryAccountSelectedCallback(
         Context context, QueryHandler queryHandler, SimContactQueryCookie cookie) {
-      mContext = context;
-      mQueryHandler = queryHandler;
-      mCookie = cookie;
+      this.context = context;
+      this.queryHandler = queryHandler;
+      this.cookie = cookie;
     }
 
     @Override
     public void onPhoneAccountSelected(
         PhoneAccountHandle selectedAccountHandle, boolean setDefault, @Nullable String callId) {
-      Uri uri = TelecomUtil.getAdnUriForPhoneAccount(mContext, selectedAccountHandle);
-      handleAdnQuery(mQueryHandler, mCookie, uri);
+      Uri uri = TelecomUtil.getAdnUriForPhoneAccount(context, selectedAccountHandle);
+      handleAdnQuery(queryHandler, cookie, uri);
       // TODO: Show error dialog if result isn't valid.
     }
   }
 
   public static class HandleMmiAccountSelectedCallback extends SelectPhoneAccountListener {
 
-    private final Context mContext;
-    private final String mInput;
+    private final Context context;
+    private final String input;
 
     public HandleMmiAccountSelectedCallback(Context context, String input) {
-      mContext = context.getApplicationContext();
-      mInput = input;
+      this.context = context.getApplicationContext();
+      this.input = input;
     }
 
     @Override
     public void onPhoneAccountSelected(
         PhoneAccountHandle selectedAccountHandle, boolean setDefault, @Nullable String callId) {
-      TelecomUtil.handleMmi(mContext, mInput, selectedAccountHandle);
+      TelecomUtil.handleMmi(context, input, selectedAccountHandle);
     }
   }
 
@@ -393,16 +393,16 @@
     public int contactNum;
 
     // Used to identify the query request.
-    private int mToken;
-    private QueryHandler mHandler;
+    private int token;
+    private QueryHandler handler;
 
     // The text field we're going to update
     private EditText textField;
 
     public SimContactQueryCookie(int number, QueryHandler handler, int token) {
       contactNum = number;
-      mHandler = handler;
-      mToken = token;
+      this.handler = handler;
+      this.token = token;
     }
 
     /** Synchronized getter for the EditText. */
@@ -431,7 +431,7 @@
       textField = null;
 
       // Cancel the operation if possible.
-      mHandler.cancelOperation(mToken);
+      handler.cancelOperation(token);
     }
   }
 
@@ -442,7 +442,7 @@
    */
   private static class QueryHandler extends NoNullCursorAsyncQueryHandler {
 
-    private boolean mCanceled;
+    private boolean canceled;
 
     public QueryHandler(ContentResolver cr) {
       super(cr);
@@ -452,8 +452,8 @@
     @Override
     protected void onNotNullableQueryComplete(int token, Object cookie, Cursor c) {
       try {
-        sPreviousAdnQueryHandler = null;
-        if (mCanceled) {
+        previousAdnQueryHandler = null;
+        if (canceled) {
           return;
         }
 
@@ -488,7 +488,7 @@
     }
 
     public void cancel() {
-      mCanceled = true;
+      canceled = true;
       // Ask AsyncQueryHandler to cancel the whole request. This will fail when the query is
       // already started.
       cancelOperation(ADN_QUERY_TOKEN);
diff --git a/java/com/android/dialer/interactions/PhoneNumberInteraction.java b/java/com/android/dialer/interactions/PhoneNumberInteraction.java
index 5a6c346..27ade19 100644
--- a/java/com/android/dialer/interactions/PhoneNumberInteraction.java
+++ b/java/com/android/dialer/interactions/PhoneNumberInteraction.java
@@ -113,12 +113,12 @@
           + Data.DATA1
           + " NOT NULL";
   private static final int UNKNOWN_CONTACT_ID = -1;
-  private final Context mContext;
-  private final int mInteractionType;
-  private final CallSpecificAppData mCallSpecificAppData;
-  private long mContactId = UNKNOWN_CONTACT_ID;
-  private CursorLoader mLoader;
-  private boolean mIsVideoCall;
+  private final Context context;
+  private final int interactionType;
+  private final CallSpecificAppData callSpecificAppData;
+  private long contactId = UNKNOWN_CONTACT_ID;
+  private CursorLoader loader;
+  private boolean isVideoCall;
 
   /** Error codes for interactions. */
   @Retention(RetentionPolicy.SOURCE)
@@ -161,10 +161,10 @@
       int interactionType,
       boolean isVideoCall,
       CallSpecificAppData callSpecificAppData) {
-    mContext = context;
-    mInteractionType = interactionType;
-    mCallSpecificAppData = callSpecificAppData;
-    mIsVideoCall = isVideoCall;
+    this.context = context;
+    this.interactionType = interactionType;
+    this.callSpecificAppData = callSpecificAppData;
+    this.isVideoCall = isVideoCall;
 
     Assert.checkArgument(context instanceof InteractionErrorListener);
     Assert.checkArgument(context instanceof DisambigDialogDismissedListener);
@@ -213,7 +213,7 @@
 
   private void performAction(String phoneNumber) {
     PhoneNumberInteraction.performAction(
-        mContext, phoneNumber, mInteractionType, mIsVideoCall, mCallSpecificAppData);
+        context, phoneNumber, interactionType, isVideoCall, callSpecificAppData);
   }
 
   /**
@@ -225,27 +225,27 @@
     // It's possible for a shortcut to have been created, and then permissions revoked. To avoid a
     // crash when the user tries to use such a shortcut, check for this condition and ask the user
     // for the permission.
-    if (!PermissionsUtil.hasPhonePermissions(mContext)) {
+    if (!PermissionsUtil.hasPhonePermissions(context)) {
       LogUtil.i("PhoneNumberInteraction.startInteraction", "Need phone permission: CALL_PHONE");
       ActivityCompat.requestPermissions(
-          (Activity) mContext, new String[] {permission.CALL_PHONE}, REQUEST_CALL_PHONE);
+          (Activity) context, new String[] {permission.CALL_PHONE}, REQUEST_CALL_PHONE);
       return;
     }
 
     String[] deniedContactsPermissions =
         PermissionsUtil.getPermissionsCurrentlyDenied(
-            mContext, PermissionsUtil.allContactsGroupPermissionsUsedInDialer);
+            context, PermissionsUtil.allContactsGroupPermissionsUsedInDialer);
     if (deniedContactsPermissions.length > 0) {
       LogUtil.i(
           "PhoneNumberInteraction.startInteraction",
           "Need contact permissions: " + Arrays.toString(deniedContactsPermissions));
       ActivityCompat.requestPermissions(
-          (Activity) mContext, deniedContactsPermissions, REQUEST_READ_CONTACTS);
+          (Activity) context, deniedContactsPermissions, REQUEST_READ_CONTACTS);
       return;
     }
 
-    if (mLoader != null) {
-      mLoader.reset();
+    if (loader != null) {
+      loader.reset();
     }
     final Uri queryUri;
     final String inputUriAsString = uri.toString();
@@ -262,11 +262,11 @@
           "Input Uri must be contact Uri or data Uri (input: \"" + uri + "\")");
     }
 
-    mLoader =
+    loader =
         new CursorLoader(
-            mContext, queryUri, PHONE_NUMBER_PROJECTION, PHONE_NUMBER_SELECTION, null, null);
-    mLoader.registerListener(0, this);
-    mLoader.startLoading();
+            context, queryUri, PHONE_NUMBER_PROJECTION, PHONE_NUMBER_SELECTION, null, null);
+    loader.registerListener(0, this);
+    loader.startLoading();
   }
 
   @Override
@@ -295,8 +295,8 @@
         int phoneLabelColumn = cursor.getColumnIndexOrThrow(Phone.LABEL);
         int phoneMimeTpeColumn = cursor.getColumnIndexOrThrow(Phone.MIMETYPE);
         do {
-          if (mContactId == UNKNOWN_CONTACT_ID) {
-            mContactId = cursor.getLong(contactIdColumn);
+          if (contactId == UNKNOWN_CONTACT_ID) {
+            contactId = cursor.getLong(contactIdColumn);
           }
 
           if (cursor.getInt(isSuperPrimaryColumn) != 0) {
@@ -325,7 +325,7 @@
         return;
       }
 
-      Collapser.collapseList(phoneList, mContext);
+      Collapser.collapseList(phoneList, context);
       if (phoneList.size() == 0) {
         interactionError(InteractionErrorCode.CONTACT_HAS_NO_NUMBER);
       } else if (phoneList.size() == 1) {
@@ -342,22 +342,22 @@
 
   private void interactionError(@InteractionErrorCode int interactionErrorCode) {
     // mContext is really the activity -- see ctor docs.
-    ((InteractionErrorListener) mContext).interactionError(interactionErrorCode);
+    ((InteractionErrorListener) context).interactionError(interactionErrorCode);
   }
 
   private boolean isSafeToCommitTransactions() {
-    return !(mContext instanceof TransactionSafeActivity)
-        || ((TransactionSafeActivity) mContext).isSafeToCommitTransactions();
+    return !(context instanceof TransactionSafeActivity)
+        || ((TransactionSafeActivity) context).isSafeToCommitTransactions();
   }
 
   @VisibleForTesting
   /* package */ CursorLoader getLoader() {
-    return mLoader;
+    return loader;
   }
 
   private void showDisambiguationDialog(ArrayList<PhoneItem> phoneList) {
     // TODO(a bug): don't leak the activity
-    final Activity activity = (Activity) mContext;
+    final Activity activity = (Activity) context;
     if (activity.isFinishing()) {
       LogUtil.i("PhoneNumberInteraction.showDisambiguationDialog", "activity finishing");
       return;
@@ -373,9 +373,9 @@
       PhoneDisambiguationDialogFragment.show(
           activity.getFragmentManager(),
           phoneList,
-          mInteractionType,
-          mIsVideoCall,
-          mCallSpecificAppData);
+          interactionType,
+          isVideoCall,
+          callSpecificAppData);
     } catch (IllegalStateException e) {
       // ignore to be safe. Shouldn't happen because we checked the
       // activity wasn't destroyed, but to be safe.
@@ -456,11 +456,11 @@
   /** A list adapter that populates the list of contact's phone numbers. */
   private static class PhoneItemAdapter extends ArrayAdapter<PhoneItem> {
 
-    private final int mInteractionType;
+    private final int interactionType;
 
     PhoneItemAdapter(Context context, List<PhoneItem> list, int interactionType) {
       super(context, R.layout.phone_disambig_item, android.R.id.text2, list);
-      mInteractionType = interactionType;
+      this.interactionType = interactionType;
     }
 
     @Override
@@ -472,7 +472,7 @@
       final TextView typeView = (TextView) view.findViewById(android.R.id.text1);
       CharSequence value =
           ContactDisplayUtils.getLabelForCallOrSms(
-              (int) item.type, item.label, mInteractionType, getContext());
+              (int) item.type, item.label, interactionType, getContext());
 
       typeView.setText(value);
       return view;
@@ -498,11 +498,11 @@
     private static final String ARG_INTERACTION_TYPE = "interactionType";
     private static final String ARG_IS_VIDEO_CALL = "is_video_call";
 
-    private int mInteractionType;
-    private ListAdapter mPhonesAdapter;
-    private List<PhoneItem> mPhoneList;
-    private CallSpecificAppData mCallSpecificAppData;
-    private boolean mIsVideoCall;
+    private int interactionType;
+    private ListAdapter phonesAdapter;
+    private List<PhoneItem> phoneList;
+    private CallSpecificAppData callSpecificAppData;
+    private boolean isVideoCall;
 
     public PhoneDisambiguationDialogFragment() {
       super();
@@ -529,19 +529,19 @@
       final Activity activity = getActivity();
       Assert.checkState(activity instanceof DisambigDialogDismissedListener);
 
-      mPhoneList = getArguments().getParcelableArrayList(ARG_PHONE_LIST);
-      mInteractionType = getArguments().getInt(ARG_INTERACTION_TYPE);
-      mIsVideoCall = getArguments().getBoolean(ARG_IS_VIDEO_CALL);
-      mCallSpecificAppData = CallIntentParser.getCallSpecificAppData(getArguments());
+      phoneList = getArguments().getParcelableArrayList(ARG_PHONE_LIST);
+      interactionType = getArguments().getInt(ARG_INTERACTION_TYPE);
+      isVideoCall = getArguments().getBoolean(ARG_IS_VIDEO_CALL);
+      callSpecificAppData = CallIntentParser.getCallSpecificAppData(getArguments());
 
-      mPhonesAdapter = new PhoneItemAdapter(activity, mPhoneList, mInteractionType);
+      phonesAdapter = new PhoneItemAdapter(activity, phoneList, interactionType);
       final LayoutInflater inflater = activity.getLayoutInflater();
       @SuppressLint("InflateParams") // Allowed since dialog view is not available yet
       final View setPrimaryView = inflater.inflate(R.layout.set_primary_checkbox, null);
       return new AlertDialog.Builder(activity)
-          .setAdapter(mPhonesAdapter, this)
+          .setAdapter(phonesAdapter, this)
           .setTitle(
-              mInteractionType == ContactDisplayUtils.INTERACTION_SMS
+              interactionType == ContactDisplayUtils.INTERACTION_SMS
                   ? R.string.sms_disambig_title
                   : R.string.call_disambig_title)
           .setView(setPrimaryView)
@@ -555,11 +555,11 @@
         return;
       }
       final AlertDialog alertDialog = (AlertDialog) dialog;
-      if (mPhoneList.size() > which && which >= 0) {
-        final PhoneItem phoneItem = mPhoneList.get(which);
+      if (phoneList.size() > which && which >= 0) {
+        final PhoneItem phoneItem = phoneList.get(which);
         final CheckBox checkBox = (CheckBox) alertDialog.findViewById(R.id.setPrimary);
         if (checkBox.isChecked()) {
-          if (mCallSpecificAppData.getCallInitiationType() == CallInitiationType.Type.SPEED_DIAL) {
+          if (callSpecificAppData.getCallInitiationType() == CallInitiationType.Type.SPEED_DIAL) {
             Logger.get(getContext())
                 .logInteraction(
                     InteractionEvent.Type.SPEED_DIAL_SET_DEFAULT_NUMBER_FOR_AMBIGUOUS_CONTACT);
@@ -572,7 +572,7 @@
         }
 
         PhoneNumberInteraction.performAction(
-            activity, phoneItem.phoneNumber, mInteractionType, mIsVideoCall, mCallSpecificAppData);
+            activity, phoneItem.phoneNumber, interactionType, isVideoCall, callSpecificAppData);
       } else {
         dialog.dismiss();
       }
diff --git a/java/com/android/dialer/lettertile/LetterTileDrawable.java b/java/com/android/dialer/lettertile/LetterTileDrawable.java
index c8b75c5..b747c4f 100644
--- a/java/com/android/dialer/lettertile/LetterTileDrawable.java
+++ b/java/com/android/dialer/lettertile/LetterTileDrawable.java
@@ -88,53 +88,53 @@
   private static final float VECTOR_ICON_SCALE = 0.7f;
 
   /** Reusable components to avoid new allocations */
-  private final Paint mPaint = new Paint();
+  private final Paint paint = new Paint();
 
-  private final Rect mRect = new Rect();
-  private final char[] mFirstChar = new char[1];
+  private final Rect rect = new Rect();
+  private final char[] firstChar = new char[1];
 
   /** Letter tile */
-  @NonNull private final TypedArray mColors;
+  @NonNull private final TypedArray colors;
 
-  private final int mSpamColor;
-  private final int mDefaultColor;
-  private final int mTileFontColor;
-  private final float mLetterToTileRatio;
-  @NonNull private final Drawable mDefaultPersonAvatar;
-  @NonNull private final Drawable mDefaultBusinessAvatar;
-  @NonNull private final Drawable mDefaultVoicemailAvatar;
-  @NonNull private final Drawable mDefaultSpamAvatar;
-  @NonNull private final Drawable mDefaultConferenceAvatar;
+  private final int spamColor;
+  private final int defaultColor;
+  private final int tileFontColor;
+  private final float letterToTileRatio;
+  @NonNull private final Drawable defaultPersonAvatar;
+  @NonNull private final Drawable defaultBusinessAvatar;
+  @NonNull private final Drawable defaultVoicemailAvatar;
+  @NonNull private final Drawable defaultSpamAvatar;
+  @NonNull private final Drawable defaultConferenceAvatar;
 
-  @ContactType private int mContactType = TYPE_DEFAULT;
-  private float mScale = 1.0f;
-  private float mOffset = 0.0f;
-  private boolean mIsCircle = false;
+  @ContactType private int contactType = TYPE_DEFAULT;
+  private float scale = 1.0f;
+  private float offset = 0.0f;
+  private boolean isCircle = false;
 
-  private int mColor;
-  private Character mLetter = null;
+  private int color;
+  private Character letter = null;
 
-  private String mDisplayName;
+  private String displayName;
 
   public LetterTileDrawable(final Resources res) {
-    mColors = res.obtainTypedArray(R.array.letter_tile_colors);
-    mSpamColor = res.getColor(R.color.spam_contact_background);
-    mDefaultColor = res.getColor(R.color.letter_tile_default_color);
-    mTileFontColor = res.getColor(R.color.letter_tile_font_color);
-    mLetterToTileRatio = res.getFraction(R.dimen.letter_to_tile_ratio, 1, 1);
-    mDefaultPersonAvatar =
+    colors = res.obtainTypedArray(R.array.letter_tile_colors);
+    spamColor = res.getColor(R.color.spam_contact_background);
+    defaultColor = res.getColor(R.color.letter_tile_default_color);
+    tileFontColor = res.getColor(R.color.letter_tile_font_color);
+    letterToTileRatio = res.getFraction(R.dimen.letter_to_tile_ratio, 1, 1);
+    defaultPersonAvatar =
         res.getDrawable(R.drawable.product_logo_avatar_anonymous_white_color_120, null);
-    mDefaultBusinessAvatar = res.getDrawable(R.drawable.quantum_ic_business_vd_theme_24, null);
-    mDefaultVoicemailAvatar = res.getDrawable(R.drawable.quantum_ic_voicemail_vd_theme_24, null);
-    mDefaultSpamAvatar = res.getDrawable(R.drawable.quantum_ic_report_vd_theme_24, null);
-    mDefaultConferenceAvatar = res.getDrawable(R.drawable.quantum_ic_group_vd_theme_24, null);
+    defaultBusinessAvatar = res.getDrawable(R.drawable.quantum_ic_business_vd_theme_24, null);
+    defaultVoicemailAvatar = res.getDrawable(R.drawable.quantum_ic_voicemail_vd_theme_24, null);
+    defaultSpamAvatar = res.getDrawable(R.drawable.quantum_ic_report_vd_theme_24, null);
+    defaultConferenceAvatar = res.getDrawable(R.drawable.quantum_ic_group_vd_theme_24, null);
 
-    mPaint.setTypeface(Typeface.create("sans-serif-medium", Typeface.NORMAL));
-    mPaint.setTextAlign(Align.CENTER);
-    mPaint.setAntiAlias(true);
-    mPaint.setFilterBitmap(true);
-    mPaint.setDither(true);
-    mColor = mDefaultColor;
+    paint.setTypeface(Typeface.create("sans-serif-medium", Typeface.NORMAL));
+    paint.setTextAlign(Align.CENTER);
+    paint.setAntiAlias(true);
+    paint.setFilterBitmap(true);
+    paint.setDither(true);
+    color = defaultColor;
   }
 
   private Rect getScaledBounds(float scale, float offset) {
@@ -155,21 +155,21 @@
   private Drawable getDrawableForContactType(int contactType) {
     switch (contactType) {
       case TYPE_BUSINESS:
-        mScale = VECTOR_ICON_SCALE;
-        return mDefaultBusinessAvatar;
+        scale = VECTOR_ICON_SCALE;
+        return defaultBusinessAvatar;
       case TYPE_VOICEMAIL:
-        mScale = VECTOR_ICON_SCALE;
-        return mDefaultVoicemailAvatar;
+        scale = VECTOR_ICON_SCALE;
+        return defaultVoicemailAvatar;
       case TYPE_SPAM:
-        mScale = VECTOR_ICON_SCALE;
-        return mDefaultSpamAvatar;
+        scale = VECTOR_ICON_SCALE;
+        return defaultSpamAvatar;
       case TYPE_CONFERENCE:
-        mScale = VECTOR_ICON_SCALE;
-        return mDefaultConferenceAvatar;
+        scale = VECTOR_ICON_SCALE;
+        return defaultConferenceAvatar;
       case TYPE_PERSON:
       case TYPE_GENERIC_AVATAR:
       default:
-        return mDefaultPersonAvatar;
+        return defaultPersonAvatar;
     }
   }
 
@@ -197,88 +197,88 @@
 
   private void drawLetterTile(final Canvas canvas) {
     // Draw background color.
-    mPaint.setColor(mColor);
+    paint.setColor(color);
 
     final Rect bounds = getBounds();
     final int minDimension = Math.min(bounds.width(), bounds.height());
 
-    if (mIsCircle) {
-      canvas.drawCircle(bounds.centerX(), bounds.centerY(), minDimension / 2, mPaint);
+    if (isCircle) {
+      canvas.drawCircle(bounds.centerX(), bounds.centerY(), minDimension / 2, paint);
     } else {
-      canvas.drawRect(bounds, mPaint);
+      canvas.drawRect(bounds, paint);
     }
 
     // Draw letter/digit only if the first character is an english letter or there's a override
-    if (mLetter != null) {
+    if (letter != null) {
       // Draw letter or digit.
-      mFirstChar[0] = mLetter;
+      firstChar[0] = letter;
 
       // Scale text by canvas bounds and user selected scaling factor
-      mPaint.setTextSize(mScale * mLetterToTileRatio * minDimension);
-      mPaint.getTextBounds(mFirstChar, 0, 1, mRect);
-      mPaint.setTypeface(Typeface.create("sans-serif", Typeface.NORMAL));
-      mPaint.setColor(mTileFontColor);
-      mPaint.setAlpha(ALPHA);
+      paint.setTextSize(scale * letterToTileRatio * minDimension);
+      paint.getTextBounds(firstChar, 0, 1, rect);
+      paint.setTypeface(Typeface.create("sans-serif", Typeface.NORMAL));
+      paint.setColor(tileFontColor);
+      paint.setAlpha(ALPHA);
 
       // Draw the letter in the canvas, vertically shifted up or down by the user-defined
       // offset
       canvas.drawText(
-          mFirstChar,
+          firstChar,
           0,
           1,
           bounds.centerX(),
-          bounds.centerY() + mOffset * bounds.height() - mRect.exactCenterY(),
-          mPaint);
+          bounds.centerY() + offset * bounds.height() - rect.exactCenterY(),
+          paint);
     } else {
       // Draw the default image if there is no letter/digit to be drawn
-      Drawable drawable = getDrawableForContactType(mContactType);
+      Drawable drawable = getDrawableForContactType(contactType);
       if (drawable == null) {
         throw Assert.createIllegalStateFailException(
-            "Unable to find drawable for contact type " + mContactType);
+            "Unable to find drawable for contact type " + contactType);
       }
 
-      drawable.setBounds(getScaledBounds(mScale, mOffset));
-      drawable.setAlpha(drawable == mDefaultSpamAvatar ? SPAM_ALPHA : ALPHA);
+      drawable.setBounds(getScaledBounds(scale, offset));
+      drawable.setAlpha(drawable == defaultSpamAvatar ? SPAM_ALPHA : ALPHA);
       drawable.draw(canvas);
     }
   }
 
   public int getColor() {
-    return mColor;
+    return color;
   }
 
   public LetterTileDrawable setColor(int color) {
-    mColor = color;
+    this.color = color;
     return this;
   }
 
   /** Returns a deterministic color based on the provided contact identifier string. */
   private int pickColor(final String identifier) {
-    if (mContactType == TYPE_SPAM) {
-      return mSpamColor;
+    if (contactType == TYPE_SPAM) {
+      return spamColor;
     }
 
-    if (mContactType == TYPE_VOICEMAIL
-        || mContactType == TYPE_BUSINESS
+    if (contactType == TYPE_VOICEMAIL
+        || contactType == TYPE_BUSINESS
         || TextUtils.isEmpty(identifier)) {
-      return mDefaultColor;
+      return defaultColor;
     }
 
     // String.hashCode() implementation is not supposed to change across java versions, so
     // this should guarantee the same email address always maps to the same color.
     // The email should already have been normalized by the ContactRequest.
-    final int color = Math.abs(identifier.hashCode()) % mColors.length();
-    return mColors.getColor(color, mDefaultColor);
+    final int color = Math.abs(identifier.hashCode()) % colors.length();
+    return colors.getColor(color, defaultColor);
   }
 
   @Override
   public void setAlpha(final int alpha) {
-    mPaint.setAlpha(alpha);
+    paint.setAlpha(alpha);
   }
 
   @Override
   public void setColorFilter(final ColorFilter cf) {
-    mPaint.setColorFilter(cf);
+    paint.setColorFilter(cf);
   }
 
   @Override
@@ -288,7 +288,7 @@
 
   @Override
   public void getOutline(Outline outline) {
-    if (mIsCircle) {
+    if (isCircle) {
       outline.setOval(getBounds());
     } else {
       outline.setRect(getBounds());
@@ -304,7 +304,7 @@
    *     from a scale of 0 to 2.0f. The default is 1.0f.
    */
   public LetterTileDrawable setScale(float scale) {
-    mScale = scale;
+    this.scale = scale;
     return this;
   }
 
@@ -320,47 +320,47 @@
    */
   public LetterTileDrawable setOffset(float offset) {
     Assert.checkArgument(offset >= -0.5f && offset <= 0.5f);
-    mOffset = offset;
+    this.offset = offset;
     return this;
   }
 
   public LetterTileDrawable setLetter(Character letter) {
-    mLetter = letter;
+    this.letter = letter;
     return this;
   }
 
   public Character getLetter() {
-    return this.mLetter;
+    return this.letter;
   }
 
   private LetterTileDrawable setLetterAndColorFromContactDetails(
       final String displayName, final String identifier) {
     if (!TextUtils.isEmpty(displayName) && isEnglishLetter(displayName.charAt(0))) {
-      mLetter = Character.toUpperCase(displayName.charAt(0));
+      letter = Character.toUpperCase(displayName.charAt(0));
     } else {
-      mLetter = null;
+      letter = null;
     }
-    mColor = pickColor(identifier);
+    color = pickColor(identifier);
     return this;
   }
 
   private LetterTileDrawable setContactType(@ContactType int contactType) {
-    mContactType = contactType;
+    this.contactType = contactType;
     return this;
   }
 
   @ContactType
   public int getContactType() {
-    return this.mContactType;
+    return this.contactType;
   }
 
   public LetterTileDrawable setIsCircular(boolean isCircle) {
-    mIsCircle = isCircle;
+    this.isCircle = isCircle;
     return this;
   }
 
   public boolean tileIsCircular() {
-    return this.mIsCircle;
+    return this.isCircle;
   }
 
   /**
@@ -391,11 +391,11 @@
      */
     if (contactType == TYPE_DEFAULT
         && ((displayName == null && identifierForTileColor == null)
-            || (displayName != null && displayName.equals(mDisplayName)))) {
+            || (displayName != null && displayName.equals(this.displayName)))) {
       return this;
     }
 
-    this.mDisplayName = displayName;
+    this.displayName = displayName;
     setContactType(contactType);
 
     // Special contact types receive default color and no letter tile, but special iconography.
diff --git a/java/com/android/dialer/location/CountryDetector.java b/java/com/android/dialer/location/CountryDetector.java
index 110cf45..5c5ed9c 100644
--- a/java/com/android/dialer/location/CountryDetector.java
+++ b/java/com/android/dialer/location/CountryDetector.java
@@ -72,7 +72,7 @@
   // exceedingly rare event that the device does not have a default locale set for some reason.
   private static final String DEFAULT_COUNTRY_ISO = "US";
 
-  @VisibleForTesting public static CountryDetector sInstance;
+  @VisibleForTesting public static CountryDetector instance;
 
   private final TelephonyManager telephonyManager;
   private final LocaleProvider localeProvider;
@@ -121,9 +121,9 @@
 
   /** @return the single instance of the {@link CountryDetector} */
   public static synchronized CountryDetector getInstance(Context context) {
-    if (sInstance == null) {
+    if (instance == null) {
       Context appContext = context.getApplicationContext();
-      sInstance =
+      instance =
           new CountryDetector(
               appContext,
               (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE),
@@ -131,7 +131,7 @@
               Locale::getDefault,
               new Geocoder(appContext));
     }
-    return sInstance;
+    return instance;
   }
 
   public String getCurrentCountryIso() {
diff --git a/java/com/android/dialer/phonenumbercache/ContactInfoHelper.java b/java/com/android/dialer/phonenumbercache/ContactInfoHelper.java
index 1fd2bff..0422655 100644
--- a/java/com/android/dialer/phonenumbercache/ContactInfoHelper.java
+++ b/java/com/android/dialer/phonenumbercache/ContactInfoHelper.java
@@ -60,14 +60,14 @@
 
   private static final String TAG = ContactInfoHelper.class.getSimpleName();
 
-  private final Context mContext;
-  private final String mCurrentCountryIso;
-  private final CachedNumberLookupService mCachedNumberLookupService;
+  private final Context context;
+  private final String currentCountryIso;
+  private final CachedNumberLookupService cachedNumberLookupService;
 
   public ContactInfoHelper(Context context, String currentCountryIso) {
-    mContext = context;
-    mCurrentCountryIso = currentCountryIso;
-    mCachedNumberLookupService = PhoneNumberCache.get(mContext).getCachedNumberLookupService();
+    this.context = context;
+    this.currentCountryIso = currentCountryIso;
+    cachedNumberLookupService = PhoneNumberCache.get(this.context).getCachedNumberLookupService();
   }
 
   /**
@@ -277,8 +277,8 @@
    * empty contact info for the number.
    */
   public ContactInfo lookupNumberInRemoteDirectory(String number, String countryIso) {
-    if (mCachedNumberLookupService != null) {
-      List<Long> remoteDirectories = getRemoteDirectories(mContext);
+    if (cachedNumberLookupService != null) {
+      List<Long> remoteDirectories = getRemoteDirectories(context);
       for (long directoryId : remoteDirectories) {
         ContactInfo contactInfo = lookupNumber(number, countryIso, directoryId);
         if (hasName(contactInfo)) {
@@ -332,13 +332,13 @@
       LogUtil.d("ContactInfoHelper.lookupContactFromUri", "uri is null");
       return null;
     }
-    if (!PermissionsUtil.hasContactsReadPermissions(mContext)) {
+    if (!PermissionsUtil.hasContactsReadPermissions(context)) {
       LogUtil.d("ContactInfoHelper.lookupContactFromUri", "no contact permission, return empty");
       return ContactInfo.EMPTY;
     }
 
     try (Cursor phoneLookupCursor =
-        mContext
+        context
             .getContentResolver()
             .query(
                 uri,
@@ -368,7 +368,7 @@
 
       String lookupKey = phoneLookupCursor.getString(PhoneQuery.LOOKUP_KEY);
       ContactInfo contactInfo = createPhoneLookupContactInfo(phoneLookupCursor, lookupKey);
-      fillAdditionalContactInfo(mContext, contactInfo);
+      fillAdditionalContactInfo(context, contactInfo);
       return contactInfo;
     }
   }
@@ -442,9 +442,9 @@
         // Contact found in the extended directory specified by directoryId
         info.sourceType = ContactSource.Type.SOURCE_TYPE_EXTENDED;
       }
-    } else if (mCachedNumberLookupService != null) {
+    } else if (cachedNumberLookupService != null) {
       CachedContactInfo cacheInfo =
-          mCachedNumberLookupService.lookupCachedContactFromNumber(mContext, number);
+          cachedNumberLookupService.lookupCachedContactFromNumber(context, number);
       if (cacheInfo != null) {
         if (!cacheInfo.getContactInfo().isBadData) {
           info = cacheInfo.getContactInfo();
@@ -474,7 +474,7 @@
       return number;
     }
     if (TextUtils.isEmpty(countryIso)) {
-      countryIso = mCurrentCountryIso;
+      countryIso = currentCountryIso;
     }
     return PhoneNumberUtils.formatNumber(number, normalizedNumber, countryIso);
   }
@@ -489,7 +489,7 @@
    */
   public void updateCallLogContactInfo(
       String number, String countryIso, ContactInfo updatedInfo, ContactInfo callLogInfo) {
-    if (!PermissionsUtil.hasPermission(mContext, android.Manifest.permission.WRITE_CALL_LOG)) {
+    if (!PermissionsUtil.hasPermission(context, android.Manifest.permission.WRITE_CALL_LOG)) {
       return;
     }
 
@@ -572,18 +572,18 @@
 
     try {
       if (countryIso == null) {
-        mContext
+        context
             .getContentResolver()
             .update(
-                TelecomUtil.getCallLogUri(mContext),
+                TelecomUtil.getCallLogUri(context),
                 values,
                 Calls.NUMBER + " = ? AND " + Calls.COUNTRY_ISO + " IS NULL",
                 new String[] {number});
       } else {
-        mContext
+        context
             .getContentResolver()
             .update(
-                TelecomUtil.getCallLogUri(mContext),
+                TelecomUtil.getCallLogUri(context),
                 values,
                 Calls.NUMBER + " = ? AND " + Calls.COUNTRY_ISO + " = ?",
                 new String[] {number, countryIso});
@@ -594,11 +594,11 @@
   }
 
   public void updateCachedNumberLookupService(ContactInfo updatedInfo) {
-    if (mCachedNumberLookupService != null) {
+    if (cachedNumberLookupService != null) {
       if (hasName(updatedInfo)) {
         CachedContactInfo cachedContactInfo =
-            mCachedNumberLookupService.buildCachedContactInfo(updatedInfo);
-        mCachedNumberLookupService.addContact(mContext, cachedContactInfo);
+            cachedNumberLookupService.buildCachedContactInfo(updatedInfo);
+        cachedNumberLookupService.addContact(context, cachedContactInfo);
       }
     }
   }
@@ -607,10 +607,10 @@
    * Given a contact's sourceType, return true if the contact is a business
    *
    * @param sourceType sourceType of the contact. This is usually populated by {@link
-   *     #mCachedNumberLookupService}.
+   *     #cachedNumberLookupService}.
    */
   public boolean isBusiness(ContactSource.Type sourceType) {
-    return mCachedNumberLookupService != null && mCachedNumberLookupService.isBusiness(sourceType);
+    return cachedNumberLookupService != null && cachedNumberLookupService.isBusiness(sourceType);
   }
 
   /**
@@ -622,8 +622,8 @@
    * @return true if contacts from this source can be marked with an invalid caller id
    */
   public boolean canReportAsInvalid(ContactSource.Type sourceType, String objectId) {
-    return mCachedNumberLookupService != null
-        && mCachedNumberLookupService.canReportAsInvalid(sourceType, objectId);
+    return cachedNumberLookupService != null
+        && cachedNumberLookupService.canReportAsInvalid(sourceType, objectId);
   }
 
   /**
@@ -634,14 +634,14 @@
   public void updateFromCequintCallerId(
       @Nullable CequintCallerIdManager cequintCallerIdManager, ContactInfo info, String number) {
     Assert.isWorkerThread();
-    if (!CequintCallerIdManager.isCequintCallerIdEnabled(mContext)) {
+    if (!CequintCallerIdManager.isCequintCallerIdEnabled(context)) {
       return;
     }
     if (cequintCallerIdManager == null) {
       return;
     }
     CequintCallerIdContact cequintCallerIdContact =
-        cequintCallerIdManager.getCequintCallerIdContact(mContext, number);
+        cequintCallerIdManager.getCequintCallerIdContact(context, number);
     if (cequintCallerIdContact == null) {
       return;
     }
diff --git a/java/com/android/dialer/smartdial/SmartDialCursorLoader.java b/java/com/android/dialer/smartdial/SmartDialCursorLoader.java
index f6bc932..f2e41b2 100644
--- a/java/com/android/dialer/smartdial/SmartDialCursorLoader.java
+++ b/java/com/android/dialer/smartdial/SmartDialCursorLoader.java
@@ -35,18 +35,18 @@
   private static final String TAG = "SmartDialCursorLoader";
   private static final boolean DEBUG = false;
 
-  private final Context mContext;
+  private final Context context;
 
-  private Cursor mCursor;
+  private Cursor cursor;
 
-  private String mQuery;
-  private SmartDialNameMatcher mNameMatcher;
+  private String query;
+  private SmartDialNameMatcher nameMatcher;
 
-  private boolean mShowEmptyListForNullQuery = true;
+  private boolean showEmptyListForNullQuery = true;
 
   public SmartDialCursorLoader(Context context) {
     super(context);
-    mContext = context;
+    this.context = context;
   }
 
   /**
@@ -58,11 +58,11 @@
     if (DEBUG) {
       LogUtil.v(TAG, "Configure new query to be " + query);
     }
-    mQuery = SmartDialNameMatcher.normalizeNumber(mContext, query);
+    this.query = SmartDialNameMatcher.normalizeNumber(context, query);
 
     /** Constructs a name matcher object for matching names. */
-    mNameMatcher = new SmartDialNameMatcher(mQuery);
-    mNameMatcher.setShouldMatchEmptyQuery(!mShowEmptyListForNullQuery);
+    nameMatcher = new SmartDialNameMatcher(this.query);
+    nameMatcher.setShouldMatchEmptyQuery(!showEmptyListForNullQuery);
   }
 
   /**
@@ -73,18 +73,18 @@
   @Override
   public Cursor loadInBackground() {
     if (DEBUG) {
-      LogUtil.v(TAG, "Load in background " + mQuery);
+      LogUtil.v(TAG, "Load in background " + query);
     }
 
-    if (!PermissionsUtil.hasContactsReadPermissions(mContext)) {
+    if (!PermissionsUtil.hasContactsReadPermissions(context)) {
       return new MatrixCursor(PhoneQuery.PROJECTION_PRIMARY);
     }
 
     /** Loads results from the database helper. */
     final DialerDatabaseHelper dialerDatabaseHelper =
-        Database.get(mContext).getDatabaseHelper(mContext);
+        Database.get(context).getDatabaseHelper(context);
     final ArrayList<ContactNumber> allMatches =
-        dialerDatabaseHelper.getLooseMatches(mQuery, mNameMatcher);
+        dialerDatabaseHelper.getLooseMatches(query, nameMatcher);
 
     if (DEBUG) {
       LogUtil.v(TAG, "Loaded matches " + allMatches.size());
@@ -115,8 +115,8 @@
     }
 
     /** Hold a reference to the old data so it doesn't get garbage collected. */
-    Cursor oldCursor = mCursor;
-    mCursor = cursor;
+    Cursor oldCursor = this.cursor;
+    this.cursor = cursor;
 
     if (isStarted()) {
       /** If the Loader is in a started state, deliver the results to the client. */
@@ -131,11 +131,11 @@
 
   @Override
   protected void onStartLoading() {
-    if (mCursor != null) {
+    if (cursor != null) {
       /** Deliver any previously loaded data immediately. */
-      deliverResult(mCursor);
+      deliverResult(cursor);
     }
-    if (mCursor == null) {
+    if (cursor == null) {
       /** Force loads every time as our results change with queries. */
       forceLoad();
     }
@@ -153,9 +153,9 @@
     onStopLoading();
 
     /** Release all previously saved query results. */
-    if (mCursor != null) {
-      releaseResources(mCursor);
-      mCursor = null;
+    if (cursor != null) {
+      releaseResources(cursor);
+      cursor = null;
     }
   }
 
@@ -174,9 +174,9 @@
   }
 
   public void setShowEmptyListForNullQuery(boolean show) {
-    mShowEmptyListForNullQuery = show;
-    if (mNameMatcher != null) {
-      mNameMatcher.setShouldMatchEmptyQuery(!show);
+    showEmptyListForNullQuery = show;
+    if (nameMatcher != null) {
+      nameMatcher.setShouldMatchEmptyQuery(!show);
     }
   }
 }
diff --git a/java/com/android/dialer/smartdial/util/SmartDialNameMatcher.java b/java/com/android/dialer/smartdial/util/SmartDialNameMatcher.java
index 725c88c..6019622 100644
--- a/java/com/android/dialer/smartdial/util/SmartDialNameMatcher.java
+++ b/java/com/android/dialer/smartdial/util/SmartDialNameMatcher.java
@@ -38,14 +38,14 @@
   // positives
   private static final int INITIAL_LENGTH_LIMIT = 1;
 
-  private final ArrayList<SmartDialMatchPosition> mMatchPositions = new ArrayList<>();
-  private String mQuery;
+  private final ArrayList<SmartDialMatchPosition> matchPositions = new ArrayList<>();
+  private String query;
 
   // Controls whether to treat an empty query as a match (with anything).
-  private boolean mShouldMatchEmptyQuery = false;
+  private boolean shouldMatchEmptyQuery = false;
 
   public SmartDialNameMatcher(String query) {
-    mQuery = query;
+    this.query = query;
   }
 
   /**
@@ -112,7 +112,7 @@
   @Nullable
   public SmartDialMatchPosition matchesNumber(Context context, String phoneNumber, String query) {
     if (TextUtils.isEmpty(phoneNumber)) {
-      return mShouldMatchEmptyQuery ? new SmartDialMatchPosition(0, 0) : null;
+      return shouldMatchEmptyQuery ? new SmartDialMatchPosition(0, 0) : null;
     }
     StringBuilder builder = new StringBuilder();
     constructEmptyMask(builder, phoneNumber.length());
@@ -148,7 +148,7 @@
    *     with the matching positions otherwise
    */
   public SmartDialMatchPosition matchesNumber(Context context, String phoneNumber) {
-    return matchesNumber(context, phoneNumber, mQuery);
+    return matchesNumber(context, phoneNumber, query);
   }
 
   /**
@@ -164,7 +164,7 @@
   private SmartDialMatchPosition matchesNumberWithOffset(
       Context context, String phoneNumber, String query, int offset) {
     if (TextUtils.isEmpty(phoneNumber) || TextUtils.isEmpty(query)) {
-      return mShouldMatchEmptyQuery ? new SmartDialMatchPosition(offset, offset) : null;
+      return shouldMatchEmptyQuery ? new SmartDialMatchPosition(offset, offset) : null;
     }
     int queryAt = 0;
     int numberAt = offset;
@@ -406,25 +406,25 @@
    *     match positions (multiple matches correspond to initial matches).
    */
   public boolean matches(Context context, String displayName) {
-    mMatchPositions.clear();
-    return matchesCombination(context, displayName, mQuery, mMatchPositions);
+    matchPositions.clear();
+    return matchesCombination(context, displayName, query, matchPositions);
   }
 
   public ArrayList<SmartDialMatchPosition> getMatchPositions() {
     // Return a clone of mMatchPositions so that the caller can use it without
     // worrying about it changing
-    return new ArrayList<>(mMatchPositions);
+    return new ArrayList<>(matchPositions);
   }
 
   public String getQuery() {
-    return mQuery;
+    return query;
   }
 
   public void setQuery(String query) {
-    mQuery = query;
+    this.query = query;
   }
 
   public void setShouldMatchEmptyQuery(boolean matches) {
-    mShouldMatchEmptyQuery = matches;
+    shouldMatchEmptyQuery = matches;
   }
 }
diff --git a/java/com/android/dialer/smartdial/util/SmartDialPrefix.java b/java/com/android/dialer/smartdial/util/SmartDialPrefix.java
index 9af4119..7fef881 100644
--- a/java/com/android/dialer/smartdial/util/SmartDialPrefix.java
+++ b/java/com/android/dialer/smartdial/util/SmartDialPrefix.java
@@ -54,38 +54,38 @@
 
   private static final String PREF_USER_SIM_COUNTRY_CODE_DEFAULT = null;
 
-  private static String sUserSimCountryCode = PREF_USER_SIM_COUNTRY_CODE_DEFAULT;
+  private static String userSimCountryCode = PREF_USER_SIM_COUNTRY_CODE_DEFAULT;
   /** Indicates whether user is in NANP regions. */
-  private static boolean sUserInNanpRegion = false;
+  private static boolean userInNanpRegion = false;
   /** Set of country names that use NANP code. */
-  private static Set<String> sNanpCountries = null;
+  private static Set<String> nanpCountries = null;
   /** Set of supported country codes in front of the phone number. */
-  private static Set<String> sCountryCodes = null;
+  private static Set<String> countryCodes = null;
 
-  private static boolean sNanpInitialized = false;
+  private static boolean nanpInitialized = false;
 
   /** Initializes the Nanp settings, and finds out whether user is in a NANP region. */
   public static void initializeNanpSettings(Context context) {
     final TelephonyManager manager =
         (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
     if (manager != null) {
-      sUserSimCountryCode = manager.getSimCountryIso();
+      userSimCountryCode = manager.getSimCountryIso();
     }
 
     final SharedPreferences prefs =
         PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext());
 
-    if (sUserSimCountryCode != null) {
+    if (userSimCountryCode != null) {
       /** Updates shared preferences with the latest country obtained from getSimCountryIso. */
-      prefs.edit().putString(PREF_USER_SIM_COUNTRY_CODE, sUserSimCountryCode).apply();
+      prefs.edit().putString(PREF_USER_SIM_COUNTRY_CODE, userSimCountryCode).apply();
     } else {
       /** Uses previously stored country code if loading fails. */
-      sUserSimCountryCode =
+      userSimCountryCode =
           prefs.getString(PREF_USER_SIM_COUNTRY_CODE, PREF_USER_SIM_COUNTRY_CODE_DEFAULT);
     }
     /** Queries the NANP country list to find out whether user is in a NANP region. */
-    sUserInNanpRegion = isCountryNanp(sUserSimCountryCode);
-    sNanpInitialized = true;
+    userInNanpRegion = isCountryNanp(userSimCountryCode);
+    nanpInitialized = true;
   }
 
   /**
@@ -255,7 +255,7 @@
          */
         if ((normalizedNumber.length() == 11)
             && (normalizedNumber.charAt(0) == '1')
-            && (sUserInNanpRegion)) {
+            && (userInNanpRegion)) {
           countryCode = "1";
           countryCodeOffset = number.indexOf(normalizedNumber.charAt(1));
           if (countryCodeOffset == -1) {
@@ -265,7 +265,7 @@
       }
 
       /** If user is in NANP region, finds out whether a number is in NANP format. */
-      if (sUserInNanpRegion) {
+      if (userInNanpRegion) {
         String areaCode = "";
         if (countryCode.equals("") && normalizedNumber.length() == 10) {
           /**
@@ -292,10 +292,10 @@
 
   /** Checkes whether a country code is valid. */
   private static boolean isValidCountryCode(String countryCode) {
-    if (sCountryCodes == null) {
-      sCountryCodes = initCountryCodes();
+    if (countryCodes == null) {
+      countryCodes = initCountryCodes();
     }
-    return sCountryCodes.contains(countryCode);
+    return countryCodes.contains(countryCode);
   }
 
   private static Set<String> initCountryCodes() {
@@ -531,10 +531,10 @@
     if (TextUtils.isEmpty(country)) {
       return false;
     }
-    if (sNanpCountries == null) {
-      sNanpCountries = initNanpCountries();
+    if (nanpCountries == null) {
+      nanpCountries = initNanpCountries();
     }
-    return sNanpCountries.contains(country.toUpperCase());
+    return nanpCountries.contains(country.toUpperCase());
   }
 
   private static Set<String> initNanpCountries() {
@@ -572,13 +572,13 @@
    * @return Whether user is in Nanp region.
    */
   public static boolean getUserInNanpRegion() {
-    return sUserInNanpRegion;
+    return userInNanpRegion;
   }
 
   /** Explicitly setting the user Nanp to the given boolean */
   @VisibleForTesting
   public static void setUserInNanpRegion(boolean userInNanpRegion) {
-    sUserInNanpRegion = userInNanpRegion;
+    SmartDialPrefix.userInNanpRegion = userInNanpRegion;
   }
 
   /** Class to record phone number parsing information. */
diff --git a/java/com/android/dialer/telecom/TelecomUtil.java b/java/com/android/dialer/telecom/TelecomUtil.java
index c64a502..f79ca86 100644
--- a/java/com/android/dialer/telecom/TelecomUtil.java
+++ b/java/com/android/dialer/telecom/TelecomUtil.java
@@ -52,7 +52,7 @@
 public abstract class TelecomUtil {
 
   private static final String TAG = "TelecomUtil";
-  private static boolean sWarningLogged = false;
+  private static boolean warningLogged = false;
 
   private static TelecomUtilImpl instance = new TelecomUtilImpl();
 
@@ -326,12 +326,12 @@
           TextUtils.equals(
               context.getPackageName(), getTelecomManager(context).getDefaultDialerPackage());
       if (result) {
-        sWarningLogged = false;
+        warningLogged = false;
       } else {
-        if (!sWarningLogged) {
+        if (!warningLogged) {
           // Log only once to prevent spam.
           LogUtil.w(TAG, "Dialer is not currently set to be default dialer");
-          sWarningLogged = true;
+          warningLogged = true;
         }
       }
       return result;
diff --git a/java/com/android/dialer/util/ExpirableCache.java b/java/com/android/dialer/util/ExpirableCache.java
index 2778a57..a1b0afd 100644
--- a/java/com/android/dialer/util/ExpirableCache.java
+++ b/java/com/android/dialer/util/ExpirableCache.java
@@ -98,13 +98,13 @@
    *
    * @see ExpirableCache.CachedValue#isExpired()
    */
-  private final AtomicInteger mGeneration;
+  private final AtomicInteger generation;
   /** The underlying cache used to stored the cached values. */
-  private LruCache<K, CachedValue<V>> mCache;
+  private LruCache<K, CachedValue<V>> cache;
 
   private ExpirableCache(LruCache<K, CachedValue<V>> cache) {
-    mCache = cache;
-    mGeneration = new AtomicInteger(0);
+    this.cache = cache;
+    generation = new AtomicInteger(0);
   }
 
   /**
@@ -147,7 +147,7 @@
    * @param key the key to look up
    */
   public CachedValue<V> getCachedValue(K key) {
-    return mCache.get(key);
+    return cache.get(key);
   }
 
   /**
@@ -190,7 +190,7 @@
    * @param value the value to associate with the key
    */
   public void put(K key, V value) {
-    mCache.put(key, newCachedValue(value));
+    cache.put(key, newCachedValue(value));
   }
 
   /**
@@ -201,7 +201,7 @@
    * <p>Expiring the items in the cache does not imply they will be evicted.
    */
   public void expireAll() {
-    mGeneration.incrementAndGet();
+    generation.incrementAndGet();
   }
 
   /**
@@ -210,7 +210,7 @@
    * <p>Implementation of {@link LruCache#create(K)} can use this method to create a new entry.
    */
   public CachedValue<V> newCachedValue(V value) {
-    return new GenerationalCachedValue<V>(value, mGeneration);
+    return new GenerationalCachedValue<V>(value, generation);
   }
 
   /**
@@ -239,31 +239,31 @@
   private static class GenerationalCachedValue<V> implements ExpirableCache.CachedValue<V> {
 
     /** The value stored in the cache. */
-    public final V mValue;
+    public final V value;
     /** The generation at which the value was added to the cache. */
-    private final int mGeneration;
+    private final int generation;
     /** The atomic integer storing the current generation of the cache it belongs to. */
-    private final AtomicInteger mCacheGeneration;
+    private final AtomicInteger cacheGeneration;
 
     /**
      * @param cacheGeneration the atomic integer storing the generation of the cache in which this
      *     value will be stored
      */
     public GenerationalCachedValue(V value, AtomicInteger cacheGeneration) {
-      mValue = value;
-      mCacheGeneration = cacheGeneration;
+      this.value = value;
+      this.cacheGeneration = cacheGeneration;
       // Snapshot the current generation.
-      mGeneration = mCacheGeneration.get();
+      generation = this.cacheGeneration.get();
     }
 
     @Override
     public V getValue() {
-      return mValue;
+      return value;
     }
 
     @Override
     public boolean isExpired() {
-      return mGeneration != mCacheGeneration.get();
+      return generation != cacheGeneration.get();
     }
   }
 }
diff --git a/java/com/android/dialer/util/TouchPointManager.java b/java/com/android/dialer/util/TouchPointManager.java
index 0bd7371..ad5b007 100644
--- a/java/com/android/dialer/util/TouchPointManager.java
+++ b/java/com/android/dialer/util/TouchPointManager.java
@@ -27,23 +27,23 @@
 
   public static final String TOUCH_POINT = "touchPoint";
 
-  private static TouchPointManager sInstance = new TouchPointManager();
+  private static TouchPointManager instance = new TouchPointManager();
 
-  private Point mPoint = new Point();
+  private Point point = new Point();
 
   /** Private constructor. Instance should only be acquired through getRunningInstance(). */
   private TouchPointManager() {}
 
   public static TouchPointManager getInstance() {
-    return sInstance;
+    return instance;
   }
 
   public Point getPoint() {
-    return mPoint;
+    return point;
   }
 
   public void setPoint(int x, int y) {
-    mPoint.set(x, y);
+    point.set(x, y);
   }
 
   /**
@@ -55,6 +55,6 @@
    *     (0,0).
    */
   public boolean hasValidPoint() {
-    return mPoint.x != 0 || mPoint.y != 0;
+    return point.x != 0 || point.y != 0;
   }
 }
diff --git a/java/com/android/dialer/util/TransactionSafeActivity.java b/java/com/android/dialer/util/TransactionSafeActivity.java
index 9b5e92b..aa47249 100644
--- a/java/com/android/dialer/util/TransactionSafeActivity.java
+++ b/java/com/android/dialer/util/TransactionSafeActivity.java
@@ -25,30 +25,30 @@
  */
 public abstract class TransactionSafeActivity extends AppCompatActivity {
 
-  private boolean mIsSafeToCommitTransactions;
+  private boolean isSafeToCommitTransactions;
 
   @Override
   protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
-    mIsSafeToCommitTransactions = true;
+    isSafeToCommitTransactions = true;
   }
 
   @Override
   protected void onStart() {
     super.onStart();
-    mIsSafeToCommitTransactions = true;
+    isSafeToCommitTransactions = true;
   }
 
   @Override
   protected void onResume() {
     super.onResume();
-    mIsSafeToCommitTransactions = true;
+    isSafeToCommitTransactions = true;
   }
 
   @Override
   protected void onSaveInstanceState(Bundle outState) {
     super.onSaveInstanceState(outState);
-    mIsSafeToCommitTransactions = false;
+    isSafeToCommitTransactions = false;
   }
 
   /**
@@ -59,6 +59,6 @@
    * outState)} (if that method is overridden), so the flag is properly set.
    */
   public boolean isSafeToCommitTransactions() {
-    return mIsSafeToCommitTransactions;
+    return isSafeToCommitTransactions;
   }
 }
diff --git a/java/com/android/dialer/voicemail/settings/VoicemailChangePinActivity.java b/java/com/android/dialer/voicemail/settings/VoicemailChangePinActivity.java
index 13ca5b7..4e22fb3 100644
--- a/java/com/android/dialer/voicemail/settings/VoicemailChangePinActivity.java
+++ b/java/com/android/dialer/voicemail/settings/VoicemailChangePinActivity.java
@@ -71,8 +71,8 @@
 
   private static final int MESSAGE_HANDLE_RESULT = 1;
 
-  private PhoneAccountHandle mPhoneAccountHandle;
-  private PinChanger mPinChanger;
+  private PhoneAccountHandle phoneAccountHandle;
+  private PinChanger pinChanger;
 
   private static class ChangePinParams {
     PinChanger pinChanger;
@@ -81,25 +81,25 @@
     String newPin;
   }
 
-  private DialerExecutor<ChangePinParams> mChangePinExecutor;
+  private DialerExecutor<ChangePinParams> changePinExecutor;
 
-  private int mPinMinLength;
-  private int mPinMaxLength;
+  private int pinMinLength;
+  private int pinMaxLength;
 
-  private State mUiState = State.Initial;
-  private String mOldPin;
-  private String mFirstPin;
+  private State uiState = State.Initial;
+  private String oldPin;
+  private String firstPin;
 
-  private ProgressDialog mProgressDialog;
+  private ProgressDialog progressDialog;
 
-  private TextView mHeaderText;
-  private TextView mHintText;
-  private TextView mErrorText;
-  private EditText mPinEntry;
-  private Button mCancelButton;
-  private Button mNextButton;
+  private TextView headerText;
+  private TextView hintText;
+  private TextView errorText;
+  private EditText pinEntry;
+  private Button cancelButton;
+  private Button nextButton;
 
-  private Handler mHandler = new ChangePinHandler(new WeakReference<>(this));
+  private Handler handler = new ChangePinHandler(new WeakReference<>(this));
 
   private enum State {
     /**
@@ -116,9 +116,9 @@
       @Override
       public void onEnter(VoicemailChangePinActivity activity) {
         activity.setHeader(R.string.change_pin_enter_old_pin_header);
-        activity.mHintText.setText(R.string.change_pin_enter_old_pin_hint);
-        activity.mNextButton.setText(R.string.change_pin_continue_label);
-        activity.mErrorText.setText(null);
+        activity.hintText.setText(R.string.change_pin_enter_old_pin_hint);
+        activity.nextButton.setText(R.string.change_pin_continue_label);
+        activity.errorText.setText(null);
       }
 
       @Override
@@ -128,7 +128,7 @@
 
       @Override
       public void handleNext(VoicemailChangePinActivity activity) {
-        activity.mOldPin = activity.getCurrentPasswordInput();
+        activity.oldPin = activity.getCurrentPasswordInput();
         activity.verifyOldPin();
       }
 
@@ -139,7 +139,7 @@
         } else {
           CharSequence message = activity.getChangePinResultMessage(result);
           activity.showError(message);
-          activity.mPinEntry.setText("");
+          activity.pinEntry.setText("");
         }
       }
     },
@@ -179,7 +179,7 @@
           // through other means, or the generated pin is invalid
           // Wipe the default old PIN so the old PIN input box will be shown to the user
           // on the next time.
-          activity.mPinChanger.setScrambledPin(null);
+          activity.pinChanger.setScrambledPin(null);
           activity.updateState(State.EnterOldPin);
         }
       }
@@ -196,13 +196,13 @@
     EnterNewPin {
       @Override
       public void onEnter(VoicemailChangePinActivity activity) {
-        activity.mHeaderText.setText(R.string.change_pin_enter_new_pin_header);
-        activity.mNextButton.setText(R.string.change_pin_continue_label);
-        activity.mHintText.setText(
+        activity.headerText.setText(R.string.change_pin_enter_new_pin_header);
+        activity.nextButton.setText(R.string.change_pin_continue_label);
+        activity.hintText.setText(
             activity.getString(
                 R.string.change_pin_enter_new_pin_hint,
-                activity.mPinMinLength,
-                activity.mPinMaxLength));
+                activity.pinMinLength,
+                activity.pinMaxLength));
       }
 
       @Override
@@ -214,10 +214,10 @@
         }
         CharSequence error = activity.validatePassword(password);
         if (error != null) {
-          activity.mErrorText.setText(error);
+          activity.errorText.setText(error);
           activity.setNextEnabled(false);
         } else {
-          activity.mErrorText.setText(null);
+          activity.errorText.setText(null);
           activity.setNextEnabled(true);
         }
       }
@@ -230,7 +230,7 @@
           activity.showError(errorMsg);
           return;
         }
-        activity.mFirstPin = activity.getCurrentPasswordInput();
+        activity.firstPin = activity.getCurrentPasswordInput();
         activity.updateState(State.ConfirmNewPin);
       }
     },
@@ -242,9 +242,9 @@
     ConfirmNewPin {
       @Override
       public void onEnter(VoicemailChangePinActivity activity) {
-        activity.mHeaderText.setText(R.string.change_pin_confirm_pin_header);
-        activity.mHintText.setText(null);
-        activity.mNextButton.setText(R.string.change_pin_ok_label);
+        activity.headerText.setText(R.string.change_pin_confirm_pin_header);
+        activity.hintText.setText(null);
+        activity.nextButton.setText(R.string.change_pin_ok_label);
       }
 
       @Override
@@ -253,12 +253,12 @@
           activity.setNextEnabled(false);
           return;
         }
-        if (activity.getCurrentPasswordInput().equals(activity.mFirstPin)) {
+        if (activity.getCurrentPasswordInput().equals(activity.firstPin)) {
           activity.setNextEnabled(true);
-          activity.mErrorText.setText(null);
+          activity.errorText.setText(null);
         } else {
           activity.setNextEnabled(false);
-          activity.mErrorText.setText(R.string.change_pin_confirm_pins_dont_match);
+          activity.errorText.setText(R.string.change_pin_confirm_pins_dont_match);
         }
       }
 
@@ -268,7 +268,7 @@
           // If the PIN change succeeded we no longer know what the old (current) PIN is.
           // Wipe the default old PIN so the old PIN input box will be shown to the user
           // on the next time.
-          activity.mPinChanger.setScrambledPin(null);
+          activity.pinChanger.setScrambledPin(null);
 
           activity.finish();
           Logger.get(activity).logImpression(DialerImpression.Type.VVM_CHANGE_PIN_COMPLETED);
@@ -291,7 +291,7 @@
 
       @Override
       public void handleNext(VoicemailChangePinActivity activity) {
-        activity.processPinChange(activity.mOldPin, activity.mFirstPin);
+        activity.processPinChange(activity.oldPin, activity.firstPin);
       }
     };
 
@@ -328,12 +328,11 @@
   public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
 
-    mPhoneAccountHandle =
-        getIntent().getParcelableExtra(VoicemailClient.PARAM_PHONE_ACCOUNT_HANDLE);
-    mPinChanger =
+    phoneAccountHandle = getIntent().getParcelableExtra(VoicemailClient.PARAM_PHONE_ACCOUNT_HANDLE);
+    pinChanger =
         VoicemailComponent.get(this)
             .getVoicemailClient()
-            .createPinChanger(getApplicationContext(), mPhoneAccountHandle);
+            .createPinChanger(getApplicationContext(), phoneAccountHandle);
     setContentView(R.layout.voicemail_change_pin);
     setTitle(R.string.change_pin_title);
 
@@ -341,23 +340,23 @@
 
     View view = findViewById(android.R.id.content);
 
-    mCancelButton = (Button) view.findViewById(R.id.cancel_button);
-    mCancelButton.setOnClickListener(this);
-    mNextButton = (Button) view.findViewById(R.id.next_button);
-    mNextButton.setOnClickListener(this);
+    cancelButton = (Button) view.findViewById(R.id.cancel_button);
+    cancelButton.setOnClickListener(this);
+    nextButton = (Button) view.findViewById(R.id.next_button);
+    nextButton.setOnClickListener(this);
 
-    mPinEntry = (EditText) view.findViewById(R.id.pin_entry);
-    mPinEntry.setOnEditorActionListener(this);
-    mPinEntry.addTextChangedListener(this);
-    if (mPinMaxLength != 0) {
-      mPinEntry.setFilters(new InputFilter[] {new LengthFilter(mPinMaxLength)});
+    pinEntry = (EditText) view.findViewById(R.id.pin_entry);
+    pinEntry.setOnEditorActionListener(this);
+    pinEntry.addTextChangedListener(this);
+    if (pinMaxLength != 0) {
+      pinEntry.setFilters(new InputFilter[] {new LengthFilter(pinMaxLength)});
     }
 
-    mHeaderText = (TextView) view.findViewById(R.id.headerText);
-    mHintText = (TextView) view.findViewById(R.id.hintText);
-    mErrorText = (TextView) view.findViewById(R.id.errorText);
+    headerText = (TextView) view.findViewById(R.id.headerText);
+    hintText = (TextView) view.findViewById(R.id.hintText);
+    errorText = (TextView) view.findViewById(R.id.errorText);
 
-    mChangePinExecutor =
+    changePinExecutor =
         DialerExecutorComponent.get(this)
             .dialerExecutorFactory()
             .createUiTaskBuilder(getFragmentManager(), "changePin", new ChangePinWorker())
@@ -365,8 +364,8 @@
             .onFailure((tr) -> sendResult(PinChanger.CHANGE_PIN_SYSTEM_ERROR))
             .build();
 
-    if (isPinScrambled(this, mPhoneAccountHandle)) {
-      mOldPin = mPinChanger.getScrambledPin();
+    if (isPinScrambled(this, phoneAccountHandle)) {
+      oldPin = pinChanger.getScrambledPin();
       updateState(State.VerifyOldPin);
     } else {
       updateState(State.EnterOldPin);
@@ -375,22 +374,22 @@
 
   /** Extracts the pin length requirement sent by the server with a STATUS SMS. */
   private void readPinLength() {
-    PinSpecification pinSpecification = mPinChanger.getPinSpecification();
-    mPinMinLength = pinSpecification.minLength;
-    mPinMaxLength = pinSpecification.maxLength;
+    PinSpecification pinSpecification = pinChanger.getPinSpecification();
+    pinMinLength = pinSpecification.minLength;
+    pinMaxLength = pinSpecification.maxLength;
   }
 
   @Override
   public void onResume() {
     super.onResume();
-    updateState(mUiState);
+    updateState(uiState);
   }
 
   public void handleNext() {
-    if (mPinEntry.length() == 0) {
+    if (pinEntry.length() == 0) {
       return;
     }
-    mUiState.handleNext(this);
+    uiState.handleNext(this);
   }
 
   @Override
@@ -413,7 +412,7 @@
 
   @Override
   public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
-    if (!mNextButton.isEnabled()) {
+    if (!nextButton.isEnabled()) {
       return true;
     }
     // Check if this was the result of hitting the enter or "done" key
@@ -428,7 +427,7 @@
 
   @Override
   public void afterTextChanged(Editable s) {
-    mUiState.onInputChanged(this);
+    uiState.onInputChanged(this);
   }
 
   @Override
@@ -454,18 +453,18 @@
   }
 
   private String getCurrentPasswordInput() {
-    return mPinEntry.getText().toString();
+    return pinEntry.getText().toString();
   }
 
   private void updateState(State state) {
-    State previousState = mUiState;
-    mUiState = state;
+    State previousState = uiState;
+    uiState = state;
     if (previousState != state) {
       previousState.onLeave(this);
-      mPinEntry.setText("");
-      mUiState.onEnter(this);
+      pinEntry.setText("");
+      uiState.onEnter(this);
     }
-    mUiState.onInputChanged(this);
+    uiState.onInputChanged(this);
   }
 
   /**
@@ -475,21 +474,21 @@
    * @return error message to show to user or null if password is OK
    */
   private CharSequence validatePassword(String password) {
-    if (mPinMinLength == 0 && mPinMaxLength == 0) {
+    if (pinMinLength == 0 && pinMaxLength == 0) {
       // Invalid length requirement is sent by the server, just accept anything and let the
       // server decide.
       return null;
     }
 
-    if (password.length() < mPinMinLength) {
+    if (password.length() < pinMinLength) {
       return getString(R.string.vm_change_pin_error_too_short);
     }
     return null;
   }
 
   private void setHeader(int text) {
-    mHeaderText.setText(text);
-    mPinEntry.setContentDescription(mHeaderText.getText());
+    headerText.setText(text);
+    pinEntry.setContentDescription(headerText.getText());
   }
 
   /**
@@ -517,11 +516,11 @@
   }
 
   private void verifyOldPin() {
-    processPinChange(mOldPin, mOldPin);
+    processPinChange(oldPin, oldPin);
   }
 
   private void setNextEnabled(boolean enabled) {
-    mNextButton.setEnabled(enabled);
+    nextButton.setEnabled(enabled);
   }
 
   private void showError(CharSequence message) {
@@ -538,30 +537,30 @@
 
   /** Asynchronous call to change the PIN on the server. */
   private void processPinChange(String oldPin, String newPin) {
-    mProgressDialog = new ProgressDialog(this);
-    mProgressDialog.setCancelable(false);
-    mProgressDialog.setMessage(getString(R.string.vm_change_pin_progress_message));
-    mProgressDialog.show();
+    progressDialog = new ProgressDialog(this);
+    progressDialog.setCancelable(false);
+    progressDialog.setMessage(getString(R.string.vm_change_pin_progress_message));
+    progressDialog.show();
 
     ChangePinParams params = new ChangePinParams();
-    params.pinChanger = mPinChanger;
-    params.phoneAccountHandle = mPhoneAccountHandle;
+    params.pinChanger = pinChanger;
+    params.phoneAccountHandle = phoneAccountHandle;
     params.oldPin = oldPin;
     params.newPin = newPin;
 
-    mChangePinExecutor.executeSerial(params);
+    changePinExecutor.executeSerial(params);
   }
 
   private void sendResult(@ChangePinResult int result) {
     LogUtil.i(TAG, "Change PIN result: " + result);
-    if (mProgressDialog.isShowing()
+    if (progressDialog.isShowing()
         && !VoicemailChangePinActivity.this.isDestroyed()
         && !VoicemailChangePinActivity.this.isFinishing()) {
-      mProgressDialog.dismiss();
+      progressDialog.dismiss();
     } else {
       LogUtil.i(TAG, "Dialog not visible, not dismissing");
     }
-    mHandler.obtainMessage(MESSAGE_HANDLE_RESULT, result, 0).sendToTarget();
+    handler.obtainMessage(MESSAGE_HANDLE_RESULT, result, 0).sendToTarget();
   }
 
   private static class ChangePinHandler extends Handler {
@@ -579,7 +578,7 @@
         return;
       }
       if (message.what == MESSAGE_HANDLE_RESULT) {
-        activity.mUiState.handleResult(activity, message.arg1);
+        activity.uiState.handleResult(activity, message.arg1);
       }
     }
   }
diff --git a/java/com/android/dialer/voicemailstatus/VisualVoicemailEnabledChecker.java b/java/com/android/dialer/voicemailstatus/VisualVoicemailEnabledChecker.java
index 3f519ad..8010e02 100644
--- a/java/com/android/dialer/voicemailstatus/VisualVoicemailEnabledChecker.java
+++ b/java/com/android/dialer/voicemailstatus/VisualVoicemailEnabledChecker.java
@@ -42,17 +42,17 @@
 
   public static final String PREF_KEY_HAS_ACTIVE_VOICEMAIL_PROVIDER =
       "has_active_voicemail_provider";
-  private SharedPreferences mPrefs;
-  private boolean mHasActiveVoicemailProvider;
-  private CallLogQueryHandler mCallLogQueryHandler;
-  private Context mContext;
-  private Callback mCallback;
+  private SharedPreferences prefs;
+  private boolean hasActiveVoicemailProvider;
+  private CallLogQueryHandler callLogQueryHandler;
+  private Context context;
+  private Callback callback;
 
   public VisualVoicemailEnabledChecker(Context context, @Nullable Callback callback) {
-    mContext = context;
-    mCallback = callback;
-    mPrefs = PreferenceManager.getDefaultSharedPreferences(mContext);
-    mHasActiveVoicemailProvider = mPrefs.getBoolean(PREF_KEY_HAS_ACTIVE_VOICEMAIL_PROVIDER, false);
+    this.context = context;
+    this.callback = callback;
+    prefs = PreferenceManager.getDefaultSharedPreferences(this.context);
+    hasActiveVoicemailProvider = prefs.getBoolean(PREF_KEY_HAS_ACTIVE_VOICEMAIL_PROVIDER, false);
   }
 
   /**
@@ -60,7 +60,7 @@
    *     result.
    */
   public boolean isVisualVoicemailEnabled() {
-    return mHasActiveVoicemailProvider;
+    return hasActiveVoicemailProvider;
   }
 
   /**
@@ -68,22 +68,22 @@
    * has changed, Callback.onVisualVoicemailEnabledStatusChanged() will be called.
    */
   public void asyncUpdate() {
-    mCallLogQueryHandler = new CallLogQueryHandler(mContext, mContext.getContentResolver(), this);
-    mCallLogQueryHandler.fetchVoicemailStatus();
+    callLogQueryHandler = new CallLogQueryHandler(context, context.getContentResolver(), this);
+    callLogQueryHandler.fetchVoicemailStatus();
   }
 
   @Override
   public void onVoicemailStatusFetched(Cursor statusCursor) {
     boolean hasActiveVoicemailProvider =
         VoicemailStatusHelper.getNumberActivityVoicemailSources(statusCursor) > 0;
-    if (hasActiveVoicemailProvider != mHasActiveVoicemailProvider) {
-      mHasActiveVoicemailProvider = hasActiveVoicemailProvider;
-      mPrefs
+    if (hasActiveVoicemailProvider != this.hasActiveVoicemailProvider) {
+      this.hasActiveVoicemailProvider = hasActiveVoicemailProvider;
+      prefs
           .edit()
-          .putBoolean(PREF_KEY_HAS_ACTIVE_VOICEMAIL_PROVIDER, mHasActiveVoicemailProvider)
+          .putBoolean(PREF_KEY_HAS_ACTIVE_VOICEMAIL_PROVIDER, this.hasActiveVoicemailProvider)
           .apply();
-      if (mCallback != null) {
-        mCallback.onVisualVoicemailEnabledStatusChanged(mHasActiveVoicemailProvider);
+      if (callback != null) {
+        callback.onVisualVoicemailEnabledStatusChanged(this.hasActiveVoicemailProvider);
       }
     }
   }
diff --git a/java/com/android/dialer/widget/EmptyContentView.java b/java/com/android/dialer/widget/EmptyContentView.java
index a76ab98..5c2e4d5 100644
--- a/java/com/android/dialer/widget/EmptyContentView.java
+++ b/java/com/android/dialer/widget/EmptyContentView.java
@@ -35,10 +35,10 @@
   public static final int NO_LABEL = 0;
   public static final int NO_IMAGE = 0;
 
-  private ImageView mImageView;
-  private TextView mDescriptionView;
-  private TextView mActionView;
-  private OnEmptyViewActionButtonClickedListener mOnActionButtonClickedListener;
+  private ImageView imageView;
+  private TextView descriptionView;
+  private TextView actionView;
+  private OnEmptyViewActionButtonClickedListener onActionButtonClickedListener;
 
   private @StringRes int actionLabel;
 
@@ -60,40 +60,40 @@
 
     // Don't let touches fall through the empty view.
     setClickable(true);
-    mImageView = (ImageView) findViewById(R.id.empty_list_view_image);
-    mDescriptionView = (TextView) findViewById(R.id.empty_list_view_message);
-    mActionView = (TextView) findViewById(R.id.empty_list_view_action);
-    mActionView.setOnClickListener(this);
+    imageView = (ImageView) findViewById(R.id.empty_list_view_image);
+    descriptionView = (TextView) findViewById(R.id.empty_list_view_message);
+    actionView = (TextView) findViewById(R.id.empty_list_view_action);
+    actionView.setOnClickListener(this);
   }
 
   public void setDescription(int resourceId) {
     if (resourceId == NO_LABEL) {
-      mDescriptionView.setText(null);
-      mDescriptionView.setVisibility(View.GONE);
+      descriptionView.setText(null);
+      descriptionView.setVisibility(View.GONE);
     } else {
-      mDescriptionView.setText(resourceId);
-      mDescriptionView.setVisibility(View.VISIBLE);
+      descriptionView.setText(resourceId);
+      descriptionView.setVisibility(View.VISIBLE);
     }
   }
 
   public void setImage(int resourceId) {
     if (resourceId == NO_LABEL) {
-      mImageView.setImageDrawable(null);
-      mImageView.setVisibility(View.GONE);
+      imageView.setImageDrawable(null);
+      imageView.setVisibility(View.GONE);
     } else {
-      mImageView.setImageResource(resourceId);
-      mImageView.setVisibility(View.VISIBLE);
+      imageView.setImageResource(resourceId);
+      imageView.setVisibility(View.VISIBLE);
     }
   }
 
   public void setActionLabel(@StringRes int resourceId) {
     actionLabel = resourceId;
     if (resourceId == NO_LABEL) {
-      mActionView.setText(null);
-      mActionView.setVisibility(View.GONE);
+      actionView.setText(null);
+      actionView.setVisibility(View.GONE);
     } else {
-      mActionView.setText(resourceId);
-      mActionView.setVisibility(View.VISIBLE);
+      actionView.setText(resourceId);
+      actionView.setVisibility(View.VISIBLE);
     }
   }
 
@@ -102,19 +102,19 @@
   }
 
   public boolean isShowingContent() {
-    return mImageView.getVisibility() == View.VISIBLE
-        || mDescriptionView.getVisibility() == View.VISIBLE
-        || mActionView.getVisibility() == View.VISIBLE;
+    return imageView.getVisibility() == View.VISIBLE
+        || descriptionView.getVisibility() == View.VISIBLE
+        || actionView.getVisibility() == View.VISIBLE;
   }
 
   public void setActionClickedListener(OnEmptyViewActionButtonClickedListener listener) {
-    mOnActionButtonClickedListener = listener;
+    onActionButtonClickedListener = listener;
   }
 
   @Override
   public void onClick(View v) {
-    if (mOnActionButtonClickedListener != null) {
-      mOnActionButtonClickedListener.onEmptyViewActionButtonClicked();
+    if (onActionButtonClickedListener != null) {
+      onActionButtonClickedListener.onEmptyViewActionButtonClicked();
     }
   }
 
diff --git a/java/com/android/dialer/widget/FloatingActionButtonController.java b/java/com/android/dialer/widget/FloatingActionButtonController.java
index 1f9923d..c89c1a8 100644
--- a/java/com/android/dialer/widget/FloatingActionButtonController.java
+++ b/java/com/android/dialer/widget/FloatingActionButtonController.java
@@ -36,24 +36,24 @@
   public static final int ALIGN_QUARTER_END = 1;
   public static final int ALIGN_END = 2;
 
-  private final int mAnimationDuration;
-  private final int mFloatingActionButtonWidth;
-  private final int mFloatingActionButtonMarginRight;
-  private final FloatingActionButton mFab;
-  private final Interpolator mFabInterpolator;
-  private int mFabIconId = -1;
-  private int mScreenWidth;
+  private final int animationDuration;
+  private final int floatingActionButtonWidth;
+  private final int floatingActionButtonMarginRight;
+  private final FloatingActionButton fab;
+  private final Interpolator fabInterpolator;
+  private int fabIconId = -1;
+  private int screenWidth;
 
   public FloatingActionButtonController(Activity activity, FloatingActionButton fab) {
     Resources resources = activity.getResources();
-    mFabInterpolator =
+    fabInterpolator =
         AnimationUtils.loadInterpolator(activity, android.R.interpolator.fast_out_slow_in);
-    mFloatingActionButtonWidth =
+    floatingActionButtonWidth =
         resources.getDimensionPixelSize(R.dimen.floating_action_button_width);
-    mFloatingActionButtonMarginRight =
+    floatingActionButtonMarginRight =
         resources.getDimensionPixelOffset(R.dimen.floating_action_button_margin_right);
-    mAnimationDuration = resources.getInteger(R.integer.floating_action_button_animation_duration);
-    mFab = fab;
+    animationDuration = resources.getInteger(R.integer.floating_action_button_animation_duration);
+    this.fab = fab;
   }
 
   /**
@@ -63,12 +63,12 @@
    * @param screenWidth The width of the screen in pixels.
    */
   public void setScreenWidth(int screenWidth) {
-    mScreenWidth = screenWidth;
+    this.screenWidth = screenWidth;
   }
 
   /** @see FloatingActionButton#isShown() */
   public boolean isVisible() {
-    return mFab.isShown();
+    return fab.isShown();
   }
 
   /**
@@ -86,14 +86,14 @@
   }
 
   public void changeIcon(Context context, @DrawableRes int iconId, String description) {
-    if (this.mFabIconId != iconId) {
-      mFab.setImageResource(iconId);
-      mFab.setImageTintList(
+    if (this.fabIconId != iconId) {
+      fab.setImageResource(iconId);
+      fab.setImageTintList(
           ColorStateList.valueOf(context.getResources().getColor(android.R.color.white)));
-      this.mFabIconId = iconId;
+      this.fabIconId = iconId;
     }
-    if (!mFab.getContentDescription().equals(description)) {
-      mFab.setContentDescription(description);
+    if (!fab.getContentDescription().equals(description)) {
+      fab.setContentDescription(description);
     }
   }
 
@@ -105,7 +105,7 @@
   public void onPageScrolled(float positionOffset) {
     // As the page is scrolling, if we're on the first tab, update the FAB position so it
     // moves along with it.
-    mFab.setTranslationX(positionOffset * getTranslationXForAlignment(ALIGN_END));
+    fab.setTranslationX(positionOffset * getTranslationXForAlignment(ALIGN_END));
   }
 
   /**
@@ -127,38 +127,38 @@
    * @param animate Whether or not to animate the transition.
    */
   private void align(int align, int offsetX, int offsetY, boolean animate) {
-    if (mScreenWidth == 0) {
+    if (screenWidth == 0) {
       return;
     }
 
     int translationX = getTranslationXForAlignment(align);
 
     // Skip animation if container is not shown; animation causes container to show again.
-    if (animate && mFab.isShown()) {
-      mFab.animate()
+    if (animate && fab.isShown()) {
+      fab.animate()
           .translationX(translationX + offsetX)
           .translationY(offsetY)
-          .setInterpolator(mFabInterpolator)
-          .setDuration(mAnimationDuration)
+          .setInterpolator(fabInterpolator)
+          .setDuration(animationDuration)
           .start();
     } else {
-      mFab.setTranslationX(translationX + offsetX);
-      mFab.setTranslationY(offsetY);
+      fab.setTranslationX(translationX + offsetX);
+      fab.setTranslationY(offsetY);
     }
   }
 
   /** @see FloatingActionButton#show() */
   public void scaleIn() {
-    mFab.show();
+    fab.show();
   }
 
   /** @see FloatingActionButton#hide() */
   public void scaleOut() {
-    mFab.hide();
+    fab.hide();
   }
 
   public void scaleOut(OnVisibilityChangedListener listener) {
-    mFab.hide(listener);
+    fab.hide(listener);
   }
 
   /**
@@ -176,12 +176,11 @@
         return 0;
       case ALIGN_QUARTER_END:
         // Moves the FAB a quarter of the screen width.
-        result = mScreenWidth / 4;
+        result = screenWidth / 4;
         break;
       case ALIGN_END:
         // Moves the FAB half the screen width. Same as aligning right with a marginRight.
-        result =
-            mScreenWidth / 2 - mFloatingActionButtonWidth / 2 - mFloatingActionButtonMarginRight;
+        result = screenWidth / 2 - floatingActionButtonWidth / 2 - floatingActionButtonMarginRight;
         break;
       default:
         throw Assert.createIllegalStateFailException("Invalid alignment value: " + align);
@@ -193,6 +192,6 @@
   }
 
   private boolean isLayoutRtl() {
-    return mFab.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
+    return fab.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
   }
 }
diff --git a/java/com/android/dialer/widget/ResizingTextEditText.java b/java/com/android/dialer/widget/ResizingTextEditText.java
index fb894bd..16b7552 100644
--- a/java/com/android/dialer/widget/ResizingTextEditText.java
+++ b/java/com/android/dialer/widget/ResizingTextEditText.java
@@ -25,27 +25,27 @@
 /** EditText which resizes dynamically with respect to text length. */
 public class ResizingTextEditText extends EditText {
 
-  private final int mOriginalTextSize;
-  private final int mMinTextSize;
+  private final int originalTextSize;
+  private final int minTextSize;
 
   public ResizingTextEditText(Context context, AttributeSet attrs) {
     super(context, attrs);
-    mOriginalTextSize = (int) getTextSize();
+    originalTextSize = (int) getTextSize();
     TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ResizingText);
-    mMinTextSize =
-        (int) a.getDimension(R.styleable.ResizingText_resizing_text_min_size, mOriginalTextSize);
+    minTextSize =
+        (int) a.getDimension(R.styleable.ResizingText_resizing_text_min_size, originalTextSize);
     a.recycle();
   }
 
   @Override
   protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
     super.onTextChanged(text, start, lengthBefore, lengthAfter);
-    ViewUtil.resizeText(this, mOriginalTextSize, mMinTextSize);
+    ViewUtil.resizeText(this, originalTextSize, minTextSize);
   }
 
   @Override
   protected void onSizeChanged(int w, int h, int oldw, int oldh) {
     super.onSizeChanged(w, h, oldw, oldh);
-    ViewUtil.resizeText(this, mOriginalTextSize, mMinTextSize);
+    ViewUtil.resizeText(this, originalTextSize, minTextSize);
   }
 }
diff --git a/java/com/android/dialer/widget/ResizingTextTextView.java b/java/com/android/dialer/widget/ResizingTextTextView.java
index 9b62441..100b2ca 100644
--- a/java/com/android/dialer/widget/ResizingTextTextView.java
+++ b/java/com/android/dialer/widget/ResizingTextTextView.java
@@ -25,27 +25,27 @@
 /** TextView which resizes dynamically with respect to text length. */
 public class ResizingTextTextView extends TextView {
 
-  private final int mOriginalTextSize;
-  private final int mMinTextSize;
+  private final int originalTextSize;
+  private final int minTextSize;
 
   public ResizingTextTextView(Context context, AttributeSet attrs) {
     super(context, attrs);
-    mOriginalTextSize = (int) getTextSize();
+    originalTextSize = (int) getTextSize();
     TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ResizingText);
-    mMinTextSize =
-        (int) a.getDimension(R.styleable.ResizingText_resizing_text_min_size, mOriginalTextSize);
+    minTextSize =
+        (int) a.getDimension(R.styleable.ResizingText_resizing_text_min_size, originalTextSize);
     a.recycle();
   }
 
   @Override
   protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
     super.onTextChanged(text, start, lengthBefore, lengthAfter);
-    ViewUtil.resizeText(this, mOriginalTextSize, mMinTextSize);
+    ViewUtil.resizeText(this, originalTextSize, minTextSize);
   }
 
   @Override
   protected void onSizeChanged(int w, int h, int oldw, int oldh) {
     super.onSizeChanged(w, h, oldw, oldh);
-    ViewUtil.resizeText(this, mOriginalTextSize, mMinTextSize);
+    ViewUtil.resizeText(this, originalTextSize, minTextSize);
   }
 }
diff --git a/java/com/android/incallui/AccelerometerListener.java b/java/com/android/incallui/AccelerometerListener.java
index 01f8843..92e62b0 100644
--- a/java/com/android/incallui/AccelerometerListener.java
+++ b/java/com/android/incallui/AccelerometerListener.java
@@ -23,7 +23,7 @@
 import android.hardware.SensorManager;
 import android.os.Handler;
 import android.os.Message;
-import android.util.Log;
+import com.android.dialer.common.LogUtil;
 
 /**
  * This class is used to listen to the accelerometer to monitor the orientation of the phone. The
@@ -42,40 +42,40 @@
   private static final int VERTICAL_DEBOUNCE = 100;
   private static final int HORIZONTAL_DEBOUNCE = 500;
   private static final double VERTICAL_ANGLE = 50.0;
-  private SensorManager mSensorManager;
-  private Sensor mSensor;
+  private SensorManager sensorManager;
+  private Sensor sensor;
   // mOrientation is the orientation value most recently reported to the client.
-  private int mOrientation;
+  private int orientation;
   // mPendingOrientation is the latest orientation computed based on the sensor value.
   // This is sent to the client after a rebounce delay, at which point it is copied to
   // mOrientation.
-  private int mPendingOrientation;
-  private OrientationListener mListener;
-  Handler mHandler =
+  private int pendingOrientation;
+  private OrientationListener listener;
+  Handler handler =
       new Handler() {
         @Override
         public void handleMessage(Message msg) {
           switch (msg.what) {
             case ORIENTATION_CHANGED:
               synchronized (this) {
-                mOrientation = mPendingOrientation;
+                orientation = pendingOrientation;
                 if (DEBUG) {
-                  Log.d(
+                  LogUtil.d(
                       TAG,
                       "orientation: "
-                          + (mOrientation == ORIENTATION_HORIZONTAL
+                          + (orientation == ORIENTATION_HORIZONTAL
                               ? "horizontal"
-                              : (mOrientation == ORIENTATION_VERTICAL ? "vertical" : "unknown")));
+                              : (orientation == ORIENTATION_VERTICAL ? "vertical" : "unknown")));
                 }
-                if (mListener != null) {
-                  mListener.orientationChanged(mOrientation);
+                if (listener != null) {
+                  listener.orientationChanged(orientation);
                 }
               }
               break;
           }
         }
       };
-  SensorEventListener mSensorListener =
+  SensorEventListener sensorListener =
       new SensorEventListener() {
         @Override
         public void onSensorChanged(SensorEvent event) {
@@ -89,34 +89,33 @@
       };
 
   public AccelerometerListener(Context context) {
-    mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
-    mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
+    sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
+    sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
   }
 
   public void setListener(OrientationListener listener) {
-    mListener = listener;
+    this.listener = listener;
   }
 
   public void enable(boolean enable) {
     if (DEBUG) {
-      Log.d(TAG, "enable(" + enable + ")");
+      LogUtil.d(TAG, "enable(" + enable + ")");
     }
     synchronized (this) {
       if (enable) {
-        mOrientation = ORIENTATION_UNKNOWN;
-        mPendingOrientation = ORIENTATION_UNKNOWN;
-        mSensorManager.registerListener(
-            mSensorListener, mSensor, SensorManager.SENSOR_DELAY_NORMAL);
+        orientation = ORIENTATION_UNKNOWN;
+        pendingOrientation = ORIENTATION_UNKNOWN;
+        sensorManager.registerListener(sensorListener, sensor, SensorManager.SENSOR_DELAY_NORMAL);
       } else {
-        mSensorManager.unregisterListener(mSensorListener);
-        mHandler.removeMessages(ORIENTATION_CHANGED);
+        sensorManager.unregisterListener(sensorListener);
+        handler.removeMessages(ORIENTATION_CHANGED);
       }
     }
   }
 
   private void setOrientation(int orientation) {
     synchronized (this) {
-      if (mPendingOrientation == orientation) {
+      if (pendingOrientation == orientation) {
         // Pending orientation has not changed, so do nothing.
         return;
       }
@@ -124,26 +123,26 @@
       // Cancel any pending messages.
       // We will either start a new timer or cancel alltogether
       // if the orientation has not changed.
-      mHandler.removeMessages(ORIENTATION_CHANGED);
+      handler.removeMessages(ORIENTATION_CHANGED);
 
-      if (mOrientation != orientation) {
+      if (this.orientation != orientation) {
         // Set timer to send an event if the orientation has changed since its
         // previously reported value.
-        mPendingOrientation = orientation;
-        final Message m = mHandler.obtainMessage(ORIENTATION_CHANGED);
+        pendingOrientation = orientation;
+        final Message m = handler.obtainMessage(ORIENTATION_CHANGED);
         // set delay to our debounce timeout
         int delay = (orientation == ORIENTATION_VERTICAL ? VERTICAL_DEBOUNCE : HORIZONTAL_DEBOUNCE);
-        mHandler.sendMessageDelayed(m, delay);
+        handler.sendMessageDelayed(m, delay);
       } else {
         // no message is pending
-        mPendingOrientation = ORIENTATION_UNKNOWN;
+        pendingOrientation = ORIENTATION_UNKNOWN;
       }
     }
   }
 
   private void onSensorEvent(double x, double y, double z) {
     if (VDEBUG) {
-      Log.d(TAG, "onSensorEvent(" + x + ", " + y + ", " + z + ")");
+      LogUtil.d(TAG, "onSensorEvent(" + x + ", " + y + ", " + z + ")");
     }
 
     // If some values are exactly zero, then likely the sensor is not powered up yet.
@@ -161,7 +160,7 @@
     final int orientation =
         (angle > VERTICAL_ANGLE ? ORIENTATION_VERTICAL : ORIENTATION_HORIZONTAL);
     if (VDEBUG) {
-      Log.d(TAG, "angle: " + angle + " orientation: " + orientation);
+      LogUtil.d(TAG, "angle: " + angle + " orientation: " + orientation);
     }
     setOrientation(orientation);
   }
diff --git a/java/com/android/incallui/CallButtonPresenter.java b/java/com/android/incallui/CallButtonPresenter.java
index c20642b..88aeaf5 100644
--- a/java/com/android/incallui/CallButtonPresenter.java
+++ b/java/com/android/incallui/CallButtonPresenter.java
@@ -62,22 +62,22 @@
   private static final String KEY_AUTOMATICALLY_MUTED = "incall_key_automatically_muted";
   private static final String KEY_PREVIOUS_MUTE_STATE = "incall_key_previous_mute_state";
 
-  private final Context mContext;
-  private InCallButtonUi mInCallButtonUi;
-  private DialerCall mCall;
-  private boolean mAutomaticallyMuted = false;
-  private boolean mPreviousMuteState = false;
+  private final Context context;
+  private InCallButtonUi inCallButtonUi;
+  private DialerCall call;
+  private boolean automaticallyMuted = false;
+  private boolean previousMuteState = false;
   private boolean isInCallButtonUiReady;
-  private PhoneAccountHandle mOtherAccount;
+  private PhoneAccountHandle otherAccount;
 
   public CallButtonPresenter(Context context) {
-    mContext = context.getApplicationContext();
+    this.context = context.getApplicationContext();
   }
 
   @Override
   public void onInCallButtonUiReady(InCallButtonUi ui) {
     Assert.checkState(!isInCallButtonUiReady);
-    mInCallButtonUi = ui;
+    inCallButtonUi = ui;
     AudioModeProvider.getInstance().addListener(this);
 
     // register for call state changes last
@@ -96,7 +96,7 @@
   @Override
   public void onInCallButtonUiUnready() {
     Assert.checkState(isInCallButtonUiReady);
-    mInCallButtonUi = null;
+    inCallButtonUi = null;
     InCallPresenter.getInstance().removeListener(this);
     AudioModeProvider.getInstance().removeListener(this);
     InCallPresenter.getInstance().removeIncomingCallListener(this);
@@ -110,16 +110,16 @@
   public void onStateChange(InCallState oldState, InCallState newState, CallList callList) {
     Trace.beginSection("CallButtonPresenter.onStateChange");
     if (newState == InCallState.OUTGOING) {
-      mCall = callList.getOutgoingCall();
+      call = callList.getOutgoingCall();
     } else if (newState == InCallState.INCALL) {
-      mCall = callList.getActiveOrBackgroundCall();
+      call = callList.getActiveOrBackgroundCall();
 
       // When connected to voice mail, automatically shows the dialpad.
       // (On previous releases we showed it when in-call shows up, before waiting for
       // OUTGOING.  We may want to do that once we start showing "Voice mail" label on
       // the dialpad too.)
-      if (oldState == InCallState.OUTGOING && mCall != null) {
-        if (mCall.isVoiceMailNumber() && getActivity() != null) {
+      if (oldState == InCallState.OUTGOING && call != null) {
+        if (call.isVoiceMailNumber() && getActivity() != null) {
           getActivity().showDialpadFragment(true /* show */, true /* animate */);
         }
       }
@@ -127,11 +127,11 @@
       if (getActivity() != null) {
         getActivity().showDialpadFragment(false /* show */, true /* animate */);
       }
-      mCall = callList.getIncomingCall();
+      call = callList.getIncomingCall();
     } else {
-      mCall = null;
+      call = null;
     }
-    updateUi(newState, mCall);
+    updateUi(newState, call);
     Trace.endSection();
   }
 
@@ -146,7 +146,7 @@
   @Override
   public void onDetailsChanged(DialerCall call, android.telecom.Call.Details details) {
     // Only update if the changes are for the currently active call
-    if (mInCallButtonUi != null && call != null && call.equals(mCall)) {
+    if (inCallButtonUi != null && call != null && call.equals(this.call)) {
       updateButtonsState(call);
     }
   }
@@ -158,15 +158,15 @@
 
   @Override
   public void onCanAddCallChanged(boolean canAddCall) {
-    if (mInCallButtonUi != null && mCall != null) {
-      updateButtonsState(mCall);
+    if (inCallButtonUi != null && call != null) {
+      updateButtonsState(call);
     }
   }
 
   @Override
   public void onAudioStateChanged(CallAudioState audioState) {
-    if (mInCallButtonUi != null) {
-      mInCallButtonUi.setAudioState(audioState);
+    if (inCallButtonUi != null) {
+      inCallButtonUi.setAudioState(audioState);
     }
   }
 
@@ -192,25 +192,25 @@
       // It's clear the UI is wrong, so update the supported mode once again.
       LogUtil.e(
           "CallButtonPresenter", "toggling speakerphone not allowed when bluetooth supported.");
-      mInCallButtonUi.setAudioState(audioState);
+      inCallButtonUi.setAudioState(audioState);
       return;
     }
 
     int newRoute;
     if (audioState.getRoute() == CallAudioState.ROUTE_SPEAKER) {
       newRoute = CallAudioState.ROUTE_WIRED_OR_EARPIECE;
-      Logger.get(mContext)
+      Logger.get(context)
           .logCallImpression(
               DialerImpression.Type.IN_CALL_SCREEN_TURN_ON_WIRED_OR_EARPIECE,
-              mCall.getUniqueCallId(),
-              mCall.getTimeAddedMs());
+              call.getUniqueCallId(),
+              call.getTimeAddedMs());
     } else {
       newRoute = CallAudioState.ROUTE_SPEAKER;
-      Logger.get(mContext)
+      Logger.get(context)
           .logCallImpression(
               DialerImpression.Type.IN_CALL_SCREEN_TURN_ON_SPEAKERPHONE,
-              mCall.getUniqueCallId(),
-              mCall.getTimeAddedMs());
+              call.getUniqueCallId(),
+              call.getTimeAddedMs());
     }
 
     setAudioRoute(newRoute);
@@ -221,61 +221,61 @@
     LogUtil.i(
         "CallButtonPresenter", "turning on mute: %s, clicked by user: %s", checked, clickedByUser);
     if (clickedByUser) {
-      Logger.get(mContext)
+      Logger.get(context)
           .logCallImpression(
               checked
                   ? DialerImpression.Type.IN_CALL_SCREEN_TURN_ON_MUTE
                   : DialerImpression.Type.IN_CALL_SCREEN_TURN_OFF_MUTE,
-              mCall.getUniqueCallId(),
-              mCall.getTimeAddedMs());
+              call.getUniqueCallId(),
+              call.getTimeAddedMs());
     }
     TelecomAdapter.getInstance().mute(checked);
   }
 
   @Override
   public void holdClicked(boolean checked) {
-    if (mCall == null) {
+    if (call == null) {
       return;
     }
     if (checked) {
-      LogUtil.i("CallButtonPresenter", "putting the call on hold: " + mCall);
-      mCall.hold();
+      LogUtil.i("CallButtonPresenter", "putting the call on hold: " + call);
+      call.hold();
     } else {
-      LogUtil.i("CallButtonPresenter", "removing the call from hold: " + mCall);
-      mCall.unhold();
+      LogUtil.i("CallButtonPresenter", "removing the call from hold: " + call);
+      call.unhold();
     }
   }
 
   @Override
   public void swapClicked() {
-    if (mCall == null) {
+    if (call == null) {
       return;
     }
 
-    LogUtil.i("CallButtonPresenter", "swapping the call: " + mCall);
-    TelecomAdapter.getInstance().swap(mCall.getId());
+    LogUtil.i("CallButtonPresenter", "swapping the call: " + call);
+    TelecomAdapter.getInstance().swap(call.getId());
   }
 
   @Override
   public void mergeClicked() {
-    Logger.get(mContext)
+    Logger.get(context)
         .logCallImpression(
             DialerImpression.Type.IN_CALL_MERGE_BUTTON_PRESSED,
-            mCall.getUniqueCallId(),
-            mCall.getTimeAddedMs());
-    TelecomAdapter.getInstance().merge(mCall.getId());
+            call.getUniqueCallId(),
+            call.getTimeAddedMs());
+    TelecomAdapter.getInstance().merge(call.getId());
   }
 
   @Override
   public void addCallClicked() {
-    Logger.get(mContext)
+    Logger.get(context)
         .logCallImpression(
             DialerImpression.Type.IN_CALL_ADD_CALL_BUTTON_PRESSED,
-            mCall.getUniqueCallId(),
-            mCall.getTimeAddedMs());
+            call.getUniqueCallId(),
+            call.getTimeAddedMs());
     // Automatically mute the current call
-    mAutomaticallyMuted = true;
-    mPreviousMuteState = AudioModeProvider.getInstance().getAudioState().isMuted();
+    automaticallyMuted = true;
+    previousMuteState = AudioModeProvider.getInstance().getAudioState().isMuted();
     // Simulate a click on the mute button
     muteClicked(true /* checked */, false /* clickedByUser */);
     TelecomAdapter.getInstance().addCall();
@@ -283,11 +283,11 @@
 
   @Override
   public void showDialpadClicked(boolean checked) {
-    Logger.get(mContext)
+    Logger.get(context)
         .logCallImpression(
             DialerImpression.Type.IN_CALL_SHOW_DIALPAD_BUTTON_PRESSED,
-            mCall.getUniqueCallId(),
-            mCall.getTimeAddedMs());
+            call.getUniqueCallId(),
+            call.getTimeAddedMs());
     LogUtil.v("CallButtonPresenter", "show dialpad " + String.valueOf(checked));
     getActivity().showDialpadFragment(checked /* show */, true /* animate */);
   }
@@ -295,25 +295,25 @@
   @Override
   public void changeToVideoClicked() {
     LogUtil.enterBlock("CallButtonPresenter.changeToVideoClicked");
-    Logger.get(mContext)
+    Logger.get(context)
         .logCallImpression(
             DialerImpression.Type.VIDEO_CALL_UPGRADE_REQUESTED,
-            mCall.getUniqueCallId(),
-            mCall.getTimeAddedMs());
-    mCall.getVideoTech().upgradeToVideo(mContext);
+            call.getUniqueCallId(),
+            call.getTimeAddedMs());
+    call.getVideoTech().upgradeToVideo(context);
   }
 
   @Override
   public void onEndCallClicked() {
-    LogUtil.i("CallButtonPresenter.onEndCallClicked", "call: " + mCall);
-    if (mCall != null) {
-      mCall.disconnect();
+    LogUtil.i("CallButtonPresenter.onEndCallClicked", "call: " + call);
+    if (call != null) {
+      call.disconnect();
     }
   }
 
   @Override
   public void showAudioRouteSelector() {
-    mInCallButtonUi.showAudioRouteSelector();
+    inCallButtonUi.showAudioRouteSelector();
   }
 
   @Override
@@ -323,9 +323,9 @@
     SwapSimWorker worker =
         new SwapSimWorker(
             getContext(),
-            mCall,
+            call,
             InCallPresenter.getInstance().getCallList(),
-            mOtherAccount,
+            otherAccount,
             InCallPresenter.getInstance().acquireInCallUiLock("swapSim"));
     DialerExecutorComponent.get(getContext())
         .dialerExecutorFactory()
@@ -348,14 +348,14 @@
   @Override
   public void toggleCameraClicked() {
     LogUtil.i("CallButtonPresenter.toggleCameraClicked", "");
-    if (mCall == null) {
+    if (call == null) {
       return;
     }
-    Logger.get(mContext)
+    Logger.get(context)
         .logCallImpression(
             DialerImpression.Type.IN_CALL_SCREEN_SWAP_CAMERA,
-            mCall.getUniqueCallId(),
-            mCall.getTimeAddedMs());
+            call.getUniqueCallId(),
+            call.getTimeAddedMs());
     switchCameraClicked(
         !InCallPresenter.getInstance().getInCallCameraManager().isUsingFrontFacingCamera());
   }
@@ -370,25 +370,25 @@
   public void pauseVideoClicked(boolean pause) {
     LogUtil.i("CallButtonPresenter.pauseVideoClicked", "%s", pause ? "pause" : "unpause");
 
-    Logger.get(mContext)
+    Logger.get(context)
         .logCallImpression(
             pause
                 ? DialerImpression.Type.IN_CALL_SCREEN_TURN_OFF_VIDEO
                 : DialerImpression.Type.IN_CALL_SCREEN_TURN_ON_VIDEO,
-            mCall.getUniqueCallId(),
-            mCall.getTimeAddedMs());
+            call.getUniqueCallId(),
+            call.getTimeAddedMs());
 
     if (pause) {
-      mCall.getVideoTech().setCamera(null);
-      mCall.getVideoTech().stopTransmission();
+      call.getVideoTech().setCamera(null);
+      call.getVideoTech().stopTransmission();
     } else {
       updateCamera(
           InCallPresenter.getInstance().getInCallCameraManager().isUsingFrontFacingCamera());
-      mCall.getVideoTech().resumeTransmission(mContext);
+      call.getVideoTech().resumeTransmission(context);
     }
 
-    mInCallButtonUi.setVideoPaused(pause);
-    mInCallButtonUi.enableButton(InCallButtonIds.BUTTON_PAUSE_VIDEO, false);
+    inCallButtonUi.setVideoPaused(pause);
+    inCallButtonUi.enableButton(InCallButtonIds.BUTTON_PAUSE_VIDEO, false);
   }
 
   private void updateCamera(boolean useFrontFacingCamera) {
@@ -401,26 +401,26 @@
           cameraManager.isUsingFrontFacingCamera()
               ? CameraDirection.CAMERA_DIRECTION_FRONT_FACING
               : CameraDirection.CAMERA_DIRECTION_BACK_FACING;
-      mCall.setCameraDir(cameraDir);
-      mCall.getVideoTech().setCamera(cameraId);
+      call.setCameraDir(cameraDir);
+      call.getVideoTech().setCamera(cameraId);
     }
   }
 
   private void updateUi(InCallState state, DialerCall call) {
     LogUtil.v("CallButtonPresenter", "updating call UI for call: %s", call);
 
-    if (mInCallButtonUi == null) {
+    if (inCallButtonUi == null) {
       return;
     }
 
     if (call != null) {
-      mInCallButtonUi.updateInCallButtonUiColors(
+      inCallButtonUi.updateInCallButtonUiColors(
           InCallPresenter.getInstance().getThemeColorManager().getSecondaryColor());
     }
 
     final boolean isEnabled =
         state.isConnectingOrConnected() && !state.isIncoming() && call != null;
-    mInCallButtonUi.setEnabled(isEnabled);
+    inCallButtonUi.setEnabled(isEnabled);
 
     if (call == null) {
       return;
@@ -451,53 +451,53 @@
     final boolean isCallOnHold = call.getState() == DialerCall.State.ONHOLD;
 
     final boolean showAddCall =
-        TelecomAdapter.getInstance().canAddCall() && UserManagerCompat.isUserUnlocked(mContext);
+        TelecomAdapter.getInstance().canAddCall() && UserManagerCompat.isUserUnlocked(context);
     final boolean showMerge = call.can(android.telecom.Call.Details.CAPABILITY_MERGE_CONFERENCE);
     final boolean showUpgradeToVideo = !isVideo && (hasVideoCallCapabilities(call));
     final boolean showDowngradeToAudio = isVideo && isDowngradeToAudioSupported(call);
     final boolean showMute = call.can(android.telecom.Call.Details.CAPABILITY_MUTE);
 
     final boolean hasCameraPermission =
-        isVideo && VideoUtils.hasCameraPermissionAndShownPrivacyToast(mContext);
+        isVideo && VideoUtils.hasCameraPermissionAndShownPrivacyToast(context);
     // Disabling local video doesn't seem to work when dialing. See a bug.
     final boolean showPauseVideo =
         isVideo
             && call.getState() != DialerCall.State.DIALING
             && call.getState() != DialerCall.State.CONNECTING;
 
-    mOtherAccount = TelecomUtil.getOtherAccount(getContext(), call.getAccountHandle());
+    otherAccount = TelecomUtil.getOtherAccount(getContext(), call.getAccountHandle());
     boolean showSwapSim =
-        mOtherAccount != null
+        otherAccount != null
             && !call.isVoiceMailNumber()
             && DialerCall.State.isDialing(call.getState())
             // Most devices cannot make calls on 2 SIMs at the same time.
             && InCallPresenter.getInstance().getCallList().getAllCalls().size() == 1;
 
-    mInCallButtonUi.showButton(InCallButtonIds.BUTTON_AUDIO, true);
-    mInCallButtonUi.showButton(InCallButtonIds.BUTTON_SWAP, showSwap);
-    mInCallButtonUi.showButton(InCallButtonIds.BUTTON_HOLD, showHold);
-    mInCallButtonUi.setHold(isCallOnHold);
-    mInCallButtonUi.showButton(InCallButtonIds.BUTTON_MUTE, showMute);
-    mInCallButtonUi.showButton(InCallButtonIds.BUTTON_SWAP_SIM, showSwapSim);
-    mInCallButtonUi.showButton(InCallButtonIds.BUTTON_ADD_CALL, true);
-    mInCallButtonUi.enableButton(InCallButtonIds.BUTTON_ADD_CALL, showAddCall);
-    mInCallButtonUi.showButton(InCallButtonIds.BUTTON_UPGRADE_TO_VIDEO, showUpgradeToVideo);
-    mInCallButtonUi.showButton(InCallButtonIds.BUTTON_DOWNGRADE_TO_AUDIO, showDowngradeToAudio);
-    mInCallButtonUi.showButton(
+    inCallButtonUi.showButton(InCallButtonIds.BUTTON_AUDIO, true);
+    inCallButtonUi.showButton(InCallButtonIds.BUTTON_SWAP, showSwap);
+    inCallButtonUi.showButton(InCallButtonIds.BUTTON_HOLD, showHold);
+    inCallButtonUi.setHold(isCallOnHold);
+    inCallButtonUi.showButton(InCallButtonIds.BUTTON_MUTE, showMute);
+    inCallButtonUi.showButton(InCallButtonIds.BUTTON_SWAP_SIM, showSwapSim);
+    inCallButtonUi.showButton(InCallButtonIds.BUTTON_ADD_CALL, true);
+    inCallButtonUi.enableButton(InCallButtonIds.BUTTON_ADD_CALL, showAddCall);
+    inCallButtonUi.showButton(InCallButtonIds.BUTTON_UPGRADE_TO_VIDEO, showUpgradeToVideo);
+    inCallButtonUi.showButton(InCallButtonIds.BUTTON_DOWNGRADE_TO_AUDIO, showDowngradeToAudio);
+    inCallButtonUi.showButton(
         InCallButtonIds.BUTTON_SWITCH_CAMERA,
         isVideo && hasCameraPermission && call.getVideoTech().isTransmitting());
-    mInCallButtonUi.showButton(InCallButtonIds.BUTTON_PAUSE_VIDEO, showPauseVideo);
+    inCallButtonUi.showButton(InCallButtonIds.BUTTON_PAUSE_VIDEO, showPauseVideo);
     if (isVideo) {
-      mInCallButtonUi.setVideoPaused(!call.getVideoTech().isTransmitting() || !hasCameraPermission);
+      inCallButtonUi.setVideoPaused(!call.getVideoTech().isTransmitting() || !hasCameraPermission);
     }
-    mInCallButtonUi.showButton(InCallButtonIds.BUTTON_DIALPAD, true);
-    mInCallButtonUi.showButton(InCallButtonIds.BUTTON_MERGE, showMerge);
+    inCallButtonUi.showButton(InCallButtonIds.BUTTON_DIALPAD, true);
+    inCallButtonUi.showButton(InCallButtonIds.BUTTON_MERGE, showMerge);
 
-    mInCallButtonUi.updateButtonStates();
+    inCallButtonUi.updateButtonStates();
   }
 
   private boolean hasVideoCallCapabilities(DialerCall call) {
-    return call.getVideoTech().isAvailable(mContext);
+    return call.getVideoTech().isAvailable(context);
   }
 
   /**
@@ -516,52 +516,51 @@
   @Override
   public void refreshMuteState() {
     // Restore the previous mute state
-    if (mAutomaticallyMuted
-        && AudioModeProvider.getInstance().getAudioState().isMuted() != mPreviousMuteState) {
-      if (mInCallButtonUi == null) {
+    if (automaticallyMuted
+        && AudioModeProvider.getInstance().getAudioState().isMuted() != previousMuteState) {
+      if (inCallButtonUi == null) {
         return;
       }
-      muteClicked(mPreviousMuteState, false /* clickedByUser */);
+      muteClicked(previousMuteState, false /* clickedByUser */);
     }
-    mAutomaticallyMuted = false;
+    automaticallyMuted = false;
   }
 
   @Override
   public void onSaveInstanceState(Bundle outState) {
-    outState.putBoolean(KEY_AUTOMATICALLY_MUTED, mAutomaticallyMuted);
-    outState.putBoolean(KEY_PREVIOUS_MUTE_STATE, mPreviousMuteState);
+    outState.putBoolean(KEY_AUTOMATICALLY_MUTED, automaticallyMuted);
+    outState.putBoolean(KEY_PREVIOUS_MUTE_STATE, previousMuteState);
   }
 
   @Override
   public void onRestoreInstanceState(Bundle savedInstanceState) {
-    mAutomaticallyMuted =
-        savedInstanceState.getBoolean(KEY_AUTOMATICALLY_MUTED, mAutomaticallyMuted);
-    mPreviousMuteState = savedInstanceState.getBoolean(KEY_PREVIOUS_MUTE_STATE, mPreviousMuteState);
+    automaticallyMuted = savedInstanceState.getBoolean(KEY_AUTOMATICALLY_MUTED, automaticallyMuted);
+    previousMuteState = savedInstanceState.getBoolean(KEY_PREVIOUS_MUTE_STATE, previousMuteState);
   }
 
   @Override
   public void onCameraPermissionGranted() {
-    if (mCall != null) {
-      updateButtonsState(mCall);
+    if (call != null) {
+      updateButtonsState(call);
     }
   }
 
   @Override
   public void onActiveCameraSelectionChanged(boolean isUsingFrontFacingCamera) {
-    if (mInCallButtonUi == null) {
+    if (inCallButtonUi == null) {
       return;
     }
-    mInCallButtonUi.setCameraSwitched(!isUsingFrontFacingCamera);
+    inCallButtonUi.setCameraSwitched(!isUsingFrontFacingCamera);
   }
 
   @Override
   public Context getContext() {
-    return mContext;
+    return context;
   }
 
   private InCallActivity getActivity() {
-    if (mInCallButtonUi != null) {
-      Fragment fragment = mInCallButtonUi.getInCallButtonUiFragment();
+    if (inCallButtonUi != null) {
+      Fragment fragment = inCallButtonUi.getInCallButtonUiFragment();
       if (fragment != null) {
         return (InCallActivity) fragment.getActivity();
       }
diff --git a/java/com/android/incallui/CallCardPresenter.java b/java/com/android/incallui/CallCardPresenter.java
index eb52216..67473d7 100644
--- a/java/com/android/incallui/CallCardPresenter.java
+++ b/java/com/android/incallui/CallCardPresenter.java
@@ -113,16 +113,16 @@
 
   private static final long CONFIG_MIN_BATTERY_PERCENT_FOR_EMERGENCY_LOCATION_DEFAULT = 10;
 
-  private final Context mContext;
+  private final Context context;
   private final Handler handler = new Handler();
 
-  private DialerCall mPrimary;
-  private DialerCall mSecondary;
-  private ContactCacheEntry mPrimaryContactInfo;
-  private ContactCacheEntry mSecondaryContactInfo;
-  @Nullable private ContactsPreferences mContactsPreferences;
-  private boolean mIsFullscreen = false;
-  private InCallScreen mInCallScreen;
+  private DialerCall primary;
+  private DialerCall secondary;
+  private ContactCacheEntry primaryContactInfo;
+  private ContactCacheEntry secondaryContactInfo;
+  @Nullable private ContactsPreferences contactsPreferences;
+  private boolean isFullscreen = false;
+  private InCallScreen inCallScreen;
   private boolean isInCallScreenReady;
   private boolean shouldSendAccessibilityEvent;
 
@@ -131,7 +131,7 @@
       new Runnable() {
         @Override
         public void run() {
-          shouldSendAccessibilityEvent = !sendAccessibilityEvent(mContext, getUi());
+          shouldSendAccessibilityEvent = !sendAccessibilityEvent(context, getUi());
           LogUtil.i(
               "CallCardPresenter.sendAccessibilityEventRunnable",
               "still should send: %b",
@@ -144,8 +144,8 @@
 
   public CallCardPresenter(Context context) {
     LogUtil.i("CallCardPresenter.constructor", null);
-    mContext = Assert.isNotNull(context).getApplicationContext();
-    callLocation = CallLocationComponent.get(mContext).getCallLocation();
+    this.context = Assert.isNotNull(context).getApplicationContext();
+    callLocation = CallLocationComponent.get(this.context).getCallLocation();
   }
 
   private static boolean hasCallSubject(DialerCall call) {
@@ -160,18 +160,18 @@
   @Override
   public void onInCallScreenDelegateInit(InCallScreen inCallScreen) {
     Assert.isNotNull(inCallScreen);
-    mInCallScreen = inCallScreen;
-    mContactsPreferences = ContactsPreferencesFactory.newContactsPreferences(mContext);
+    this.inCallScreen = inCallScreen;
+    contactsPreferences = ContactsPreferencesFactory.newContactsPreferences(context);
 
     // Call may be null if disconnect happened already.
     DialerCall call = CallList.getInstance().getFirstCall();
     if (call != null) {
-      mPrimary = call;
-      if (shouldShowNoteSentToast(mPrimary)) {
-        mInCallScreen.showNoteSentToast();
+      primary = call;
+      if (shouldShowNoteSentToast(primary)) {
+        this.inCallScreen.showNoteSentToast();
       }
       call.addListener(this);
-      addCallFeedbackListener(mContext);
+      addCallFeedbackListener(context);
       // start processing lookups right away.
       if (!call.isConferenceCall()) {
         startContactInfoSearch(call, true, call.getState() == DialerCall.State.INCOMING);
@@ -187,12 +187,12 @@
   public void onInCallScreenReady() {
     LogUtil.i("CallCardPresenter.onInCallScreenReady", null);
     Assert.checkState(!isInCallScreenReady);
-    if (mContactsPreferences != null) {
-      mContactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
+    if (contactsPreferences != null) {
+      contactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
     }
 
     // Contact search may have completed before ui is ready.
-    if (mPrimaryContactInfo != null) {
+    if (primaryContactInfo != null) {
       updatePrimaryDisplayInfo();
     }
 
@@ -204,24 +204,24 @@
     isInCallScreenReady = true;
 
     // Log location impressions
-    if (isOutgoingEmergencyCall(mPrimary)) {
-      Logger.get(mContext).logImpression(DialerImpression.Type.EMERGENCY_NEW_EMERGENCY_CALL);
-    } else if (isIncomingEmergencyCall(mPrimary) || isIncomingEmergencyCall(mSecondary)) {
-      Logger.get(mContext).logImpression(DialerImpression.Type.EMERGENCY_CALLBACK);
+    if (isOutgoingEmergencyCall(primary)) {
+      Logger.get(context).logImpression(DialerImpression.Type.EMERGENCY_NEW_EMERGENCY_CALL);
+    } else if (isIncomingEmergencyCall(primary) || isIncomingEmergencyCall(secondary)) {
+      Logger.get(context).logImpression(DialerImpression.Type.EMERGENCY_CALLBACK);
     }
 
     // Showing the location may have been skipped if the UI wasn't ready during previous layout.
     if (shouldShowLocation()) {
-      mInCallScreen.showLocationUi(getLocationFragment());
+      inCallScreen.showLocationUi(getLocationFragment());
 
       // Log location impressions
       if (!hasLocationPermission()) {
-        Logger.get(mContext).logImpression(DialerImpression.Type.EMERGENCY_NO_LOCATION_PERMISSION);
+        Logger.get(context).logImpression(DialerImpression.Type.EMERGENCY_NO_LOCATION_PERMISSION);
       } else if (isBatteryTooLowForEmergencyLocation()) {
-        Logger.get(mContext)
+        Logger.get(context)
             .logImpression(DialerImpression.Type.EMERGENCY_BATTERY_TOO_LOW_TO_GET_LOCATION);
-      } else if (!callLocation.canGetLocation(mContext)) {
-        Logger.get(mContext).logImpression(DialerImpression.Type.EMERGENCY_CANT_GET_LOCATION);
+      } else if (!callLocation.canGetLocation(context)) {
+        Logger.get(context).logImpression(DialerImpression.Type.EMERGENCY_CANT_GET_LOCATION);
       }
     }
   }
@@ -236,15 +236,15 @@
     InCallPresenter.getInstance().removeIncomingCallListener(this);
     InCallPresenter.getInstance().removeDetailsListener(this);
     InCallPresenter.getInstance().removeInCallEventListener(this);
-    if (mPrimary != null) {
-      mPrimary.removeListener(this);
+    if (primary != null) {
+      primary.removeListener(this);
     }
 
     callLocation.close();
 
-    mPrimary = null;
-    mPrimaryContactInfo = null;
-    mSecondaryContactInfo = null;
+    primary = null;
+    primaryContactInfo = null;
+    secondaryContactInfo = null;
     isInCallScreenReady = false;
   }
 
@@ -258,7 +258,7 @@
   public void onStateChange(InCallState oldState, InCallState newState, CallList callList) {
     Trace.beginSection("CallCardPresenter.onStateChange");
     LogUtil.v("CallCardPresenter.onStateChange", "oldState: %s, newState: %s", oldState, newState);
-    if (mInCallScreen == null) {
+    if (inCallScreen == null) {
       Trace.endSection();
       return;
     }
@@ -286,22 +286,23 @@
     LogUtil.v("CallCardPresenter.onStateChange", "secondary call: " + secondary);
 
     final boolean primaryChanged =
-        !(DialerCall.areSame(mPrimary, primary) && DialerCall.areSameNumber(mPrimary, primary));
+        !(DialerCall.areSame(this.primary, primary)
+            && DialerCall.areSameNumber(this.primary, primary));
     final boolean secondaryChanged =
-        !(DialerCall.areSame(mSecondary, secondary)
-            && DialerCall.areSameNumber(mSecondary, secondary));
+        !(DialerCall.areSame(this.secondary, secondary)
+            && DialerCall.areSameNumber(this.secondary, secondary));
 
-    mSecondary = secondary;
-    DialerCall previousPrimary = mPrimary;
-    mPrimary = primary;
+    this.secondary = secondary;
+    DialerCall previousPrimary = this.primary;
+    this.primary = primary;
 
-    if (mPrimary != null) {
-      InCallPresenter.getInstance().onForegroundCallChanged(mPrimary);
-      mInCallScreen.updateInCallScreenColors();
+    if (this.primary != null) {
+      InCallPresenter.getInstance().onForegroundCallChanged(this.primary);
+      inCallScreen.updateInCallScreenColors();
     }
 
     if (primaryChanged && shouldShowNoteSentToast(primary)) {
-      mInCallScreen.showNoteSentToast();
+      inCallScreen.showNoteSentToast();
     }
 
     // Refresh primary call information if either:
@@ -312,38 +313,38 @@
       if (previousPrimary != null) {
         previousPrimary.removeListener(this);
       }
-      mPrimary.addListener(this);
+      this.primary.addListener(this);
 
-      mPrimaryContactInfo =
+      primaryContactInfo =
           ContactInfoCache.buildCacheEntryFromCall(
-              mContext, mPrimary, mPrimary.getState() == DialerCall.State.INCOMING);
+              context, this.primary, this.primary.getState() == DialerCall.State.INCOMING);
       updatePrimaryDisplayInfo();
-      maybeStartSearch(mPrimary, true);
+      maybeStartSearch(this.primary, true);
     }
 
-    if (previousPrimary != null && mPrimary == null) {
+    if (previousPrimary != null && this.primary == null) {
       previousPrimary.removeListener(this);
     }
 
     if (secondaryChanged) {
-      if (mSecondary == null) {
+      if (this.secondary == null) {
         // Secondary call may have ended.  Update the ui.
-        mSecondaryContactInfo = null;
+        secondaryContactInfo = null;
         updateSecondaryDisplayInfo();
       } else {
         // secondary call has changed
-        mSecondaryContactInfo =
+        secondaryContactInfo =
             ContactInfoCache.buildCacheEntryFromCall(
-                mContext, mSecondary, mSecondary.getState() == DialerCall.State.INCOMING);
+                context, this.secondary, this.secondary.getState() == DialerCall.State.INCOMING);
         updateSecondaryDisplayInfo();
-        maybeStartSearch(mSecondary, false);
+        maybeStartSearch(this.secondary, false);
       }
     }
 
     // Set the call state
     int callState = DialerCall.State.IDLE;
-    if (mPrimary != null) {
-      callState = mPrimary.getState();
+    if (this.primary != null) {
+      callState = this.primary.getState();
       updatePrimaryCallState();
     } else {
       getUi().setCallState(PrimaryCallState.createEmptyPrimaryCallState());
@@ -354,7 +355,7 @@
     // Hide the end call button instantly if we're receiving an incoming call.
     getUi()
         .setEndCallButtonEnabled(
-            shouldShowEndCallButton(mPrimary, callState),
+            shouldShowEndCallButton(this.primary, callState),
             callState != DialerCall.State.INCOMING /* animate */);
 
     maybeSendAccessibilityEvent(oldState, newState, primaryChanged);
@@ -399,7 +400,7 @@
   public void onDialerCallChildNumberChange() {
     LogUtil.v("CallCardPresenter.onDialerCallChildNumberChange", "");
 
-    if (mPrimary == null) {
+    if (primary == null) {
       return;
     }
     updatePrimaryDisplayInfo();
@@ -410,7 +411,7 @@
   public void onDialerCallLastForwardedNumberChange() {
     LogUtil.v("CallCardPresenter.onDialerCallLastForwardedNumberChange", "");
 
-    if (mPrimary == null) {
+    if (primary == null) {
       return;
     }
     updatePrimaryDisplayInfo();
@@ -425,78 +426,78 @@
   public void onDialerCallSessionModificationStateChange() {
     LogUtil.enterBlock("CallCardPresenter.onDialerCallSessionModificationStateChange");
 
-    if (mPrimary == null) {
+    if (primary == null) {
       return;
     }
     getUi()
         .setEndCallButtonEnabled(
-            mPrimary.getVideoTech().getSessionModificationState()
+            primary.getVideoTech().getSessionModificationState()
                 != SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST,
             true /* shouldAnimate */);
     updatePrimaryCallState();
   }
 
   private boolean shouldRefreshPrimaryInfo(boolean primaryChanged) {
-    if (mPrimary == null) {
+    if (primary == null) {
       return false;
     }
     return primaryChanged
-        || mInCallScreen.isManageConferenceVisible() != shouldShowManageConference();
+        || inCallScreen.isManageConferenceVisible() != shouldShowManageConference();
   }
 
   private void updatePrimaryCallState() {
-    if (getUi() != null && mPrimary != null) {
+    if (getUi() != null && primary != null) {
       boolean isWorkCall =
-          mPrimary.hasProperty(PROPERTY_ENTERPRISE_CALL)
-              || (mPrimaryContactInfo != null
-                  && mPrimaryContactInfo.userType == ContactsUtils.USER_TYPE_WORK);
+          primary.hasProperty(PROPERTY_ENTERPRISE_CALL)
+              || (primaryContactInfo != null
+                  && primaryContactInfo.userType == ContactsUtils.USER_TYPE_WORK);
       boolean isHdAudioCall =
-          isPrimaryCallActive() && mPrimary.hasProperty(Details.PROPERTY_HIGH_DEF_AUDIO);
+          isPrimaryCallActive() && primary.hasProperty(Details.PROPERTY_HIGH_DEF_AUDIO);
       boolean isAttemptingHdAudioCall =
           !isHdAudioCall
-              && !mPrimary.hasProperty(DialerCall.PROPERTY_CODEC_KNOWN)
-              && MotorolaUtils.shouldBlinkHdIconWhenConnectingCall(mContext);
+              && !primary.hasProperty(DialerCall.PROPERTY_CODEC_KNOWN)
+              && MotorolaUtils.shouldBlinkHdIconWhenConnectingCall(context);
 
-      boolean isBusiness = mPrimaryContactInfo != null && mPrimaryContactInfo.isBusiness;
+      boolean isBusiness = primaryContactInfo != null && primaryContactInfo.isBusiness;
 
       // Check for video state change and update the visibility of the contact photo.  The contact
       // photo is hidden when the incoming video surface is shown.
       // The contact photo visibility can also change in setPrimary().
       boolean shouldShowContactPhoto =
-          !VideoCallPresenter.showIncomingVideo(mPrimary.getVideoState(), mPrimary.getState());
+          !VideoCallPresenter.showIncomingVideo(primary.getVideoState(), primary.getState());
       getUi()
           .setCallState(
               new PrimaryCallState(
-                  mPrimary.getState(),
-                  mPrimary.isVideoCall(),
-                  mPrimary.getVideoTech().getSessionModificationState(),
-                  mPrimary.getDisconnectCause(),
+                  primary.getState(),
+                  primary.isVideoCall(),
+                  primary.getVideoTech().getSessionModificationState(),
+                  primary.getDisconnectCause(),
                   getConnectionLabel(),
                   getCallStateIcon(),
                   getGatewayNumber(),
-                  shouldShowCallSubject(mPrimary) ? mPrimary.getCallSubject() : null,
+                  shouldShowCallSubject(primary) ? primary.getCallSubject() : null,
                   PhoneNumberHelper.formatNumber(
-                      mPrimary.getCallbackNumber(), mPrimary.getSimCountryIso()),
-                  mPrimary.hasProperty(Details.PROPERTY_WIFI),
-                  mPrimary.isConferenceCall()
-                      && !mPrimary.hasProperty(Details.PROPERTY_GENERIC_CONFERENCE),
+                      primary.getCallbackNumber(), primary.getSimCountryIso()),
+                  primary.hasProperty(Details.PROPERTY_WIFI),
+                  primary.isConferenceCall()
+                      && !primary.hasProperty(Details.PROPERTY_GENERIC_CONFERENCE),
                   isWorkCall,
                   isAttemptingHdAudioCall,
                   isHdAudioCall,
-                  !TextUtils.isEmpty(mPrimary.getLastForwardedNumber()),
+                  !TextUtils.isEmpty(primary.getLastForwardedNumber()),
                   shouldShowContactPhoto,
-                  mPrimary.getConnectTimeMillis(),
-                  mPrimary.isVoiceMailNumber(),
-                  mPrimary.isRemotelyHeld(),
+                  primary.getConnectTimeMillis(),
+                  primary.isVoiceMailNumber(),
+                  primary.isRemotelyHeld(),
                   isBusiness,
                   supports2ndCallOnHold(),
                   getSwapToSecondaryButtonState(),
-                  mPrimary.isAssistedDialed(),
+                  primary.isAssistedDialed(),
                   null,
-                  mPrimary.getAssistedDialingExtras()));
+                  primary.getAssistedDialingExtras()));
 
       InCallActivity activity =
-          (InCallActivity) (mInCallScreen.getInCallScreenFragment().getActivity());
+          (InCallActivity) (inCallScreen.getInCallScreenFragment().getActivity());
       if (activity != null) {
         activity.onPrimaryCallStateChanged();
       }
@@ -504,10 +505,10 @@
   }
 
   private @ButtonState int getSwapToSecondaryButtonState() {
-    if (mSecondary == null) {
+    if (secondary == null) {
       return ButtonState.NOT_SUPPORT;
     }
-    if (mPrimary.getState() == State.ACTIVE) {
+    if (primary.getState() == State.ACTIVE) {
       return ButtonState.ENABLED;
     }
     return ButtonState.DISABLED;
@@ -525,12 +526,11 @@
    * @return {@code True} if the manage conference button should be visible.
    */
   private boolean shouldShowManageConference() {
-    if (mPrimary == null) {
+    if (primary == null) {
       return false;
     }
 
-    return mPrimary.can(android.telecom.Call.Details.CAPABILITY_MANAGE_CONFERENCE)
-        && !mIsFullscreen;
+    return primary.can(android.telecom.Call.Details.CAPABILITY_MANAGE_CONFERENCE) && !isFullscreen;
   }
 
   private boolean supports2ndCallOnHold() {
@@ -544,19 +544,19 @@
 
   @Override
   public void onCallStateButtonClicked() {
-    Intent broadcastIntent = Bindings.get(mContext).getCallStateButtonBroadcastIntent(mContext);
+    Intent broadcastIntent = Bindings.get(context).getCallStateButtonBroadcastIntent(context);
     if (broadcastIntent != null) {
       LogUtil.v(
           "CallCardPresenter.onCallStateButtonClicked",
           "sending call state button broadcast: " + broadcastIntent);
-      mContext.sendBroadcast(broadcastIntent, Manifest.permission.READ_PHONE_STATE);
+      context.sendBroadcast(broadcastIntent, Manifest.permission.READ_PHONE_STATE);
     }
   }
 
   @Override
   public void onManageConferenceClicked() {
     InCallActivity activity =
-        (InCallActivity) (mInCallScreen.getInCallScreenFragment().getActivity());
+        (InCallActivity) (inCallScreen.getInCallScreenFragment().getActivity());
     activity.showConferenceFragment(true);
   }
 
@@ -575,15 +575,15 @@
   /** Starts a query for more contact data for the save primary and secondary calls. */
   private void startContactInfoSearch(
       final DialerCall call, final boolean isPrimary, boolean isIncoming) {
-    final ContactInfoCache cache = ContactInfoCache.getInstance(mContext);
+    final ContactInfoCache cache = ContactInfoCache.getInstance(context);
 
     cache.findInfo(call, isIncoming, new ContactLookupCallback(this, isPrimary));
   }
 
   private void onContactInfoComplete(String callId, ContactCacheEntry entry, boolean isPrimary) {
     final boolean entryMatchesExistingCall =
-        (isPrimary && mPrimary != null && TextUtils.equals(callId, mPrimary.getId()))
-            || (!isPrimary && mSecondary != null && TextUtils.equals(callId, mSecondary.getId()));
+        (isPrimary && primary != null && TextUtils.equals(callId, primary.getId()))
+            || (!isPrimary && secondary != null && TextUtils.equals(callId, secondary.getId()));
     if (entryMatchesExistingCall) {
       updateContactEntry(entry, isPrimary);
     } else {
@@ -597,7 +597,7 @@
       call.getLogState().contactLookupResult = entry.contactLookupResult;
     }
     if (entry.lookupUri != null) {
-      CallerInfoUtils.sendViewNotification(mContext, entry.lookupUri);
+      CallerInfoUtils.sendViewNotification(context, entry.lookupUri);
     }
   }
 
@@ -607,9 +607,9 @@
     }
 
     if (entry.photo != null) {
-      if (mPrimary != null && callId.equals(mPrimary.getId())) {
+      if (primary != null && callId.equals(primary.getId())) {
         updateContactEntry(entry, true /* isPrimary */);
-      } else if (mSecondary != null && callId.equals(mSecondary.getId())) {
+      } else if (secondary != null && callId.equals(secondary.getId())) {
         updateContactEntry(entry, false /* isPrimary */);
       }
     }
@@ -617,10 +617,10 @@
 
   private void updateContactEntry(ContactCacheEntry entry, boolean isPrimary) {
     if (isPrimary) {
-      mPrimaryContactInfo = entry;
+      primaryContactInfo = entry;
       updatePrimaryDisplayInfo();
     } else {
-      mSecondaryContactInfo = entry;
+      secondaryContactInfo = entry;
       updateSecondaryDisplayInfo();
     }
   }
@@ -674,7 +674,7 @@
   }
 
   private void updatePrimaryDisplayInfo() {
-    if (mInCallScreen == null) {
+    if (inCallScreen == null) {
       // TODO: May also occur if search result comes back after ui is destroyed. Look into
       // removing that case completely.
       LogUtil.v(
@@ -683,35 +683,35 @@
       return;
     }
 
-    if (mPrimary == null) {
+    if (primary == null) {
       // Clear the primary display info.
-      mInCallScreen.setPrimary(PrimaryInfo.createEmptyPrimaryInfo());
+      inCallScreen.setPrimary(PrimaryInfo.createEmptyPrimaryInfo());
       return;
     }
 
     // Hide the contact photo if we are in a video call and the incoming video surface is
     // showing.
     boolean showContactPhoto =
-        !VideoCallPresenter.showIncomingVideo(mPrimary.getVideoState(), mPrimary.getState());
+        !VideoCallPresenter.showIncomingVideo(primary.getVideoState(), primary.getState());
 
     // DialerCall placed through a work phone account.
-    boolean hasWorkCallProperty = mPrimary.hasProperty(PROPERTY_ENTERPRISE_CALL);
+    boolean hasWorkCallProperty = primary.hasProperty(PROPERTY_ENTERPRISE_CALL);
 
     MultimediaData multimediaData = null;
-    if (mPrimary.getEnrichedCallSession() != null) {
-      multimediaData = mPrimary.getEnrichedCallSession().getMultimediaData();
+    if (primary.getEnrichedCallSession() != null) {
+      multimediaData = primary.getEnrichedCallSession().getMultimediaData();
     }
 
-    if (mPrimary.isConferenceCall()) {
+    if (primary.isConferenceCall()) {
       LogUtil.v(
           "CallCardPresenter.updatePrimaryDisplayInfo",
           "update primary display info for conference call.");
 
-      mInCallScreen.setPrimary(
+      inCallScreen.setPrimary(
           new PrimaryInfo(
               null /* number */,
               CallerInfoUtils.getConferenceString(
-                  mContext, mPrimary.hasProperty(Details.PROPERTY_GENERIC_CONFERENCE)),
+                  context, primary.hasProperty(Details.PROPERTY_GENERIC_CONFERENCE)),
               false /* nameIsNumber */,
               null /* location */,
               null /* label */,
@@ -727,63 +727,63 @@
               null /* contactInfoLookupKey */,
               null /* enrichedCallMultimediaData */,
               true /* showInCallButtonGrid */,
-              mPrimary.getNumberPresentation()));
-    } else if (mPrimaryContactInfo != null) {
+              primary.getNumberPresentation()));
+    } else if (primaryContactInfo != null) {
       LogUtil.v(
           "CallCardPresenter.updatePrimaryDisplayInfo",
-          "update primary display info for " + mPrimaryContactInfo);
+          "update primary display info for " + primaryContactInfo);
 
-      String name = getNameForCall(mPrimaryContactInfo);
+      String name = getNameForCall(primaryContactInfo);
       String number;
 
-      boolean isChildNumberShown = !TextUtils.isEmpty(mPrimary.getChildNumber());
-      boolean isForwardedNumberShown = !TextUtils.isEmpty(mPrimary.getLastForwardedNumber());
-      boolean isCallSubjectShown = shouldShowCallSubject(mPrimary);
+      boolean isChildNumberShown = !TextUtils.isEmpty(primary.getChildNumber());
+      boolean isForwardedNumberShown = !TextUtils.isEmpty(primary.getLastForwardedNumber());
+      boolean isCallSubjectShown = shouldShowCallSubject(primary);
 
       if (isCallSubjectShown) {
         number = null;
       } else if (isChildNumberShown) {
-        number = mContext.getString(R.string.child_number, mPrimary.getChildNumber());
+        number = context.getString(R.string.child_number, primary.getChildNumber());
       } else if (isForwardedNumberShown) {
         // Use last forwarded number instead of second line, if present.
-        number = mPrimary.getLastForwardedNumber();
+        number = primary.getLastForwardedNumber();
       } else {
-        number = mPrimaryContactInfo.number;
+        number = primaryContactInfo.number;
       }
 
-      boolean nameIsNumber = name != null && name.equals(mPrimaryContactInfo.number);
+      boolean nameIsNumber = name != null && name.equals(primaryContactInfo.number);
 
       // DialerCall with caller that is a work contact.
-      boolean isWorkContact = (mPrimaryContactInfo.userType == ContactsUtils.USER_TYPE_WORK);
-      mInCallScreen.setPrimary(
+      boolean isWorkContact = (primaryContactInfo.userType == ContactsUtils.USER_TYPE_WORK);
+      inCallScreen.setPrimary(
           new PrimaryInfo(
               number,
-              mPrimary.updateNameIfRestricted(name),
+              primary.updateNameIfRestricted(name),
               nameIsNumber,
-              shouldShowLocationAsLabel(nameIsNumber, mPrimaryContactInfo.shouldShowLocation)
-                  ? mPrimaryContactInfo.location
+              shouldShowLocationAsLabel(nameIsNumber, primaryContactInfo.shouldShowLocation)
+                  ? primaryContactInfo.location
                   : null,
-              isChildNumberShown || isCallSubjectShown ? null : mPrimaryContactInfo.label,
-              mPrimaryContactInfo.photo,
-              mPrimaryContactInfo.photoType,
-              mPrimaryContactInfo.isSipCall,
+              isChildNumberShown || isCallSubjectShown ? null : primaryContactInfo.label,
+              primaryContactInfo.photo,
+              primaryContactInfo.photoType,
+              primaryContactInfo.isSipCall,
               showContactPhoto,
               hasWorkCallProperty || isWorkContact,
-              mPrimary.isSpam(),
-              mPrimaryContactInfo.isLocalContact(),
-              mPrimary.answeringDisconnectsForegroundVideoCall(),
+              primary.isSpam(),
+              primaryContactInfo.isLocalContact(),
+              primary.answeringDisconnectsForegroundVideoCall(),
               shouldShowLocation(),
-              mPrimaryContactInfo.lookupKey,
+              primaryContactInfo.lookupKey,
               multimediaData,
               true /* showInCallButtonGrid */,
-              mPrimary.getNumberPresentation()));
+              primary.getNumberPresentation()));
     } else {
       // Clear the primary display info.
-      mInCallScreen.setPrimary(PrimaryInfo.createEmptyPrimaryInfo());
+      inCallScreen.setPrimary(PrimaryInfo.createEmptyPrimaryInfo());
     }
 
     if (isInCallScreenReady) {
-      mInCallScreen.showLocationUi(getLocationFragment());
+      inCallScreen.showLocationUi(getLocationFragment());
     } else {
       LogUtil.i("CallCardPresenter.updatePrimaryDisplayInfo", "UI not ready, not showing location");
     }
@@ -805,11 +805,11 @@
       return null;
     }
     LogUtil.i("CallCardPresenter.getLocationFragment", "returning location fragment");
-    return callLocation.getLocationFragment(mContext);
+    return callLocation.getLocationFragment(context);
   }
 
   private boolean shouldShowLocation() {
-    if (!ConfigProviderBindings.get(mContext)
+    if (!ConfigProviderBindings.get(context)
         .getBoolean(CONFIG_ENABLE_EMERGENCY_LOCATION, CONFIG_ENABLE_EMERGENCY_LOCATION_DEFAULT)) {
       LogUtil.i("CallCardPresenter.getLocationFragment", "disabled by config.");
       return false;
@@ -826,15 +826,15 @@
       LogUtil.i("CallCardPresenter.getLocationFragment", "low battery.");
       return false;
     }
-    if (ActivityCompat.isInMultiWindowMode(mInCallScreen.getInCallScreenFragment().getActivity())) {
+    if (ActivityCompat.isInMultiWindowMode(inCallScreen.getInCallScreenFragment().getActivity())) {
       LogUtil.i("CallCardPresenter.getLocationFragment", "in multi-window mode");
       return false;
     }
-    if (mPrimary.isVideoCall()) {
+    if (primary.isVideoCall()) {
       LogUtil.i("CallCardPresenter.getLocationFragment", "emergency video calls not supported");
       return false;
     }
-    if (!callLocation.canGetLocation(mContext)) {
+    if (!callLocation.canGetLocation(context)) {
       LogUtil.i("CallCardPresenter.getLocationFragment", "can't get current location");
       return false;
     }
@@ -842,13 +842,13 @@
   }
 
   private boolean isPotentialEmergencyCall() {
-    if (isOutgoingEmergencyCall(mPrimary)) {
+    if (isOutgoingEmergencyCall(primary)) {
       LogUtil.i("CallCardPresenter.shouldShowLocation", "new emergency call");
       return true;
-    } else if (isIncomingEmergencyCall(mPrimary)) {
+    } else if (isIncomingEmergencyCall(primary)) {
       LogUtil.i("CallCardPresenter.shouldShowLocation", "potential emergency callback");
       return true;
-    } else if (isIncomingEmergencyCall(mSecondary)) {
+    } else if (isIncomingEmergencyCall(secondary)) {
       LogUtil.i("CallCardPresenter.shouldShowLocation", "has potential emergency callback");
       return true;
     }
@@ -864,13 +864,13 @@
   }
 
   private boolean hasLocationPermission() {
-    return ContextCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION)
+    return ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION)
         == PackageManager.PERMISSION_GRANTED;
   }
 
   private boolean isBatteryTooLowForEmergencyLocation() {
     Intent batteryStatus =
-        mContext.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
+        context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
     int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
     if (status == BatteryManager.BATTERY_STATUS_CHARGING
         || status == BatteryManager.BATTERY_STATUS_FULL) {
@@ -881,7 +881,7 @@
     int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
     float batteryPercent = (100f * level) / scale;
     long threshold =
-        ConfigProviderBindings.get(mContext)
+        ConfigProviderBindings.get(context)
             .getLong(
                 CONFIG_MIN_BATTERY_PERCENT_FOR_EMERGENCY_LOCATION,
                 CONFIG_MIN_BATTERY_PERCENT_FOR_EMERGENCY_LOCATION_DEFAULT);
@@ -892,60 +892,60 @@
   }
 
   private void updateSecondaryDisplayInfo() {
-    if (mInCallScreen == null) {
+    if (inCallScreen == null) {
       return;
     }
 
-    if (mSecondary == null) {
+    if (secondary == null) {
       // Clear the secondary display info.
-      mInCallScreen.setSecondary(SecondaryInfo.createEmptySecondaryInfo(mIsFullscreen));
+      inCallScreen.setSecondary(SecondaryInfo.createEmptySecondaryInfo(isFullscreen));
       return;
     }
 
-    if (mSecondary.isMergeInProcess()) {
+    if (secondary.isMergeInProcess()) {
       LogUtil.i(
           "CallCardPresenter.updateSecondaryDisplayInfo",
           "secondary call is merge in process, clearing info");
-      mInCallScreen.setSecondary(SecondaryInfo.createEmptySecondaryInfo(mIsFullscreen));
+      inCallScreen.setSecondary(SecondaryInfo.createEmptySecondaryInfo(isFullscreen));
       return;
     }
 
-    if (mSecondary.isConferenceCall()) {
-      mInCallScreen.setSecondary(
+    if (secondary.isConferenceCall()) {
+      inCallScreen.setSecondary(
           new SecondaryInfo(
               true /* show */,
               CallerInfoUtils.getConferenceString(
-                  mContext, mSecondary.hasProperty(Details.PROPERTY_GENERIC_CONFERENCE)),
+                  context, secondary.hasProperty(Details.PROPERTY_GENERIC_CONFERENCE)),
               false /* nameIsNumber */,
               null /* label */,
-              mSecondary.getCallProviderLabel(),
+              secondary.getCallProviderLabel(),
               true /* isConference */,
-              mSecondary.isVideoCall(),
-              mIsFullscreen));
-    } else if (mSecondaryContactInfo != null) {
-      LogUtil.v("CallCardPresenter.updateSecondaryDisplayInfo", "" + mSecondaryContactInfo);
-      String name = getNameForCall(mSecondaryContactInfo);
-      boolean nameIsNumber = name != null && name.equals(mSecondaryContactInfo.number);
-      mInCallScreen.setSecondary(
+              secondary.isVideoCall(),
+              isFullscreen));
+    } else if (secondaryContactInfo != null) {
+      LogUtil.v("CallCardPresenter.updateSecondaryDisplayInfo", "" + secondaryContactInfo);
+      String name = getNameForCall(secondaryContactInfo);
+      boolean nameIsNumber = name != null && name.equals(secondaryContactInfo.number);
+      inCallScreen.setSecondary(
           new SecondaryInfo(
               true /* show */,
-              mSecondary.updateNameIfRestricted(name),
+              secondary.updateNameIfRestricted(name),
               nameIsNumber,
-              mSecondaryContactInfo.label,
-              mSecondary.getCallProviderLabel(),
+              secondaryContactInfo.label,
+              secondary.getCallProviderLabel(),
               false /* isConference */,
-              mSecondary.isVideoCall(),
-              mIsFullscreen));
+              secondary.isVideoCall(),
+              isFullscreen));
     } else {
       // Clear the secondary display info.
-      mInCallScreen.setSecondary(SecondaryInfo.createEmptySecondaryInfo(mIsFullscreen));
+      inCallScreen.setSecondary(SecondaryInfo.createEmptySecondaryInfo(isFullscreen));
     }
   }
 
   /** Returns the gateway number for any existing outgoing call. */
   private String getGatewayNumber() {
     if (hasOutgoingGatewayCall()) {
-      return DialerCall.getNumberFromHandle(mPrimary.getGatewayInfo().getGatewayAddress());
+      return DialerCall.getNumberFromHandle(primary.getGatewayInfo().getGatewayAddress());
     }
     return null;
   }
@@ -955,35 +955,35 @@
    * "calling via [Account/Google Voice]" for outgoing calls.
    */
   private String getConnectionLabel() {
-    if (ContextCompat.checkSelfPermission(mContext, Manifest.permission.READ_PHONE_STATE)
+    if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE)
         != PackageManager.PERMISSION_GRANTED) {
       return null;
     }
-    StatusHints statusHints = mPrimary.getStatusHints();
+    StatusHints statusHints = primary.getStatusHints();
     if (statusHints != null && !TextUtils.isEmpty(statusHints.getLabel())) {
       return statusHints.getLabel().toString();
     }
 
     if (hasOutgoingGatewayCall() && getUi() != null) {
       // Return the label for the gateway app on outgoing calls.
-      final PackageManager pm = mContext.getPackageManager();
+      final PackageManager pm = context.getPackageManager();
       try {
         ApplicationInfo info =
-            pm.getApplicationInfo(mPrimary.getGatewayInfo().getGatewayProviderPackageName(), 0);
+            pm.getApplicationInfo(primary.getGatewayInfo().getGatewayProviderPackageName(), 0);
         return pm.getApplicationLabel(info).toString();
       } catch (PackageManager.NameNotFoundException e) {
         LogUtil.e("CallCardPresenter.getConnectionLabel", "gateway Application Not Found.", e);
         return null;
       }
     }
-    return mPrimary.getCallProviderLabel();
+    return primary.getCallProviderLabel();
   }
 
   private Drawable getCallStateIcon() {
     // Return connection icon if one exists.
-    StatusHints statusHints = mPrimary.getStatusHints();
+    StatusHints statusHints = primary.getStatusHints();
     if (statusHints != null && statusHints.getIcon() != null) {
-      Drawable icon = statusHints.getIcon().loadDrawable(mContext);
+      Drawable icon = statusHints.getIcon().loadDrawable(context);
       if (icon != null) {
         return icon;
       }
@@ -998,19 +998,19 @@
     // TODO: mPrimary can be null because this is called from updatePrimaryDisplayInfo which
     // is also called after a contact search completes (call is not present yet).  Split the
     // UI update so it can receive independent updates.
-    if (mPrimary == null) {
+    if (primary == null) {
       return false;
     }
-    return DialerCall.State.isDialing(mPrimary.getState())
-        && mPrimary.getGatewayInfo() != null
-        && !mPrimary.getGatewayInfo().isEmpty();
+    return DialerCall.State.isDialing(primary.getState())
+        && primary.getGatewayInfo() != null
+        && !primary.getGatewayInfo().isEmpty();
   }
 
   /** Gets the name to display for the call. */
   private String getNameForCall(ContactCacheEntry contactInfo) {
     String preferredName =
         ContactDisplayUtils.getPreferredDisplayName(
-            contactInfo.namePrimary, contactInfo.nameAlternative, mContactsPreferences);
+            contactInfo.namePrimary, contactInfo.nameAlternative, contactsPreferences);
     if (TextUtils.isEmpty(preferredName)) {
       return contactInfo.number;
     }
@@ -1019,30 +1019,30 @@
 
   @Override
   public void onSecondaryInfoClicked() {
-    if (mSecondary == null) {
+    if (secondary == null) {
       LogUtil.e(
           "CallCardPresenter.onSecondaryInfoClicked",
           "secondary info clicked but no secondary call.");
       return;
     }
 
-    Logger.get(mContext)
+    Logger.get(context)
         .logCallImpression(
             DialerImpression.Type.IN_CALL_SWAP_SECONDARY_BUTTON_PRESSED,
-            mPrimary.getUniqueCallId(),
-            mPrimary.getTimeAddedMs());
+            primary.getUniqueCallId(),
+            primary.getTimeAddedMs());
     LogUtil.i(
-        "CallCardPresenter.onSecondaryInfoClicked", "swapping call to foreground: " + mSecondary);
-    mSecondary.unhold();
+        "CallCardPresenter.onSecondaryInfoClicked", "swapping call to foreground: " + secondary);
+    secondary.unhold();
   }
 
   @Override
   public void onEndCallClicked() {
-    LogUtil.i("CallCardPresenter.onEndCallClicked", "disconnecting call: " + mPrimary);
-    if (mPrimary != null) {
-      mPrimary.disconnect();
+    LogUtil.i("CallCardPresenter.onEndCallClicked", "disconnecting call: " + primary);
+    if (primary != null) {
+      primary.disconnect();
     }
-    PostCall.onDisconnectPressed(mContext);
+    PostCall.onDisconnectPressed(context);
   }
 
   /**
@@ -1052,15 +1052,15 @@
    */
   @Override
   public void onFullscreenModeChanged(boolean isFullscreenMode) {
-    mIsFullscreen = isFullscreenMode;
-    if (mInCallScreen == null) {
+    isFullscreen = isFullscreenMode;
+    if (inCallScreen == null) {
       return;
     }
     maybeShowManageConferenceCallButton();
   }
 
   private boolean isPrimaryCallActive() {
-    return mPrimary != null && mPrimary.getState() == DialerCall.State.ACTIVE;
+    return primary != null && primary.getState() == DialerCall.State.ACTIVE;
   }
 
   private boolean shouldShowEndCallButton(DialerCall primary, int callState) {
@@ -1073,7 +1073,7 @@
         || callState == DialerCall.State.INCOMING) {
       return false;
     }
-    if (mPrimary.getVideoTech().getSessionModificationState()
+    if (this.primary.getVideoTech().getSessionModificationState()
         == SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST) {
       return false;
     }
@@ -1128,11 +1128,11 @@
   private void maybeSendAccessibilityEvent(
       InCallState oldState, final InCallState newState, boolean primaryChanged) {
     shouldSendAccessibilityEvent = false;
-    if (mContext == null) {
+    if (context == null) {
       return;
     }
     final AccessibilityManager am =
-        (AccessibilityManager) mContext.getSystemService(Context.ACCESSIBILITY_SERVICE);
+        (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE);
     if (!am.isEnabled()) {
       return;
     }
@@ -1161,8 +1161,8 @@
     }
 
     boolean isIncomingOrWaiting =
-        mPrimary.getState() == DialerCall.State.INCOMING
-            || mPrimary.getState() == DialerCall.State.CALL_WAITING;
+        primary.getState() == DialerCall.State.INCOMING
+            || primary.getState() == DialerCall.State.CALL_WAITING;
     return isIncomingOrWaiting
         && !TextUtils.isEmpty(call.getCallSubject())
         && call.getNumberPresentation() == TelecomManager.PRESENTATION_ALLOWED
@@ -1184,30 +1184,30 @@
   }
 
   private InCallScreen getUi() {
-    return mInCallScreen;
+    return inCallScreen;
   }
 
   public static class ContactLookupCallback implements ContactInfoCacheCallback {
 
-    private final WeakReference<CallCardPresenter> mCallCardPresenter;
-    private final boolean mIsPrimary;
+    private final WeakReference<CallCardPresenter> callCardPresenter;
+    private final boolean isPrimary;
 
     public ContactLookupCallback(CallCardPresenter callCardPresenter, boolean isPrimary) {
-      mCallCardPresenter = new WeakReference<CallCardPresenter>(callCardPresenter);
-      mIsPrimary = isPrimary;
+      this.callCardPresenter = new WeakReference<CallCardPresenter>(callCardPresenter);
+      this.isPrimary = isPrimary;
     }
 
     @Override
     public void onContactInfoComplete(String callId, ContactCacheEntry entry) {
-      CallCardPresenter presenter = mCallCardPresenter.get();
+      CallCardPresenter presenter = callCardPresenter.get();
       if (presenter != null) {
-        presenter.onContactInfoComplete(callId, entry, mIsPrimary);
+        presenter.onContactInfoComplete(callId, entry, isPrimary);
       }
     }
 
     @Override
     public void onImageLoadComplete(String callId, ContactCacheEntry entry) {
-      CallCardPresenter presenter = mCallCardPresenter.get();
+      CallCardPresenter presenter = callCardPresenter.get();
       if (presenter != null) {
         presenter.onImageLoadComplete(callId, entry);
       }
diff --git a/java/com/android/incallui/CallerInfo.java b/java/com/android/incallui/CallerInfo.java
index d3b12c1..7a5002d 100644
--- a/java/com/android/incallui/CallerInfo.java
+++ b/java/com/android/incallui/CallerInfo.java
@@ -164,13 +164,13 @@
 
   public String countryIso;
 
-  private boolean mIsEmergency;
-  private boolean mIsVoiceMail;
+  private boolean isEmergency;
+  private boolean isVoiceMail;
 
   public CallerInfo() {
     // TODO: Move all the basic initialization here?
-    mIsEmergency = false;
-    mIsVoiceMail = false;
+    isEmergency = false;
+    isVoiceMail = false;
     userType = ContactsUtils.USER_TYPE_CURRENT;
   }
 
@@ -467,12 +467,12 @@
 
   /** @return true if the caller info is an emergency number. */
   public boolean isEmergencyNumber() {
-    return mIsEmergency;
+    return isEmergency;
   }
 
   /** @return true if the caller info is a voicemail number. */
   public boolean isVoiceMailNumber() {
-    return mIsVoiceMail;
+    return isVoiceMail;
   }
 
   /**
@@ -485,7 +485,7 @@
     name = context.getString(R.string.emergency_call_dialog_number_for_display);
     phoneNumber = null;
 
-    mIsEmergency = true;
+    isEmergency = true;
     return this;
   }
 
@@ -497,7 +497,7 @@
    * @return this instance.
    */
   /* package */ CallerInfo markAsVoiceMail(Context context) {
-    mIsVoiceMail = true;
+    isVoiceMail = true;
 
     try {
       // For voicemail calls, we display the voice mail tag
@@ -565,8 +565,8 @@
           .append("\nshouldSendToVoicemail: " + shouldSendToVoicemail)
           .append("\ncachedPhoto: " + cachedPhoto)
           .append("\nisCachedPhotoCurrent: " + isCachedPhotoCurrent)
-          .append("\nemergency: " + mIsEmergency)
-          .append("\nvoicemail: " + mIsVoiceMail)
+          .append("\nemergency: " + isEmergency)
+          .append("\nvoicemail: " + isVoiceMail)
           .append("\nuserType: " + userType)
           .append(" }")
           .toString();
diff --git a/java/com/android/incallui/CallerInfoAsyncQuery.java b/java/com/android/incallui/CallerInfoAsyncQuery.java
index f9d8da8..52ca8ca 100644
--- a/java/com/android/incallui/CallerInfoAsyncQuery.java
+++ b/java/com/android/incallui/CallerInfoAsyncQuery.java
@@ -287,56 +287,56 @@
 
   private static final class DirectoryQueryCompleteListenerFactory {
 
-    private final OnQueryCompleteListener mListener;
-    private final Context mContext;
+    private final OnQueryCompleteListener listener;
+    private final Context context;
     // Make sure listener to be called once and only once
-    private int mCount;
-    private boolean mIsListenerCalled;
+    private int count;
+    private boolean isListenerCalled;
 
     DirectoryQueryCompleteListenerFactory(
         Context context, int size, OnQueryCompleteListener listener) {
-      mCount = size;
-      mListener = listener;
-      mIsListenerCalled = false;
-      mContext = context;
+      count = size;
+      this.listener = listener;
+      isListenerCalled = false;
+      this.context = context;
     }
 
     private void onDirectoryQueryComplete(
         int token, Object cookie, CallerInfo ci, long directoryId) {
       boolean shouldCallListener = false;
       synchronized (this) {
-        mCount = mCount - 1;
-        if (!mIsListenerCalled && (ci.contactExists || mCount == 0)) {
-          mIsListenerCalled = true;
+        count = count - 1;
+        if (!isListenerCalled && (ci.contactExists || count == 0)) {
+          isListenerCalled = true;
           shouldCallListener = true;
         }
       }
 
       // Don't call callback in synchronized block because mListener.onQueryComplete may
       // take long time to complete
-      if (shouldCallListener && mListener != null) {
+      if (shouldCallListener && listener != null) {
         addCallerInfoIntoCache(ci, directoryId);
-        mListener.onQueryComplete(token, cookie, ci);
+        listener.onQueryComplete(token, cookie, ci);
       }
     }
 
     private void addCallerInfoIntoCache(CallerInfo ci, long directoryId) {
       CachedNumberLookupService cachedNumberLookupService =
-          PhoneNumberCache.get(mContext).getCachedNumberLookupService();
+          PhoneNumberCache.get(context).getCachedNumberLookupService();
       if (ci.contactExists && cachedNumberLookupService != null) {
         // 1. Cache caller info
         CachedContactInfo cachedContactInfo =
             CallerInfoUtils.buildCachedContactInfo(cachedNumberLookupService, ci);
-        String directoryLabel = mContext.getString(R.string.directory_search_label);
+        String directoryLabel = context.getString(R.string.directory_search_label);
         cachedContactInfo.setDirectorySource(directoryLabel, directoryId);
-        cachedNumberLookupService.addContact(mContext, cachedContactInfo);
+        cachedNumberLookupService.addContact(context, cachedContactInfo);
 
         // 2. Cache photo
         if (ci.contactDisplayPhotoUri != null && ci.normalizedNumber != null) {
           try (InputStream in =
-              mContext.getContentResolver().openInputStream(ci.contactDisplayPhotoUri)) {
+              context.getContentResolver().openInputStream(ci.contactDisplayPhotoUri)) {
             if (in != null) {
-              cachedNumberLookupService.addPhoto(mContext, ci.normalizedNumber, in);
+              cachedNumberLookupService.addPhoto(context, ci.normalizedNumber, in);
             }
           } catch (IOException e) {
             Log.e(LOG_TAG, "failed to fetch directory contact photo", e);
@@ -351,22 +351,22 @@
 
     private class DirectoryQueryCompleteListener implements OnQueryCompleteListener {
 
-      private final long mDirectoryId;
+      private final long directoryId;
 
       DirectoryQueryCompleteListener(long directoryId) {
-        mDirectoryId = directoryId;
+        this.directoryId = directoryId;
       }
 
       @Override
       public void onDataLoaded(int token, Object cookie, CallerInfo ci) {
         Log.d(LOG_TAG, "DirectoryQueryCompleteListener.onDataLoaded");
-        mListener.onDataLoaded(token, cookie, ci);
+        listener.onDataLoaded(token, cookie, ci);
       }
 
       @Override
       public void onQueryComplete(int token, Object cookie, CallerInfo ci) {
         Log.d(LOG_TAG, "DirectoryQueryCompleteListener.onQueryComplete");
-        onDirectoryQueryComplete(token, cookie, ci, mDirectoryId);
+        onDirectoryQueryComplete(token, cookie, ci, directoryId);
       }
     }
   }
@@ -380,16 +380,16 @@
      * with a new query event, and one with a end event, with 0 or more additional listeners in
      * between).
      */
-    private Context mQueryContext;
+    private Context queryContext;
 
-    private Uri mQueryUri;
-    private CallerInfo mCallerInfo;
+    private Uri queryUri;
+    private CallerInfo callerInfo;
 
     /** Asynchronous query handler class for the contact / callerinfo object. */
     private CallerInfoAsyncQueryHandler(Context context, Uri contactRef) {
       super(context.getContentResolver());
-      this.mQueryContext = context;
-      this.mQueryUri = contactRef;
+      this.queryContext = context;
+      this.queryUri = contactRef;
     }
 
     @Override
@@ -448,12 +448,12 @@
                 + cw.listener.getClass().toString()
                 + " for token: "
                 + token
-                + mCallerInfo);
-        cw.listener.onQueryComplete(token, cw.cookie, mCallerInfo);
+                + callerInfo);
+        cw.listener.onQueryComplete(token, cw.cookie, callerInfo);
       }
-      mQueryContext = null;
-      mQueryUri = null;
-      mCallerInfo = null;
+      queryContext = null;
+      queryUri = null;
+      callerInfo = null;
     }
 
     void updateData(int token, Object cookie, Cursor cursor) {
@@ -472,8 +472,8 @@
         }
 
         // check the token and if needed, create the callerinfo object.
-        if (mCallerInfo == null) {
-          if ((mQueryContext == null) || (mQueryUri == null)) {
+        if (callerInfo == null) {
+          if ((queryContext == null) || (queryUri == null)) {
             throw new QueryPoolException(
                 "Bad context or query uri, or CallerInfoAsyncQuery already released.");
           }
@@ -486,20 +486,20 @@
           if (cw.event == EVENT_EMERGENCY_NUMBER) {
             // Note we're setting the phone number here (refer to javadoc
             // comments at the top of CallerInfo class).
-            mCallerInfo = new CallerInfo().markAsEmergency(mQueryContext);
+            callerInfo = new CallerInfo().markAsEmergency(queryContext);
           } else if (cw.event == EVENT_VOICEMAIL_NUMBER) {
-            mCallerInfo = new CallerInfo().markAsVoiceMail(mQueryContext);
+            callerInfo = new CallerInfo().markAsVoiceMail(queryContext);
           } else {
-            mCallerInfo = CallerInfo.getCallerInfo(mQueryContext, mQueryUri, cursor);
-            Log.d(this, "==> Got mCallerInfo: " + mCallerInfo);
+            callerInfo = CallerInfo.getCallerInfo(queryContext, queryUri, cursor);
+            Log.d(this, "==> Got mCallerInfo: " + callerInfo);
 
             CallerInfo newCallerInfo =
-                CallerInfo.doSecondaryLookupIfNecessary(mQueryContext, cw.number, mCallerInfo);
-            if (newCallerInfo != mCallerInfo) {
-              mCallerInfo = newCallerInfo;
-              Log.d(this, "#####async contact look up with numeric username" + mCallerInfo);
+                CallerInfo.doSecondaryLookupIfNecessary(queryContext, cw.number, callerInfo);
+            if (newCallerInfo != callerInfo) {
+              callerInfo = newCallerInfo;
+              Log.d(this, "#####async contact look up with numeric username" + callerInfo);
             }
-            mCallerInfo.countryIso = cw.countryIso;
+            callerInfo.countryIso = cw.countryIso;
 
             // Final step: look up the geocoded description.
             if (ENABLE_UNKNOWN_NUMBER_GEO_DESCRIPTION) {
@@ -514,25 +514,25 @@
               // new parameter to CallerInfoAsyncQuery.startQuery() to force
               // the geoDescription field to be populated.)
 
-              if (TextUtils.isEmpty(mCallerInfo.name)) {
+              if (TextUtils.isEmpty(callerInfo.name)) {
                 // Actually when no contacts match the incoming phone number,
                 // the CallerInfo object is totally blank here (i.e. no name
                 // *or* phoneNumber).  So we need to pass in cw.number as
                 // a fallback number.
-                mCallerInfo.updateGeoDescription(mQueryContext, cw.number);
+                callerInfo.updateGeoDescription(queryContext, cw.number);
               }
             }
 
             // Use the number entered by the user for display.
             if (!TextUtils.isEmpty(cw.number)) {
-              mCallerInfo.phoneNumber = cw.number;
+              callerInfo.phoneNumber = cw.number;
             }
           }
 
           Log.d(this, "constructing CallerInfo object for token: " + token);
 
           if (cw.listener != null) {
-            cw.listener.onDataLoaded(token, cw.cookie, mCallerInfo);
+            cw.listener.onDataLoaded(token, cw.cookie, callerInfo);
           }
         }
 
@@ -598,14 +598,14 @@
 
           switch (cw.event) {
             case EVENT_NEW_QUERY:
-              final ContentResolver resolver = mQueryContext.getContentResolver();
+              final ContentResolver resolver = queryContext.getContentResolver();
 
               // This should never happen.
               if (resolver == null) {
                 Log.e(this, "Content Resolver is null!");
                 return;
               }
-              //start the sql command.
+              // start the sql command.
               Cursor cursor;
               try {
                 cursor =
diff --git a/java/com/android/incallui/ConferenceManagerFragment.java b/java/com/android/incallui/ConferenceManagerFragment.java
index bd6cb85..20625c4 100644
--- a/java/com/android/incallui/ConferenceManagerFragment.java
+++ b/java/com/android/incallui/ConferenceManagerFragment.java
@@ -35,9 +35,9 @@
     extends BaseFragment<ConferenceManagerPresenter, ConferenceManagerUi>
     implements ConferenceManagerPresenter.ConferenceManagerUi {
 
-  private ListView mConferenceParticipantList;
-  private ContactPhotoManager mContactPhotoManager;
-  private ConferenceParticipantListAdapter mConferenceParticipantListAdapter;
+  private ListView conferenceParticipantList;
+  private ContactPhotoManager contactPhotoManager;
+  private ConferenceParticipantListAdapter conferenceParticipantListAdapter;
 
   @Override
   public ConferenceManagerPresenter createPresenter() {
@@ -62,8 +62,8 @@
       LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
     final View parent = inflater.inflate(R.layout.conference_manager_fragment, container, false);
 
-    mConferenceParticipantList = (ListView) parent.findViewById(R.id.participantList);
-    mContactPhotoManager = ContactPhotoManager.getInstance(getActivity().getApplicationContext());
+    conferenceParticipantList = (ListView) parent.findViewById(R.id.participantList);
+    contactPhotoManager = ContactPhotoManager.getInstance(getActivity().getApplicationContext());
 
     return parent;
   }
@@ -75,7 +75,7 @@
     getPresenter().init(calls);
     // Request focus on the list of participants for accessibility purposes.  This ensures
     // that once the list of participants is shown, the first participant is announced.
-    mConferenceParticipantList.requestFocus();
+    conferenceParticipantList.requestFocus();
   }
 
   @Override
@@ -90,17 +90,17 @@
 
   @Override
   public void update(List<DialerCall> participants, boolean parentCanSeparate) {
-    if (mConferenceParticipantListAdapter == null) {
-      mConferenceParticipantListAdapter =
-          new ConferenceParticipantListAdapter(mConferenceParticipantList, mContactPhotoManager);
+    if (conferenceParticipantListAdapter == null) {
+      conferenceParticipantListAdapter =
+          new ConferenceParticipantListAdapter(conferenceParticipantList, contactPhotoManager);
 
-      mConferenceParticipantList.setAdapter(mConferenceParticipantListAdapter);
+      conferenceParticipantList.setAdapter(conferenceParticipantListAdapter);
     }
-    mConferenceParticipantListAdapter.updateParticipants(participants, parentCanSeparate);
+    conferenceParticipantListAdapter.updateParticipants(participants, parentCanSeparate);
   }
 
   @Override
   public void refreshCall(DialerCall call) {
-    mConferenceParticipantListAdapter.refreshCall(call);
+    conferenceParticipantListAdapter.refreshCall(call);
   }
 }
diff --git a/java/com/android/incallui/ConferenceParticipantListAdapter.java b/java/com/android/incallui/ConferenceParticipantListAdapter.java
index 66b6a97..d4579b1 100644
--- a/java/com/android/incallui/ConferenceParticipantListAdapter.java
+++ b/java/com/android/incallui/ConferenceParticipantListAdapter.java
@@ -55,15 +55,15 @@
 public class ConferenceParticipantListAdapter extends BaseAdapter {
 
   /** The ListView containing the participant information. */
-  private final ListView mListView;
+  private final ListView listView;
   /** Hashmap to make accessing participant info by call Id faster. */
-  private final Map<String, ParticipantInfo> mParticipantsByCallId = new ArrayMap<>();
+  private final Map<String, ParticipantInfo> participantsByCallId = new ArrayMap<>();
   /** ContactsPreferences used to lookup displayName preferences */
-  @Nullable private final ContactsPreferences mContactsPreferences;
+  @Nullable private final ContactsPreferences contactsPreferences;
   /** Contact photo manager to retrieve cached contact photo information. */
-  private final ContactPhotoManager mContactPhotoManager;
+  private final ContactPhotoManager contactPhotoManager;
   /** Listener used to handle tap of the "disconnect' button for a participant. */
-  private View.OnClickListener mDisconnectListener =
+  private View.OnClickListener disconnectListener =
       new View.OnClickListener() {
         @Override
         public void onClick(View view) {
@@ -76,7 +76,7 @@
         }
       };
   /** Listener used to handle tap of the "separate' button for a participant. */
-  private View.OnClickListener mSeparateListener =
+  private View.OnClickListener separateListener =
       new View.OnClickListener() {
         @Override
         public void onClick(View view) {
@@ -88,9 +88,9 @@
         }
       };
   /** The conference participants to show in the ListView. */
-  private List<ParticipantInfo> mConferenceParticipants = new ArrayList<>();
+  private List<ParticipantInfo> conferenceParticipants = new ArrayList<>();
   /** {@code True} if the conference parent supports separating calls from the conference. */
-  private boolean mParentCanSeparate;
+  private boolean parentCanSeparate;
 
   /**
    * Creates an instance of the ConferenceParticipantListAdapter.
@@ -101,9 +101,9 @@
   public ConferenceParticipantListAdapter(
       ListView listView, ContactPhotoManager contactPhotoManager) {
 
-    mListView = listView;
-    mContactsPreferences = ContactsPreferencesFactory.newContactsPreferences(getContext());
-    mContactPhotoManager = contactPhotoManager;
+    this.listView = listView;
+    contactsPreferences = ContactsPreferencesFactory.newContactsPreferences(getContext());
+    this.contactPhotoManager = contactPhotoManager;
   }
 
   /**
@@ -115,11 +115,11 @@
    */
   public void updateParticipants(
       List<DialerCall> conferenceParticipants, boolean parentCanSeparate) {
-    if (mContactsPreferences != null) {
-      mContactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
-      mContactsPreferences.refreshValue(ContactsPreferences.SORT_ORDER_KEY);
+    if (contactsPreferences != null) {
+      contactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
+      contactsPreferences.refreshValue(ContactsPreferences.SORT_ORDER_KEY);
     }
-    mParentCanSeparate = parentCanSeparate;
+    this.parentCanSeparate = parentCanSeparate;
     updateParticipantInfo(conferenceParticipants);
   }
 
@@ -130,7 +130,7 @@
    */
   @Override
   public int getCount() {
-    return mConferenceParticipants.size();
+    return conferenceParticipants.size();
   }
 
   /**
@@ -141,7 +141,7 @@
    */
   @Override
   public Object getItem(int position) {
-    return mConferenceParticipants.get(position);
+    return conferenceParticipants.get(position);
   }
 
   /**
@@ -163,15 +163,15 @@
   public void refreshCall(DialerCall call) {
     String callId = call.getId();
 
-    if (mParticipantsByCallId.containsKey(callId)) {
-      ParticipantInfo participantInfo = mParticipantsByCallId.get(callId);
+    if (participantsByCallId.containsKey(callId)) {
+      ParticipantInfo participantInfo = participantsByCallId.get(callId);
       participantInfo.setCall(call);
       refreshView(callId);
     }
   }
 
   private Context getContext() {
-    return mListView.getContext();
+    return listView.getContext();
   }
 
   /**
@@ -181,14 +181,14 @@
    * @param callId The call id.
    */
   private void refreshView(String callId) {
-    int first = mListView.getFirstVisiblePosition();
-    int last = mListView.getLastVisiblePosition();
+    int first = listView.getFirstVisiblePosition();
+    int last = listView.getLastVisiblePosition();
 
     for (int position = 0; position <= last - first; position++) {
-      View view = mListView.getChildAt(position);
+      View view = listView.getChildAt(position);
       String rowCallId = (String) view.getTag();
       if (rowCallId.equals(callId)) {
-        getView(position + first, view, mListView);
+        getView(position + first, view, listView);
         break;
       }
     }
@@ -212,7 +212,7 @@
                 .inflate(R.layout.caller_in_conference, parent, false)
             : convertView;
 
-    ParticipantInfo participantInfo = mConferenceParticipants.get(position);
+    ParticipantInfo participantInfo = conferenceParticipants.get(position);
     DialerCall call = participantInfo.getCall();
     ContactCacheEntry contactCache = participantInfo.getContactCacheEntry();
 
@@ -228,14 +228,14 @@
     }
 
     boolean thisRowCanSeparate =
-        mParentCanSeparate
+        parentCanSeparate
             && call.can(android.telecom.Call.Details.CAPABILITY_SEPARATE_FROM_CONFERENCE);
     boolean thisRowCanDisconnect =
         call.can(android.telecom.Call.Details.CAPABILITY_DISCONNECT_FROM_CONFERENCE);
 
     String name =
         ContactDisplayUtils.getPreferredDisplayName(
-            contactCache.namePrimary, contactCache.nameAlternative, mContactsPreferences);
+            contactCache.namePrimary, contactCache.nameAlternative, contactsPreferences);
 
     setCallerInfoForRow(
         result,
@@ -262,8 +262,8 @@
    * @param entry The new contact info.
    */
   /* package */ void updateContactInfo(String callId, ContactCacheEntry entry) {
-    if (mParticipantsByCallId.containsKey(callId)) {
-      ParticipantInfo participantInfo = mParticipantsByCallId.get(callId);
+    if (participantsByCallId.containsKey(callId)) {
+      ParticipantInfo participantInfo = participantsByCallId.get(callId);
       participantInfo.setContactCacheEntry(entry);
       participantInfo.setCacheLookupComplete(true);
       refreshView(callId);
@@ -307,14 +307,14 @@
 
     endButton.setVisibility(thisRowCanDisconnect ? View.VISIBLE : View.GONE);
     if (thisRowCanDisconnect) {
-      endButton.setOnClickListener(mDisconnectListener);
+      endButton.setOnClickListener(disconnectListener);
     } else {
       endButton.setOnClickListener(null);
     }
 
     separateButton.setVisibility(thisRowCanSeparate ? View.VISIBLE : View.GONE);
     if (thisRowCanSeparate) {
-      separateButton.setOnClickListener(mSeparateListener);
+      separateButton.setOnClickListener(separateListener);
     } else {
       separateButton.setOnClickListener(null);
     }
@@ -325,7 +325,7 @@
             ? null
             : new DefaultImageRequest(displayNameForImage, lookupKey, true /* isCircularPhoto */);
 
-    mContactPhotoManager.loadDirectoryPhoto(photoView, photoUri, false, true, imageRequest);
+    contactPhotoManager.loadDirectoryPhoto(photoView, photoUri, false, true, imageRequest);
 
     // set the caller name
     if (TextUtils.isEmpty(preferredName)) {
@@ -404,26 +404,26 @@
                 getContext(), call, call.getState() == DialerCall.State.INCOMING);
       }
 
-      if (mParticipantsByCallId.containsKey(callId)) {
-        ParticipantInfo participantInfo = mParticipantsByCallId.get(callId);
+      if (participantsByCallId.containsKey(callId)) {
+        ParticipantInfo participantInfo = participantsByCallId.get(callId);
         participantInfo.setCall(call);
         participantInfo.setContactCacheEntry(contactCache);
       } else {
         newParticipantAdded = true;
         ParticipantInfo participantInfo = new ParticipantInfo(call, contactCache);
-        mConferenceParticipants.add(participantInfo);
-        mParticipantsByCallId.put(call.getId(), participantInfo);
+        this.conferenceParticipants.add(participantInfo);
+        participantsByCallId.put(call.getId(), participantInfo);
       }
     }
 
     // Remove any participants that no longer exist.
-    Iterator<Map.Entry<String, ParticipantInfo>> it = mParticipantsByCallId.entrySet().iterator();
+    Iterator<Map.Entry<String, ParticipantInfo>> it = participantsByCallId.entrySet().iterator();
     while (it.hasNext()) {
       Map.Entry<String, ParticipantInfo> entry = it.next();
       String existingCallId = entry.getKey();
       if (!newCallIds.contains(existingCallId)) {
         ParticipantInfo existingInfo = entry.getValue();
-        mConferenceParticipants.remove(existingInfo);
+        this.conferenceParticipants.remove(existingInfo);
         it.remove();
       }
     }
@@ -438,7 +438,7 @@
   /** Sorts the participant list by contact name. */
   private void sortParticipantList() {
     Collections.sort(
-        mConferenceParticipants,
+        conferenceParticipants,
         new Comparator<ParticipantInfo>() {
           @Override
           public int compare(ParticipantInfo p1, ParticipantInfo p2) {
@@ -446,13 +446,13 @@
             ContactCacheEntry c1 = p1.getContactCacheEntry();
             String p1Name =
                 ContactDisplayUtils.getPreferredSortName(
-                    c1.namePrimary, c1.nameAlternative, mContactsPreferences);
+                    c1.namePrimary, c1.nameAlternative, contactsPreferences);
             p1Name = p1Name != null ? p1Name : "";
 
             ContactCacheEntry c2 = p2.getContactCacheEntry();
             String p2Name =
                 ContactDisplayUtils.getPreferredSortName(
-                    c2.namePrimary, c2.nameAlternative, mContactsPreferences);
+                    c2.namePrimary, c2.nameAlternative, contactsPreferences);
             p2Name = p2Name != null ? p2Name : "";
 
             return p1Name.compareToIgnoreCase(p2Name);
@@ -472,10 +472,10 @@
    */
   public static class ContactLookupCallback implements ContactInfoCache.ContactInfoCacheCallback {
 
-    private final WeakReference<ConferenceParticipantListAdapter> mListAdapter;
+    private final WeakReference<ConferenceParticipantListAdapter> listAdapter;
 
     public ContactLookupCallback(ConferenceParticipantListAdapter listAdapter) {
-      mListAdapter = new WeakReference<>(listAdapter);
+      this.listAdapter = new WeakReference<>(listAdapter);
     }
 
     /**
@@ -507,7 +507,7 @@
      * @param entry The new contact information.
      */
     private void update(String callId, ContactCacheEntry entry) {
-      ConferenceParticipantListAdapter listAdapter = mListAdapter.get();
+      ConferenceParticipantListAdapter listAdapter = this.listAdapter.get();
       if (listAdapter != null) {
         listAdapter.updateContactInfo(callId, entry);
       }
@@ -520,51 +520,51 @@
    */
   private static class ParticipantInfo {
 
-    private DialerCall mCall;
-    private ContactCacheEntry mContactCacheEntry;
-    private boolean mCacheLookupComplete = false;
+    private DialerCall call;
+    private ContactCacheEntry contactCacheEntry;
+    private boolean cacheLookupComplete = false;
 
     public ParticipantInfo(DialerCall call, ContactCacheEntry contactCacheEntry) {
-      mCall = call;
-      mContactCacheEntry = contactCacheEntry;
+      this.call = call;
+      this.contactCacheEntry = contactCacheEntry;
     }
 
     public DialerCall getCall() {
-      return mCall;
+      return call;
     }
 
     public void setCall(DialerCall call) {
-      mCall = call;
+      this.call = call;
     }
 
     public ContactCacheEntry getContactCacheEntry() {
-      return mContactCacheEntry;
+      return contactCacheEntry;
     }
 
     public void setContactCacheEntry(ContactCacheEntry entry) {
-      mContactCacheEntry = entry;
+      contactCacheEntry = entry;
     }
 
     public boolean isCacheLookupComplete() {
-      return mCacheLookupComplete;
+      return cacheLookupComplete;
     }
 
     public void setCacheLookupComplete(boolean cacheLookupComplete) {
-      mCacheLookupComplete = cacheLookupComplete;
+      this.cacheLookupComplete = cacheLookupComplete;
     }
 
     @Override
     public boolean equals(Object o) {
       if (o instanceof ParticipantInfo) {
         ParticipantInfo p = (ParticipantInfo) o;
-        return Objects.equals(p.getCall().getId(), mCall.getId());
+        return Objects.equals(p.getCall().getId(), call.getId());
       }
       return false;
     }
 
     @Override
     public int hashCode() {
-      return mCall.getId().hashCode();
+      return call.getId().hashCode();
     }
   }
 }
diff --git a/java/com/android/incallui/ContactInfoCache.java b/java/com/android/incallui/ContactInfoCache.java
index 67a294f..fbee743 100644
--- a/java/com/android/incallui/ContactInfoCache.java
+++ b/java/com/android/incallui/ContactInfoCache.java
@@ -78,14 +78,14 @@
 
   private static final String TAG = ContactInfoCache.class.getSimpleName();
   private static final int TOKEN_UPDATE_PHOTO_FOR_CALL_STATE = 0;
-  private static ContactInfoCache sCache = null;
-  private final Context mContext;
-  private final PhoneNumberService mPhoneNumberService;
+  private static ContactInfoCache cache = null;
+  private final Context context;
+  private final PhoneNumberService phoneNumberService;
   // Cache info map needs to be thread-safe since it could be modified by both main thread and
   // worker thread.
-  private final ConcurrentHashMap<String, ContactCacheEntry> mInfoMap = new ConcurrentHashMap<>();
-  private final Map<String, Set<ContactInfoCacheCallback>> mCallBacks = new ArrayMap<>();
-  private int mQueryId;
+  private final ConcurrentHashMap<String, ContactCacheEntry> infoMap = new ConcurrentHashMap<>();
+  private final Map<String, Set<ContactInfoCacheCallback>> callBacks = new ArrayMap<>();
+  private int queryId;
   private final DialerExecutor<CnapInformationWrapper> cachedNumberLookupExecutor;
 
   private static class CachedNumberLookupWorker implements Worker<CnapInformationWrapper, Void> {
@@ -123,10 +123,10 @@
 
   private ContactInfoCache(Context context) {
     Trace.beginSection("ContactInfoCache constructor");
-    mContext = context;
-    mPhoneNumberService = Bindings.get(context).newPhoneNumberService(context);
+    this.context = context;
+    phoneNumberService = Bindings.get(context).newPhoneNumberService(context);
     cachedNumberLookupExecutor =
-        DialerExecutorComponent.get(mContext)
+        DialerExecutorComponent.get(this.context)
             .dialerExecutorFactory()
             .createNonUiTaskBuilder(new CachedNumberLookupWorker())
             .build();
@@ -134,10 +134,10 @@
   }
 
   public static synchronized ContactInfoCache getInstance(Context mContext) {
-    if (sCache == null) {
-      sCache = new ContactInfoCache(mContext.getApplicationContext());
+    if (cache == null) {
+      cache = new ContactInfoCache(mContext.getApplicationContext());
     }
-    return sCache;
+    return cache;
   }
 
   static ContactCacheEntry buildCacheEntryFromCall(
@@ -300,7 +300,7 @@
   }
 
   ContactCacheEntry getInfo(String callId) {
-    return mInfoMap.get(callId);
+    return infoMap.get(callId);
   }
 
   private static final class CnapInformationWrapper {
@@ -328,7 +328,7 @@
     }
     if (cachedNumberLookupService == null
         || TextUtils.isEmpty(info.cnapName)
-        || mInfoMap.get(call.getId()) != null) {
+        || infoMap.get(call.getId()) != null) {
       return;
     }
     Log.i(TAG, "Found contact with CNAP name - inserting into cache");
@@ -355,8 +355,8 @@
 
     Trace.beginSection("prepare callback");
     final String callId = call.getId();
-    final ContactCacheEntry cacheEntry = mInfoMap.get(callId);
-    Set<ContactInfoCacheCallback> callBacks = mCallBacks.get(callId);
+    final ContactCacheEntry cacheEntry = infoMap.get(callId);
+    Set<ContactInfoCacheCallback> callBacks = this.callBacks.get(callId);
 
     // We need to force a new query if phone number has changed.
     boolean forceQuery = needForceQuery(call, cacheEntry);
@@ -392,7 +392,7 @@
       // New lookup
       callBacks = new ArraySet<>();
       callBacks.add(callback);
-      mCallBacks.put(callId, callBacks);
+      this.callBacks.put(callId, callBacks);
     }
 
     Trace.beginSection("prepare query");
@@ -402,11 +402,11 @@
      * such as those for voicemail and emergency call information, will not perform an additional
      * asynchronous query.
      */
-    final CallerInfoQueryToken queryToken = new CallerInfoQueryToken(mQueryId, callId);
-    mQueryId++;
+    final CallerInfoQueryToken queryToken = new CallerInfoQueryToken(queryId, callId);
+    queryId++;
     final CallerInfo callerInfo =
         CallerInfoUtils.getCallerInfoForCall(
-            mContext,
+            context,
             call,
             new DialerCallCookieWrapper(callId, call.getNumberPresentation(), call.getCnapName()),
             new FindInfoCallback(isIncoming, queryToken));
@@ -417,7 +417,7 @@
       // back. We should only update the queryId. Otherwise, we may see
       // flicker of the name and image (old cache -> new cache before query
       // -> new cache after query)
-      cacheEntry.queryId = queryToken.mQueryId;
+      cacheEntry.queryId = queryToken.queryId;
       Log.d(TAG, "There is an existing cache. Do not override until new query is back");
     } else {
       ContactCacheEntry initialCacheEntry =
@@ -441,20 +441,20 @@
         "updateCallerInfoInCacheOnAnyThread: callId = "
             + callId
             + "; queryId = "
-            + queryToken.mQueryId
+            + queryToken.queryId
             + "; didLocalLookup = "
             + didLocalLookup);
 
-    ContactCacheEntry existingCacheEntry = mInfoMap.get(callId);
+    ContactCacheEntry existingCacheEntry = infoMap.get(callId);
     Log.d(TAG, "Existing cacheEntry in hashMap " + existingCacheEntry);
 
     // Mark it as emergency/voicemail if the cache exists and was emergency/voicemail before the
     // number changed.
     if (existingCacheEntry != null) {
       if (existingCacheEntry.isEmergencyNumber) {
-        callerInfo.markAsEmergency(mContext);
+        callerInfo.markAsEmergency(context);
       } else if (existingCacheEntry.isVoicemailNumber) {
-        callerInfo.markAsVoiceMail(mContext);
+        callerInfo.markAsVoiceMail(context);
       }
     }
 
@@ -466,8 +466,8 @@
     }
 
     // We always replace the entry. The only exception is the same photo case.
-    ContactCacheEntry cacheEntry = buildEntry(mContext, callerInfo, presentationMode);
-    cacheEntry.queryId = queryToken.mQueryId;
+    ContactCacheEntry cacheEntry = buildEntry(context, callerInfo, presentationMode);
+    cacheEntry.queryId = queryToken.queryId;
 
     if (didLocalLookup) {
       if (cacheEntry.displayPhotoUri != null) {
@@ -491,17 +491,17 @@
         cacheEntry.hasPendingQuery = true;
         ContactsAsyncHelper.startObtainPhotoAsync(
             TOKEN_UPDATE_PHOTO_FOR_CALL_STATE,
-            mContext,
+            context,
             cacheEntry.displayPhotoUri,
             ContactInfoCache.this,
             queryToken);
       }
       Log.d(TAG, "put entry into map: " + cacheEntry);
-      mInfoMap.put(callId, cacheEntry);
+      infoMap.put(callId, cacheEntry);
     } else {
       // Don't overwrite if there is existing cache.
       Log.d(TAG, "put entry into map if not exists: " + cacheEntry);
-      mInfoMap.putIfAbsent(callId, cacheEntry);
+      infoMap.putIfAbsent(callId, cacheEntry);
     }
     Trace.endSection();
     return cacheEntry;
@@ -509,7 +509,7 @@
 
   private void maybeUpdateFromCequintCallerId(
       CallerInfo callerInfo, String cnapName, boolean isIncoming) {
-    if (!CequintCallerIdManager.isCequintCallerIdEnabled(mContext)) {
+    if (!CequintCallerIdManager.isCequintCallerIdEnabled(context)) {
       return;
     }
     if (callerInfo.phoneNumber == null) {
@@ -517,7 +517,7 @@
     }
     CequintCallerIdContact cequintCallerIdContact =
         CequintCallerIdManager.getCequintCallerIdContactForInCall(
-            mContext, callerInfo.phoneNumber, cnapName, isIncoming);
+            context, callerInfo.phoneNumber, cnapName, isIncoming);
 
     if (cequintCallerIdContact == null) {
       return;
@@ -553,8 +553,8 @@
   public void onImageLoaded(int token, Drawable photo, Bitmap photoIcon, Object cookie) {
     Assert.isWorkerThread();
     CallerInfoQueryToken myCookie = (CallerInfoQueryToken) cookie;
-    final String callId = myCookie.mCallId;
-    final int queryId = myCookie.mQueryId;
+    final String callId = myCookie.callId;
+    final int queryId = myCookie.queryId;
     if (!isWaitingForThisQuery(callId, queryId)) {
       return;
     }
@@ -562,12 +562,12 @@
   }
 
   private void loadImage(Drawable photo, Bitmap photoIcon, Object cookie) {
-    Log.d(TAG, "Image load complete with context: ", mContext);
+    Log.d(TAG, "Image load complete with context: ", context);
     // TODO: may be nice to update the image view again once the newer one
     // is available on contacts database.
     CallerInfoQueryToken myCookie = (CallerInfoQueryToken) cookie;
-    final String callId = myCookie.mCallId;
-    ContactCacheEntry entry = mInfoMap.get(callId);
+    final String callId = myCookie.callId;
+    ContactCacheEntry entry = infoMap.get(callId);
 
     if (entry == null) {
       Log.e(TAG, "Image Load received for empty search entry.");
@@ -584,7 +584,7 @@
       entry.photoType = ContactPhotoType.CONTACT;
     } else if (photoIcon != null) {
       Log.v(TAG, "photo icon: ", photoIcon);
-      entry.photo = new BitmapDrawable(mContext.getResources(), photoIcon);
+      entry.photo = new BitmapDrawable(context.getResources(), photoIcon);
       entry.photoType = ContactPhotoType.CONTACT;
     } else {
       Log.v(TAG, "unknown photo");
@@ -602,21 +602,21 @@
   public void onImageLoadComplete(int token, Drawable photo, Bitmap photoIcon, Object cookie) {
     Assert.isMainThread();
     CallerInfoQueryToken myCookie = (CallerInfoQueryToken) cookie;
-    final String callId = myCookie.mCallId;
-    final int queryId = myCookie.mQueryId;
+    final String callId = myCookie.callId;
+    final int queryId = myCookie.queryId;
     if (!isWaitingForThisQuery(callId, queryId)) {
       return;
     }
-    sendImageNotifications(callId, mInfoMap.get(callId));
+    sendImageNotifications(callId, infoMap.get(callId));
 
     clearCallbacks(callId);
   }
 
   /** Blows away the stored cache values. */
   public void clearCache() {
-    mInfoMap.clear();
-    mCallBacks.clear();
-    mQueryId = 0;
+    infoMap.clear();
+    callBacks.clear();
+    queryId = 0;
   }
 
   private ContactCacheEntry buildEntry(Context context, CallerInfo info, int presentation) {
@@ -662,7 +662,7 @@
   private void sendInfoNotifications(String callId, ContactCacheEntry entry) {
     Trace.beginSection("ContactInfoCache.sendInfoNotifications");
     Assert.isMainThread();
-    final Set<ContactInfoCacheCallback> callBacks = mCallBacks.get(callId);
+    final Set<ContactInfoCacheCallback> callBacks = this.callBacks.get(callId);
     if (callBacks != null) {
       for (ContactInfoCacheCallback callBack : callBacks) {
         callBack.onContactInfoComplete(callId, entry);
@@ -675,7 +675,7 @@
   private void sendImageNotifications(String callId, ContactCacheEntry entry) {
     Trace.beginSection("ContactInfoCache.sendImageNotifications");
     Assert.isMainThread();
-    final Set<ContactInfoCacheCallback> callBacks = mCallBacks.get(callId);
+    final Set<ContactInfoCacheCallback> callBacks = this.callBacks.get(callId);
     if (callBacks != null && entry.photo != null) {
       for (ContactInfoCacheCallback callBack : callBacks) {
         callBack.onImageLoadComplete(callId, entry);
@@ -685,7 +685,7 @@
   }
 
   private void clearCallbacks(String callId) {
-    mCallBacks.remove(callId);
+    callBacks.remove(callId);
   }
 
   /** Callback interface for the contact query. */
@@ -791,26 +791,26 @@
 
   private class FindInfoCallback implements OnQueryCompleteListener {
 
-    private final boolean mIsIncoming;
-    private final CallerInfoQueryToken mQueryToken;
+    private final boolean isIncoming;
+    private final CallerInfoQueryToken queryToken;
 
     FindInfoCallback(boolean isIncoming, CallerInfoQueryToken queryToken) {
-      mIsIncoming = isIncoming;
-      mQueryToken = queryToken;
+      this.isIncoming = isIncoming;
+      this.queryToken = queryToken;
     }
 
     @Override
     public void onDataLoaded(int token, Object cookie, CallerInfo ci) {
       Assert.isWorkerThread();
       DialerCallCookieWrapper cw = (DialerCallCookieWrapper) cookie;
-      if (!isWaitingForThisQuery(cw.callId, mQueryToken.mQueryId)) {
+      if (!isWaitingForThisQuery(cw.callId, queryToken.queryId)) {
         return;
       }
       long start = SystemClock.uptimeMillis();
-      maybeUpdateFromCequintCallerId(ci, cw.cnapName, mIsIncoming);
+      maybeUpdateFromCequintCallerId(ci, cw.cnapName, isIncoming);
       long time = SystemClock.uptimeMillis() - start;
       Log.d(TAG, "Cequint Caller Id look up takes " + time + " ms.");
-      updateCallerInfoInCacheOnAnyThread(cw.callId, cw.numberPresentation, ci, true, mQueryToken);
+      updateCallerInfoInCacheOnAnyThread(cw.callId, cw.numberPresentation, ci, true, queryToken);
     }
 
     @Override
@@ -819,11 +819,11 @@
       Assert.isMainThread();
       DialerCallCookieWrapper cw = (DialerCallCookieWrapper) cookie;
       String callId = cw.callId;
-      if (!isWaitingForThisQuery(cw.callId, mQueryToken.mQueryId)) {
+      if (!isWaitingForThisQuery(cw.callId, queryToken.queryId)) {
         Trace.endSection();
         return;
       }
-      ContactCacheEntry cacheEntry = mInfoMap.get(callId);
+      ContactCacheEntry cacheEntry = infoMap.get(callId);
       // This may happen only when InCallPresenter attempt to cleanup.
       if (cacheEntry == null) {
         Log.w(TAG, "Contact lookup done, but cache entry is not found.");
@@ -834,12 +834,12 @@
       // Before issuing a request for more data from other services, we only check that the
       // contact wasn't found in the local DB.  We don't check the if the cache entry already
       // has a name because we allow overriding cnap data with data from other services.
-      if (!callerInfo.contactExists && mPhoneNumberService != null) {
+      if (!callerInfo.contactExists && phoneNumberService != null) {
         Log.d(TAG, "Contact lookup. Local contacts miss, checking remote");
         final PhoneNumberServiceListener listener =
-            new PhoneNumberServiceListener(callId, mQueryToken.mQueryId);
+            new PhoneNumberServiceListener(callId, queryToken.queryId);
         cacheEntry.hasPendingQuery = true;
-        mPhoneNumberService.getPhoneNumberInfo(cacheEntry.number, listener, listener, mIsIncoming);
+        phoneNumberService.getPhoneNumberInfo(cacheEntry.number, listener, listener, isIncoming);
       }
       sendInfoNotifications(callId, cacheEntry);
       if (!cacheEntry.hasPendingQuery) {
@@ -860,18 +860,18 @@
   class PhoneNumberServiceListener
       implements PhoneNumberService.NumberLookupListener, PhoneNumberService.ImageLookupListener {
 
-    private final String mCallId;
-    private final int mQueryIdOfRemoteLookup;
+    private final String callId;
+    private final int queryIdOfRemoteLookup;
 
     PhoneNumberServiceListener(String callId, int queryId) {
-      mCallId = callId;
-      mQueryIdOfRemoteLookup = queryId;
+      this.callId = callId;
+      queryIdOfRemoteLookup = queryId;
     }
 
     @Override
     public void onPhoneNumberInfoComplete(final PhoneNumberService.PhoneNumberInfo info) {
       Log.d(TAG, "PhoneNumberServiceListener.onPhoneNumberInfoComplete");
-      if (!isWaitingForThisQuery(mCallId, mQueryIdOfRemoteLookup)) {
+      if (!isWaitingForThisQuery(callId, queryIdOfRemoteLookup)) {
         return;
       }
 
@@ -879,7 +879,7 @@
       // so clear the callbacks and return.
       if (info == null) {
         Log.d(TAG, "Contact lookup done. Remote contact not found.");
-        clearCallbacks(mCallId);
+        clearCallbacks(callId);
         return;
       }
       ContactCacheEntry entry = new ContactCacheEntry();
@@ -892,10 +892,10 @@
       if (type == Phone.TYPE_CUSTOM) {
         entry.label = label;
       } else {
-        final CharSequence typeStr = Phone.getTypeLabel(mContext.getResources(), type, label);
+        final CharSequence typeStr = Phone.getTypeLabel(context.getResources(), type, label);
         entry.label = typeStr == null ? null : typeStr.toString();
       }
-      final ContactCacheEntry oldEntry = mInfoMap.get(mCallId);
+      final ContactCacheEntry oldEntry = infoMap.get(callId);
       if (oldEntry != null) {
         // Location is only obtained from local lookup so persist
         // the value for remote lookups. Once we have a name this
@@ -915,25 +915,25 @@
       }
 
       Log.d(TAG, "put entry into map: " + entry);
-      mInfoMap.put(mCallId, entry);
-      sendInfoNotifications(mCallId, entry);
+      infoMap.put(callId, entry);
+      sendInfoNotifications(callId, entry);
 
       entry.hasPendingQuery = info.getImageUrl() != null;
 
       // If there is no image then we should not expect another callback.
       if (!entry.hasPendingQuery) {
         // We're done, so clear callbacks
-        clearCallbacks(mCallId);
+        clearCallbacks(callId);
       }
     }
 
     @Override
     public void onImageFetchComplete(Bitmap bitmap) {
       Log.d(TAG, "PhoneNumberServiceListener.onImageFetchComplete");
-      if (!isWaitingForThisQuery(mCallId, mQueryIdOfRemoteLookup)) {
+      if (!isWaitingForThisQuery(callId, queryIdOfRemoteLookup)) {
         return;
       }
-      CallerInfoQueryToken queryToken = new CallerInfoQueryToken(mQueryIdOfRemoteLookup, mCallId);
+      CallerInfoQueryToken queryToken = new CallerInfoQueryToken(queryIdOfRemoteLookup, callId);
       loadImage(null, bitmap, queryToken);
       onImageLoadComplete(TOKEN_UPDATE_PHOTO_FOR_CALL_STATE, null, bitmap, queryToken);
     }
@@ -961,18 +961,18 @@
   }
 
   private static final class CallerInfoQueryToken {
-    final int mQueryId;
-    final String mCallId;
+    final int queryId;
+    final String callId;
 
     CallerInfoQueryToken(int queryId, String callId) {
-      mQueryId = queryId;
-      mCallId = callId;
+      this.queryId = queryId;
+      this.callId = callId;
     }
   }
 
   /** Check if the queryId in the cached map is the same as the one from query result. */
   private boolean isWaitingForThisQuery(String callId, int queryId) {
-    final ContactCacheEntry existingCacheEntry = mInfoMap.get(callId);
+    final ContactCacheEntry existingCacheEntry = infoMap.get(callId);
     if (existingCacheEntry == null) {
       // This might happen if lookup on background thread comes back before the initial entry is
       // created.
diff --git a/java/com/android/incallui/ContactsPreferencesFactory.java b/java/com/android/incallui/ContactsPreferencesFactory.java
index 429de7b..a9a2109 100644
--- a/java/com/android/incallui/ContactsPreferencesFactory.java
+++ b/java/com/android/incallui/ContactsPreferencesFactory.java
@@ -24,8 +24,8 @@
 /** Factory class for {@link ContactsPreferences}. */
 public class ContactsPreferencesFactory {
 
-  private static boolean sUseTestInstance;
-  private static ContactsPreferences sTestInstance;
+  private static boolean useTestInstance;
+  private static ContactsPreferences testInstance;
 
   /**
    * Creates a new {@link ContactsPreferences} object if possible.
@@ -35,8 +35,8 @@
    */
   @Nullable
   public static ContactsPreferences newContactsPreferences(Context context) {
-    if (sUseTestInstance) {
-      return sTestInstance;
+    if (useTestInstance) {
+      return testInstance;
     }
     if (UserManagerCompat.isUserUnlocked(context)) {
       return new ContactsPreferences(context);
@@ -50,7 +50,7 @@
    * @param testInstance the instance to return.
    */
   static void setTestInstance(ContactsPreferences testInstance) {
-    sUseTestInstance = true;
-    sTestInstance = testInstance;
+    useTestInstance = true;
+    ContactsPreferencesFactory.testInstance = testInstance;
   }
 }
diff --git a/java/com/android/incallui/DialpadFragment.java b/java/com/android/incallui/DialpadFragment.java
index b2aacf7..c5b9d78 100644
--- a/java/com/android/incallui/DialpadFragment.java
+++ b/java/com/android/incallui/DialpadFragment.java
@@ -45,26 +45,26 @@
     implements DialpadUi, OnKeyListener, OnClickListener, OnPressedListener {
 
   /** Hash Map to map a view id to a character */
-  private static final Map<Integer, Character> mDisplayMap = new ArrayMap<>();
+  private static final Map<Integer, Character> displayMap = new ArrayMap<>();
 
   /** Set up the static maps */
   static {
     // Map the buttons to the display characters
-    mDisplayMap.put(R.id.one, '1');
-    mDisplayMap.put(R.id.two, '2');
-    mDisplayMap.put(R.id.three, '3');
-    mDisplayMap.put(R.id.four, '4');
-    mDisplayMap.put(R.id.five, '5');
-    mDisplayMap.put(R.id.six, '6');
-    mDisplayMap.put(R.id.seven, '7');
-    mDisplayMap.put(R.id.eight, '8');
-    mDisplayMap.put(R.id.nine, '9');
-    mDisplayMap.put(R.id.zero, '0');
-    mDisplayMap.put(R.id.pound, '#');
-    mDisplayMap.put(R.id.star, '*');
+    displayMap.put(R.id.one, '1');
+    displayMap.put(R.id.two, '2');
+    displayMap.put(R.id.three, '3');
+    displayMap.put(R.id.four, '4');
+    displayMap.put(R.id.five, '5');
+    displayMap.put(R.id.six, '6');
+    displayMap.put(R.id.seven, '7');
+    displayMap.put(R.id.eight, '8');
+    displayMap.put(R.id.nine, '9');
+    displayMap.put(R.id.zero, '0');
+    displayMap.put(R.id.pound, '#');
+    displayMap.put(R.id.star, '*');
   }
 
-  private final int[] mButtonIds =
+  private final int[] buttonIds =
       new int[] {
         R.id.zero,
         R.id.one,
@@ -79,11 +79,11 @@
         R.id.star,
         R.id.pound
       };
-  private EditText mDtmfDialerField;
+  private EditText dtmfDialerField;
   // KeyListener used with the "dialpad digits" EditText widget.
-  private DtmfKeyListener mDtmfKeyListener;
-  private DialpadView mDialpadView;
-  private int mCurrentTextColor;
+  private DtmfKeyListener dtmfKeyListener;
+  private DialpadView dialpadView;
+  private int currentTextColor;
 
   @Override
   public void onClick(View v) {
@@ -100,11 +100,11 @@
 
     if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_ENTER) {
       int viewId = v.getId();
-      if (mDisplayMap.containsKey(viewId)) {
+      if (displayMap.containsKey(viewId)) {
         switch (event.getAction()) {
           case KeyEvent.ACTION_DOWN:
             if (event.getRepeatCount() == 0) {
-              getPresenter().processDtmf(mDisplayMap.get(viewId));
+              getPresenter().processDtmf(displayMap.get(viewId));
             }
             break;
           case KeyEvent.ACTION_UP:
@@ -135,21 +135,21 @@
   public View onCreateView(
       LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
     final View parent = inflater.inflate(R.layout.incall_dialpad_fragment, container, false);
-    mDialpadView = (DialpadView) parent.findViewById(R.id.dialpad_view);
-    mDialpadView.setCanDigitsBeEdited(false);
-    mDialpadView.setBackgroundResource(R.color.incall_dialpad_background);
-    mDtmfDialerField = (EditText) parent.findViewById(R.id.digits);
-    if (mDtmfDialerField != null) {
+    dialpadView = (DialpadView) parent.findViewById(R.id.dialpad_view);
+    dialpadView.setCanDigitsBeEdited(false);
+    dialpadView.setBackgroundResource(R.color.incall_dialpad_background);
+    dtmfDialerField = (EditText) parent.findViewById(R.id.digits);
+    if (dtmfDialerField != null) {
       LogUtil.i("DialpadFragment.onCreateView", "creating dtmfKeyListener");
-      mDtmfKeyListener = new DtmfKeyListener(getPresenter());
-      mDtmfDialerField.setKeyListener(mDtmfKeyListener);
+      dtmfKeyListener = new DtmfKeyListener(getPresenter());
+      dtmfDialerField.setKeyListener(dtmfKeyListener);
       // remove the long-press context menus that support
       // the edit (copy / paste / select) functions.
-      mDtmfDialerField.setLongClickable(false);
-      mDtmfDialerField.setElegantTextHeight(false);
+      dtmfDialerField.setLongClickable(false);
+      dtmfDialerField.setElegantTextHeight(false);
       configureKeypadListeners();
     }
-    View backButton = mDialpadView.findViewById(R.id.dialpad_back);
+    View backButton = dialpadView.findViewById(R.id.dialpad_back);
     backButton.setVisibility(View.VISIBLE);
     backButton.setOnClickListener(this);
 
@@ -165,22 +165,22 @@
   public void updateColors() {
     int textColor = InCallPresenter.getInstance().getThemeColorManager().getPrimaryColor();
 
-    if (mCurrentTextColor == textColor) {
+    if (currentTextColor == textColor) {
       return;
     }
 
     DialpadKeyButton dialpadKey;
-    for (int i = 0; i < mButtonIds.length; i++) {
-      dialpadKey = (DialpadKeyButton) mDialpadView.findViewById(mButtonIds[i]);
+    for (int i = 0; i < buttonIds.length; i++) {
+      dialpadKey = (DialpadKeyButton) dialpadView.findViewById(buttonIds[i]);
       ((TextView) dialpadKey.findViewById(R.id.dialpad_key_number)).setTextColor(textColor);
     }
 
-    mCurrentTextColor = textColor;
+    currentTextColor = textColor;
   }
 
   @Override
   public void onDestroyView() {
-    mDtmfKeyListener = null;
+    dtmfKeyListener = null;
     super.onDestroyView();
   }
 
@@ -190,7 +190,7 @@
    * @return String containing current Dialpad EditText text.
    */
   public String getDtmfText() {
-    return mDtmfDialerField.getText().toString();
+    return dtmfDialerField.getText().toString();
   }
 
   /**
@@ -199,7 +199,7 @@
    * @param text Text to set Dialpad EditText to.
    */
   public void setDtmfText(String text) {
-    mDtmfDialerField.setText(PhoneNumberUtilsCompat.createTtsSpannable(text));
+    dtmfDialerField.setText(PhoneNumberUtilsCompat.createTtsSpannable(text));
   }
 
   /** Starts the slide up animation for the Dialpad keys when the Dialpad is revealed. */
@@ -210,7 +210,7 @@
 
   @Override
   public void appendDigitsToField(char digit) {
-    if (mDtmfDialerField != null) {
+    if (dtmfDialerField != null) {
       // TODO: maybe *don't* manually append this digit if
       // mDialpadDigits is focused and this key came from the HW
       // keyboard, since in that case the EditText field will
@@ -220,15 +220,15 @@
       // *not* handle HW key presses.  That seems to be more
       // complicated than just setting focusable="false" on it,
       // though.)
-      mDtmfDialerField.getText().append(digit);
+      dtmfDialerField.getText().append(digit);
     }
   }
 
   /** Called externally (from InCallScreen) to play a DTMF Tone. */
   /* package */ boolean onDialerKeyDown(KeyEvent event) {
     Log.d(this, "Notifying dtmf key down.");
-    if (mDtmfKeyListener != null) {
-      return mDtmfKeyListener.onKeyDown(event);
+    if (dtmfKeyListener != null) {
+      return dtmfKeyListener.onKeyDown(event);
     } else {
       return false;
     }
@@ -237,8 +237,8 @@
   /** Called externally (from InCallScreen) to cancel the last DTMF Tone played. */
   public boolean onDialerKeyUp(KeyEvent event) {
     Log.d(this, "Notifying dtmf key up.");
-    if (mDtmfKeyListener != null) {
-      return mDtmfKeyListener.onKeyUp(event);
+    if (dtmfKeyListener != null) {
+      return dtmfKeyListener.onKeyUp(event);
     } else {
       return false;
     }
@@ -246,8 +246,8 @@
 
   private void configureKeypadListeners() {
     DialpadKeyButton dialpadKey;
-    for (int i = 0; i < mButtonIds.length; i++) {
-      dialpadKey = (DialpadKeyButton) mDialpadView.findViewById(mButtonIds[i]);
+    for (int i = 0; i < buttonIds.length; i++) {
+      dialpadKey = (DialpadKeyButton) dialpadView.findViewById(buttonIds[i]);
       dialpadKey.setOnKeyListener(this);
       dialpadKey.setOnClickListener(this);
       dialpadKey.setOnPressedListener(this);
@@ -256,11 +256,11 @@
 
   @Override
   public void onPressed(View view, boolean pressed) {
-    if (pressed && mDisplayMap.containsKey(view.getId())) {
+    if (pressed && displayMap.containsKey(view.getId())) {
       Logger.get(getContext())
           .logImpression(DialerImpression.Type.IN_CALL_DIALPAD_NUMBER_BUTTON_PRESSED);
-      Log.d(this, "onPressed: " + pressed + " " + mDisplayMap.get(view.getId()));
-      getPresenter().processDtmf(mDisplayMap.get(view.getId()));
+      Log.d(this, "onPressed: " + pressed + " " + displayMap.get(view.getId()));
+      getPresenter().processDtmf(displayMap.get(view.getId()));
     }
     if (!pressed) {
       Log.d(this, "onPressed: " + pressed);
diff --git a/java/com/android/incallui/DialpadPresenter.java b/java/com/android/incallui/DialpadPresenter.java
index 002fefc..e6fbdc2 100644
--- a/java/com/android/incallui/DialpadPresenter.java
+++ b/java/com/android/incallui/DialpadPresenter.java
@@ -28,13 +28,13 @@
 public class DialpadPresenter extends Presenter<DialpadUi>
     implements InCallPresenter.InCallStateListener {
 
-  private DialerCall mCall;
+  private DialerCall call;
 
   @Override
   public void onUiReady(DialpadUi ui) {
     super.onUiReady(ui);
     InCallPresenter.getInstance().addListener(this);
-    mCall = CallList.getInstance().getOutgoingOrActive();
+    call = CallList.getInstance().getOutgoingOrActive();
   }
 
   @Override
@@ -48,8 +48,8 @@
       InCallPresenter.InCallState oldState,
       InCallPresenter.InCallState newState,
       CallList callList) {
-    mCall = callList.getOutgoingOrActive();
-    Log.d(this, "DialpadPresenter mCall = " + mCall);
+    call = callList.getOutgoingOrActive();
+    Log.d(this, "DialpadPresenter mCall = " + call);
   }
 
   /**
@@ -59,7 +59,7 @@
   public final void processDtmf(char c) {
     Log.d(this, "Processing dtmf key " + c);
     // if it is a valid key, then update the display and send the dtmf tone.
-    if (PhoneNumberUtils.is12Key(c) && mCall != null) {
+    if (PhoneNumberUtils.is12Key(c) && call != null) {
       Log.d(this, "updating display and sending dtmf tone for '" + c + "'");
 
       // Append this key to the "digits" widget.
@@ -68,7 +68,7 @@
         dialpadUi.appendDigitsToField(c);
       }
       // Plays the tone through Telecom.
-      TelecomAdapter.getInstance().playDtmfTone(mCall.getId(), c);
+      TelecomAdapter.getInstance().playDtmfTone(call.getId(), c);
     } else {
       Log.d(this, "ignoring dtmf request for '" + c + "'");
     }
@@ -76,9 +76,9 @@
 
   /** Stops the local tone based on the phone type. */
   public void stopDtmf() {
-    if (mCall != null) {
+    if (call != null) {
       Log.d(this, "stopping remote tone");
-      TelecomAdapter.getInstance().stopDtmfTone(mCall.getId());
+      TelecomAdapter.getInstance().stopDtmfTone(call.getId());
     }
   }
 
diff --git a/java/com/android/incallui/ExternalCallNotifier.java b/java/com/android/incallui/ExternalCallNotifier.java
index 7915b85..8c882d2 100644
--- a/java/com/android/incallui/ExternalCallNotifier.java
+++ b/java/com/android/incallui/ExternalCallNotifier.java
@@ -73,18 +73,18 @@
    */
   private static final String GROUP_KEY = "ExternalCallGroup";
 
-  private final Context mContext;
-  private final ContactInfoCache mContactInfoCache;
-  private Map<Call, NotificationInfo> mNotifications = new ArrayMap<>();
-  private int mNextUniqueNotificationId;
-  private ContactsPreferences mContactsPreferences;
+  private final Context context;
+  private final ContactInfoCache contactInfoCache;
+  private Map<Call, NotificationInfo> notifications = new ArrayMap<>();
+  private int nextUniqueNotificationId;
+  private ContactsPreferences contactsPreferences;
 
   /** Initializes a new instance of the external call notifier. */
   public ExternalCallNotifier(
       @NonNull Context context, @NonNull ContactInfoCache contactInfoCache) {
-    mContext = context;
-    mContactsPreferences = ContactsPreferencesFactory.newContactsPreferences(mContext);
-    mContactInfoCache = contactInfoCache;
+    this.context = context;
+    contactsPreferences = ContactsPreferencesFactory.newContactsPreferences(this.context);
+    this.contactInfoCache = contactInfoCache;
   }
 
   /**
@@ -94,9 +94,9 @@
   @Override
   public void onExternalCallAdded(android.telecom.Call call) {
     Log.i(this, "onExternalCallAdded " + call);
-    Assert.checkArgument(!mNotifications.containsKey(call));
-    NotificationInfo info = new NotificationInfo(call, mNextUniqueNotificationId++);
-    mNotifications.put(call, info);
+    Assert.checkArgument(!notifications.containsKey(call));
+    NotificationInfo info = new NotificationInfo(call, nextUniqueNotificationId++);
+    notifications.put(call, info);
 
     showNotifcation(info);
   }
@@ -115,8 +115,8 @@
   /** Handles updates to an external call. */
   @Override
   public void onExternalCallUpdated(Call call) {
-    Assert.checkArgument(mNotifications.containsKey(call));
-    postNotification(mNotifications.get(call));
+    Assert.checkArgument(notifications.containsKey(call));
+    postNotification(notifications.get(call));
   }
 
   @Override
@@ -132,7 +132,7 @@
    */
   @TargetApi(VERSION_CODES.N_MR1)
   public void pullExternalCall(int notificationId) {
-    for (NotificationInfo info : mNotifications.values()) {
+    for (NotificationInfo info : notifications.values()) {
       if (info.getNotificationId() == notificationId
           && CallCompat.canPullExternalCall(info.getCall())) {
         info.getCall().pullExternalCall();
@@ -153,13 +153,13 @@
     // call into the contacts provider for more data.
     DialerCall dialerCall =
         new DialerCall(
-            mContext,
+            context,
             new DialerCallDelegateStub(),
             info.getCall(),
             new LatencyReport(),
             false /* registerCallback */);
 
-    mContactInfoCache.findInfo(
+    contactInfoCache.findInfo(
         dialerCall,
         false /* isIncoming */,
         new ContactInfoCache.ContactInfoCacheCallback() {
@@ -169,7 +169,7 @@
 
             // Ensure notification still exists as the external call could have been
             // removed during async contact info lookup.
-            if (mNotifications.containsKey(info.getCall())) {
+            if (notifications.containsKey(info.getCall())) {
               saveContactInfo(info, entry);
             }
           }
@@ -179,7 +179,7 @@
 
             // Ensure notification still exists as the external call could have been
             // removed during async contact info lookup.
-            if (mNotifications.containsKey(info.getCall())) {
+            if (notifications.containsKey(info.getCall())) {
               savePhoto(info, entry);
             }
           }
@@ -188,13 +188,13 @@
 
   /** Dismisses a notification for an external call. */
   private void dismissNotification(Call call) {
-    Assert.checkArgument(mNotifications.containsKey(call));
+    Assert.checkArgument(notifications.containsKey(call));
 
     // This will also dismiss the group summary if there are no more external call notifications.
     DialerNotificationManager.cancel(
-        mContext, NOTIFICATION_TAG, mNotifications.get(call).getNotificationId());
+        context, NOTIFICATION_TAG, notifications.get(call).getNotificationId());
 
-    mNotifications.remove(call);
+    notifications.remove(call);
   }
 
   /**
@@ -202,9 +202,9 @@
    * the updated notification to the notification manager.
    */
   private void savePhoto(NotificationInfo info, ContactInfoCache.ContactCacheEntry entry) {
-    Bitmap largeIcon = getLargeIconToDisplay(mContext, entry, info.getCall());
+    Bitmap largeIcon = getLargeIconToDisplay(context, entry, info.getCall());
     if (largeIcon != null) {
-      largeIcon = getRoundedIcon(mContext, largeIcon);
+      largeIcon = getRoundedIcon(context, largeIcon);
     }
     info.setLargeIcon(largeIcon);
     postNotification(info);
@@ -215,14 +215,14 @@
    * notification to the notification manager.
    */
   private void saveContactInfo(NotificationInfo info, ContactInfoCache.ContactCacheEntry entry) {
-    info.setContentTitle(getContentTitle(mContext, mContactsPreferences, entry, info.getCall()));
+    info.setContentTitle(getContentTitle(context, contactsPreferences, entry, info.getCall()));
     info.setPersonReference(getPersonReference(entry, info.getCall()));
     postNotification(info);
   }
 
   /** Rebuild an existing or show a new notification given {@link NotificationInfo}. */
   private void postNotification(NotificationInfo info) {
-    Notification.Builder builder = new Notification.Builder(mContext);
+    Notification.Builder builder = new Notification.Builder(context);
     // Set notification as ongoing since calls are long-running versus a point-in-time notice.
     builder.setOngoing(true);
     // Make the notification prioritized over the other normal notifications.
@@ -232,14 +232,14 @@
     boolean isVideoCall = VideoProfile.isVideo(info.getCall().getDetails().getVideoState());
     // Set the content ("Ongoing call on another device")
     builder.setContentText(
-        mContext.getString(
+        context.getString(
             isVideoCall
                 ? R.string.notification_external_video_call
                 : R.string.notification_external_call));
     builder.setSmallIcon(R.drawable.quantum_ic_call_white_24);
     builder.setContentTitle(info.getContentTitle());
     builder.setLargeIcon(info.getLargeIcon());
-    builder.setColor(mContext.getResources().getColor(R.color.dialer_theme_color));
+    builder.setColor(context.getResources().getColor(R.color.dialer_theme_color));
     builder.addPerson(info.getPersonReference());
     if (BuildCompat.isAtLeastO()) {
       builder.setChannelId(NotificationChannelId.DEFAULT);
@@ -253,18 +253,18 @@
           new Intent(
               NotificationBroadcastReceiver.ACTION_PULL_EXTERNAL_CALL,
               null,
-              mContext,
+              context,
               NotificationBroadcastReceiver.class);
       intent.putExtra(
           NotificationBroadcastReceiver.EXTRA_NOTIFICATION_ID, info.getNotificationId());
       builder.addAction(
           new Notification.Action.Builder(
                   R.drawable.quantum_ic_call_white_24,
-                  mContext.getString(
+                  context.getString(
                       isVideoCall
                           ? R.string.notification_take_video_call
                           : R.string.notification_take_call),
-                  PendingIntent.getBroadcast(mContext, info.getNotificationId(), intent, 0))
+                  PendingIntent.getBroadcast(context, info.getNotificationId(), intent, 0))
               .build());
     }
 
@@ -273,9 +273,9 @@
      * set their notification settings to 'hide sensitive content' {@see
      * Notification.Builder#setPublicVersion}.
      */
-    Notification.Builder publicBuilder = new Notification.Builder(mContext);
+    Notification.Builder publicBuilder = new Notification.Builder(context);
     publicBuilder.setSmallIcon(R.drawable.quantum_ic_call_white_24);
-    publicBuilder.setColor(mContext.getResources().getColor(R.color.dialer_theme_color));
+    publicBuilder.setColor(context.getResources().getColor(R.color.dialer_theme_color));
     if (BuildCompat.isAtLeastO()) {
       publicBuilder.setChannelId(NotificationChannelId.DEFAULT);
     }
@@ -284,9 +284,9 @@
     Notification notification = builder.build();
 
     DialerNotificationManager.notify(
-        mContext, NOTIFICATION_TAG, info.getNotificationId(), notification);
+        context, NOTIFICATION_TAG, info.getNotificationId(), notification);
 
-    showGroupSummaryNotification(mContext);
+    showGroupSummaryNotification(context);
   }
 
   /**
@@ -404,47 +404,47 @@
   /** Represents a call and associated cached notification data. */
   private static class NotificationInfo {
 
-    @NonNull private final Call mCall;
-    private final int mNotificationId;
-    @Nullable private String mContentTitle;
-    @Nullable private Bitmap mLargeIcon;
-    @Nullable private String mPersonReference;
+    @NonNull private final Call call;
+    private final int notificationId;
+    @Nullable private String contentTitle;
+    @Nullable private Bitmap largeIcon;
+    @Nullable private String personReference;
 
     public NotificationInfo(@NonNull Call call, int notificationId) {
-      mCall = call;
-      mNotificationId = notificationId;
+      this.call = call;
+      this.notificationId = notificationId;
     }
 
     public Call getCall() {
-      return mCall;
+      return call;
     }
 
     public int getNotificationId() {
-      return mNotificationId;
+      return notificationId;
     }
 
     public @Nullable String getContentTitle() {
-      return mContentTitle;
+      return contentTitle;
     }
 
     public void setContentTitle(@Nullable String contentTitle) {
-      mContentTitle = contentTitle;
+      this.contentTitle = contentTitle;
     }
 
     public @Nullable Bitmap getLargeIcon() {
-      return mLargeIcon;
+      return largeIcon;
     }
 
     public void setLargeIcon(@Nullable Bitmap largeIcon) {
-      mLargeIcon = largeIcon;
+      this.largeIcon = largeIcon;
     }
 
     public @Nullable String getPersonReference() {
-      return mPersonReference;
+      return personReference;
     }
 
     public void setPersonReference(@Nullable String personReference) {
-      mPersonReference = personReference;
+      this.personReference = personReference;
     }
   }
 
diff --git a/java/com/android/incallui/InCallCameraManager.java b/java/com/android/incallui/InCallCameraManager.java
index fdb4226..b5a8f91 100644
--- a/java/com/android/incallui/InCallCameraManager.java
+++ b/java/com/android/incallui/InCallCameraManager.java
@@ -27,21 +27,21 @@
 /** Used to track which camera is used for outgoing video. */
 public class InCallCameraManager {
 
-  private final Set<Listener> mCameraSelectionListeners =
+  private final Set<Listener> cameraSelectionListeners =
       Collections.newSetFromMap(new ConcurrentHashMap<Listener, Boolean>(8, 0.9f, 1));
   /** The camera ID for the front facing camera. */
-  private String mFrontFacingCameraId;
+  private String frontFacingCameraId;
   /** The camera ID for the rear facing camera. */
-  private String mRearFacingCameraId;
+  private String rearFacingCameraId;
   /** The currently active camera. */
-  private boolean mUseFrontFacingCamera;
+  private boolean useFrontFacingCamera;
   /**
    * Indicates whether the list of cameras has been initialized yet. Initialization is delayed until
    * a video call is present.
    */
-  private boolean mIsInitialized = false;
+  private boolean isInitialized = false;
   /** The context. */
-  private Context mContext;
+  private Context context;
 
   /**
    * Initializes the InCall CameraManager.
@@ -49,8 +49,8 @@
    * @param context The current context.
    */
   public InCallCameraManager(Context context) {
-    mUseFrontFacingCamera = true;
-    mContext = context;
+    useFrontFacingCamera = true;
+    this.context = context;
   }
 
   /**
@@ -59,9 +59,9 @@
    * @param useFrontFacingCamera {@code True} if the front facing camera is to be used.
    */
   public void setUseFrontFacingCamera(boolean useFrontFacingCamera) {
-    mUseFrontFacingCamera = useFrontFacingCamera;
-    for (Listener listener : mCameraSelectionListeners) {
-      listener.onActiveCameraSelectionChanged(mUseFrontFacingCamera);
+    this.useFrontFacingCamera = useFrontFacingCamera;
+    for (Listener listener : cameraSelectionListeners) {
+      listener.onActiveCameraSelectionChanged(this.useFrontFacingCamera);
     }
   }
 
@@ -71,7 +71,7 @@
    * @return {@code True} if the front facing camera is in use.
    */
   public boolean isUsingFrontFacingCamera() {
-    return mUseFrontFacingCamera;
+    return useFrontFacingCamera;
   }
 
   /**
@@ -80,18 +80,18 @@
    * @return The active camera ID.
    */
   public String getActiveCameraId() {
-    maybeInitializeCameraList(mContext);
+    maybeInitializeCameraList(context);
 
-    if (mUseFrontFacingCamera) {
-      return mFrontFacingCameraId;
+    if (useFrontFacingCamera) {
+      return frontFacingCameraId;
     } else {
-      return mRearFacingCameraId;
+      return rearFacingCameraId;
     }
   }
 
   /** Calls when camera permission is granted by user. */
   public void onCameraPermissionGranted() {
-    for (Listener listener : mCameraSelectionListeners) {
+    for (Listener listener : cameraSelectionListeners) {
       listener.onCameraPermissionGranted();
     }
   }
@@ -102,7 +102,7 @@
    * @param context The context.
    */
   private void maybeInitializeCameraList(Context context) {
-    if (mIsInitialized || context == null) {
+    if (isInitialized || context == null) {
       return;
     }
 
@@ -141,26 +141,26 @@
       if (c != null) {
         int facingCharacteristic = c.get(CameraCharacteristics.LENS_FACING);
         if (facingCharacteristic == CameraCharacteristics.LENS_FACING_FRONT) {
-          mFrontFacingCameraId = cameraIds[i];
+          frontFacingCameraId = cameraIds[i];
         } else if (facingCharacteristic == CameraCharacteristics.LENS_FACING_BACK) {
-          mRearFacingCameraId = cameraIds[i];
+          rearFacingCameraId = cameraIds[i];
         }
       }
     }
 
-    mIsInitialized = true;
+    isInitialized = true;
     Log.v(this, "initializeCameraList : done");
   }
 
   public void addCameraSelectionListener(Listener listener) {
     if (listener != null) {
-      mCameraSelectionListeners.add(listener);
+      cameraSelectionListeners.add(listener);
     }
   }
 
   public void removeCameraSelectionListener(Listener listener) {
     if (listener != null) {
-      mCameraSelectionListeners.remove(listener);
+      cameraSelectionListeners.remove(listener);
     }
   }
 
diff --git a/java/com/android/incallui/InCallOrientationEventListener.java b/java/com/android/incallui/InCallOrientationEventListener.java
index 8aae6fb..854bdd1 100644
--- a/java/com/android/incallui/InCallOrientationEventListener.java
+++ b/java/com/android/incallui/InCallOrientationEventListener.java
@@ -68,9 +68,9 @@
   private static final int ROTATION_THRESHOLD = 10;
 
   /** Cache the current rotation of the device. */
-  @ScreenOrientation private static int sCurrentOrientation = SCREEN_ORIENTATION_0;
+  @ScreenOrientation private static int currentOrientation = SCREEN_ORIENTATION_0;
 
-  private boolean mEnabled = false;
+  private boolean enabled = false;
 
   public InCallOrientationEventListener(Context context) {
     super(context);
@@ -94,7 +94,7 @@
 
   @ScreenOrientation
   public static int getCurrentOrientation() {
-    return sCurrentOrientation;
+    return currentOrientation;
   }
 
   /**
@@ -114,14 +114,14 @@
 
     final int orientation = toScreenOrientation(rotation);
 
-    if (orientation != SCREEN_ORIENTATION_UNKNOWN && sCurrentOrientation != orientation) {
+    if (orientation != SCREEN_ORIENTATION_UNKNOWN && currentOrientation != orientation) {
       LogUtil.i(
           "InCallOrientationEventListener.onOrientationChanged",
           "orientation: %d -> %d",
-          sCurrentOrientation,
+          currentOrientation,
           orientation);
-      sCurrentOrientation = orientation;
-      InCallPresenter.getInstance().onDeviceOrientationChange(sCurrentOrientation);
+      currentOrientation = orientation;
+      InCallPresenter.getInstance().onDeviceOrientationChange(currentOrientation);
     }
   }
 
@@ -133,15 +133,15 @@
    *     changed.
    */
   public void enable(boolean notifyDeviceOrientationChange) {
-    if (mEnabled) {
+    if (enabled) {
       Log.v(this, "enable: Orientation listener is already enabled. Ignoring...");
       return;
     }
 
     super.enable();
-    mEnabled = true;
+    enabled = true;
     if (notifyDeviceOrientationChange) {
-      InCallPresenter.getInstance().onDeviceOrientationChange(sCurrentOrientation);
+      InCallPresenter.getInstance().onDeviceOrientationChange(currentOrientation);
     }
   }
 
@@ -154,18 +154,18 @@
   /** Disables the OrientationEventListener. */
   @Override
   public void disable() {
-    if (!mEnabled) {
+    if (!enabled) {
       Log.v(this, "enable: Orientation listener is already disabled. Ignoring...");
       return;
     }
 
-    mEnabled = false;
+    enabled = false;
     super.disable();
   }
 
   /** Returns true the OrientationEventListener is enabled, false otherwise. */
   public boolean isEnabled() {
-    return mEnabled;
+    return enabled;
   }
 
   /**
diff --git a/java/com/android/incallui/InCallPresenter.java b/java/com/android/incallui/InCallPresenter.java
index 3debd70..ae25f4d 100644
--- a/java/com/android/incallui/InCallPresenter.java
+++ b/java/com/android/incallui/InCallPresenter.java
@@ -93,53 +93,53 @@
 
   private static final Bundle EMPTY_EXTRAS = new Bundle();
 
-  private static InCallPresenter sInCallPresenter;
+  private static InCallPresenter inCallPresenter;
 
   /**
    * ConcurrentHashMap constructor params: 8 is initial table size, 0.9f is load factor before
    * resizing, 1 means we only expect a single thread to access the map so make only a single shard
    */
-  private final Set<InCallStateListener> mListeners =
+  private final Set<InCallStateListener> listeners =
       Collections.newSetFromMap(new ConcurrentHashMap<InCallStateListener, Boolean>(8, 0.9f, 1));
 
-  private final List<IncomingCallListener> mIncomingCallListeners = new CopyOnWriteArrayList<>();
-  private final Set<InCallDetailsListener> mDetailsListeners =
+  private final List<IncomingCallListener> incomingCallListeners = new CopyOnWriteArrayList<>();
+  private final Set<InCallDetailsListener> detailsListeners =
       Collections.newSetFromMap(new ConcurrentHashMap<InCallDetailsListener, Boolean>(8, 0.9f, 1));
-  private final Set<CanAddCallListener> mCanAddCallListeners =
+  private final Set<CanAddCallListener> canAddCallListeners =
       Collections.newSetFromMap(new ConcurrentHashMap<CanAddCallListener, Boolean>(8, 0.9f, 1));
-  private final Set<InCallUiListener> mInCallUiListeners =
+  private final Set<InCallUiListener> inCallUiListeners =
       Collections.newSetFromMap(new ConcurrentHashMap<InCallUiListener, Boolean>(8, 0.9f, 1));
-  private final Set<InCallOrientationListener> mOrientationListeners =
+  private final Set<InCallOrientationListener> orientationListeners =
       Collections.newSetFromMap(
           new ConcurrentHashMap<InCallOrientationListener, Boolean>(8, 0.9f, 1));
-  private final Set<InCallEventListener> mInCallEventListeners =
+  private final Set<InCallEventListener> inCallEventListeners =
       Collections.newSetFromMap(new ConcurrentHashMap<InCallEventListener, Boolean>(8, 0.9f, 1));
 
-  private StatusBarNotifier mStatusBarNotifier;
-  private ExternalCallNotifier mExternalCallNotifier;
-  private ContactInfoCache mContactInfoCache;
-  private Context mContext;
-  private final OnCheckBlockedListener mOnCheckBlockedListener =
+  private StatusBarNotifier statusBarNotifier;
+  private ExternalCallNotifier externalCallNotifier;
+  private ContactInfoCache contactInfoCache;
+  private Context context;
+  private final OnCheckBlockedListener onCheckBlockedListener =
       new OnCheckBlockedListener() {
         @Override
         public void onCheckComplete(final Integer id) {
           if (id != null && id != FilteredNumberAsyncQueryHandler.INVALID_ID) {
             // Silence the ringer now to prevent ringing and vibration before the call is
             // terminated when Telecom attempts to add it.
-            TelecomUtil.silenceRinger(mContext);
+            TelecomUtil.silenceRinger(context);
           }
         }
       };
-  private CallList mCallList;
-  private ExternalCallList mExternalCallList;
-  private InCallActivity mInCallActivity;
-  private ManageConferenceActivity mManageConferenceActivity;
-  private final android.telecom.Call.Callback mCallCallback =
+  private CallList callList;
+  private ExternalCallList externalCallList;
+  private InCallActivity inCallActivity;
+  private ManageConferenceActivity manageConferenceActivity;
+  private final android.telecom.Call.Callback callCallback =
       new android.telecom.Call.Callback() {
         @Override
         public void onPostDialWait(
             android.telecom.Call telecomCall, String remainingPostDialSequence) {
-          final DialerCall call = mCallList.getDialerCallFromTelecomCall(telecomCall);
+          final DialerCall call = callList.getDialerCallFromTelecomCall(telecomCall);
           if (call == null) {
             LogUtil.w(
                 "InCallPresenter.onPostDialWait",
@@ -152,7 +152,7 @@
         @Override
         public void onDetailsChanged(
             android.telecom.Call telecomCall, android.telecom.Call.Details details) {
-          final DialerCall call = mCallList.getDialerCallFromTelecomCall(telecomCall);
+          final DialerCall call = callList.getDialerCallFromTelecomCall(telecomCall);
           if (call == null) {
             LogUtil.w(
                 "InCallPresenter.onDetailsChanged",
@@ -161,16 +161,16 @@
           }
 
           if (details.hasProperty(Details.PROPERTY_IS_EXTERNAL_CALL)
-              && !mExternalCallList.isCallTracked(telecomCall)) {
+              && !externalCallList.isCallTracked(telecomCall)) {
 
             // A regular call became an external call so swap call lists.
             LogUtil.i("InCallPresenter.onDetailsChanged", "Call became external: " + telecomCall);
-            mCallList.onInternalCallMadeExternal(mContext, telecomCall);
-            mExternalCallList.onCallAdded(telecomCall);
+            callList.onInternalCallMadeExternal(context, telecomCall);
+            externalCallList.onCallAdded(telecomCall);
             return;
           }
 
-          for (InCallDetailsListener listener : mDetailsListeners) {
+          for (InCallDetailsListener listener : detailsListeners) {
             listener.onDetailsChanged(call, details);
           }
         }
@@ -184,38 +184,38 @@
           onDetailsChanged(telecomCall, telecomCall.getDetails());
         }
       };
-  private InCallState mInCallState = InCallState.NO_CALLS;
-  private ProximitySensor mProximitySensor;
-  private final PseudoScreenState mPseudoScreenState = new PseudoScreenState();
-  private boolean mServiceConnected;
-  private InCallCameraManager mInCallCameraManager;
-  private FilteredNumberAsyncQueryHandler mFilteredQueryHandler;
-  private CallList.Listener mSpamCallListListener;
+  private InCallState inCallState = InCallState.NO_CALLS;
+  private ProximitySensor proximitySensor;
+  private final PseudoScreenState pseudoScreenState = new PseudoScreenState();
+  private boolean serviceConnected;
+  private InCallCameraManager inCallCameraManager;
+  private FilteredNumberAsyncQueryHandler filteredQueryHandler;
+  private CallList.Listener spamCallListListener;
   /** Whether or not we are currently bound and waiting for Telecom to send us a new call. */
-  private boolean mBoundAndWaitingForOutgoingCall;
+  private boolean boundAndWaitingForOutgoingCall;
   /** Determines if the InCall UI is in fullscreen mode or not. */
-  private boolean mIsFullScreen = false;
+  private boolean isFullScreen = false;
 
-  private boolean mScreenTimeoutEnabled = true;
+  private boolean screenTimeoutEnabled = true;
 
-  private PhoneStateListener mPhoneStateListener =
+  private PhoneStateListener phoneStateListener =
       new PhoneStateListener() {
         @Override
         public void onCallStateChanged(int state, String incomingNumber) {
           if (state == TelephonyManager.CALL_STATE_RINGING) {
-            if (FilteredNumbersUtil.hasRecentEmergencyCall(mContext)) {
+            if (FilteredNumbersUtil.hasRecentEmergencyCall(context)) {
               return;
             }
             // Check if the number is blocked, to silence the ringer.
-            String countryIso = GeoUtil.getCurrentCountryIso(mContext);
-            mFilteredQueryHandler.isBlockedNumber(
-                mOnCheckBlockedListener, incomingNumber, countryIso);
+            String countryIso = GeoUtil.getCurrentCountryIso(context);
+            filteredQueryHandler.isBlockedNumber(
+                onCheckBlockedListener, incomingNumber, countryIso);
           }
         }
       };
 
   /** Whether or not InCallService is bound to Telecom. */
-  private boolean mServiceBound = false;
+  private boolean serviceBound = false;
 
   /**
    * When configuration changes Android kills the current activity and starts a new one. The flag is
@@ -223,11 +223,11 @@
    * started), or if a new activity will be started right after the current one is destroyed, and
    * therefore no need in release all resources.
    */
-  private boolean mIsChangingConfigurations = false;
+  private boolean isChangingConfigurations = false;
 
-  private boolean mAwaitingCallListUpdate = false;
+  private boolean awaitingCallListUpdate = false;
 
-  private ExternalCallList.ExternalCallListener mExternalCallListener =
+  private ExternalCallList.ExternalCallListener externalCallListener =
       new ExternalCallList.ExternalCallListener() {
 
         @Override
@@ -236,8 +236,8 @@
           LatencyReport latencyReport = new LatencyReport(call);
           latencyReport.onCallBlockingDone();
           // Note: External calls do not require spam checking.
-          mCallList.onCallAdded(mContext, call, latencyReport);
-          call.registerCallback(mCallCallback);
+          callList.onCallAdded(context, call, latencyReport);
+          call.registerCallback(callCallback);
         }
 
         @Override
@@ -256,26 +256,26 @@
         }
       };
 
-  private ThemeColorManager mThemeColorManager;
-  private VideoSurfaceTexture mLocalVideoSurfaceTexture;
-  private VideoSurfaceTexture mRemoteVideoSurfaceTexture;
+  private ThemeColorManager themeColorManager;
+  private VideoSurfaceTexture localVideoSurfaceTexture;
+  private VideoSurfaceTexture remoteVideoSurfaceTexture;
 
   /** Inaccessible constructor. Must use getRunningInstance() to get this singleton. */
   @VisibleForTesting
   InCallPresenter() {}
 
   public static synchronized InCallPresenter getInstance() {
-    if (sInCallPresenter == null) {
+    if (inCallPresenter == null) {
       Trace.beginSection("InCallPresenter.Constructor");
-      sInCallPresenter = new InCallPresenter();
+      inCallPresenter = new InCallPresenter();
       Trace.endSection();
     }
-    return sInCallPresenter;
+    return inCallPresenter;
   }
 
   @VisibleForTesting
   public static synchronized void setInstanceForTesting(InCallPresenter inCallPresenter) {
-    sInCallPresenter = inCallPresenter;
+    InCallPresenter.inCallPresenter = inCallPresenter;
   }
 
   /**
@@ -309,11 +309,11 @@
   }
 
   public InCallState getInCallState() {
-    return mInCallState;
+    return inCallState;
   }
 
   public CallList getCallList() {
-    return mCallList;
+    return callList;
   }
 
   public void setUp(
@@ -326,9 +326,9 @@
       ProximitySensor proximitySensor,
       FilteredNumberAsyncQueryHandler filteredNumberQueryHandler) {
     Trace.beginSection("InCallPresenter.setUp");
-    if (mServiceConnected) {
+    if (serviceConnected) {
       LogUtil.i("InCallPresenter.setUp", "New service connection replacing existing one.");
-      if (context != mContext || callList != mCallList) {
+      if (context != this.context || callList != this.callList) {
         throw new IllegalStateException();
       }
       Trace.endSection();
@@ -336,49 +336,49 @@
     }
 
     Objects.requireNonNull(context);
-    mContext = context;
+    this.context = context;
 
-    mContactInfoCache = contactInfoCache;
+    this.contactInfoCache = contactInfoCache;
 
-    mStatusBarNotifier = statusBarNotifier;
-    mExternalCallNotifier = externalCallNotifier;
-    addListener(mStatusBarNotifier);
-    EnrichedCallComponent.get(mContext)
+    this.statusBarNotifier = statusBarNotifier;
+    this.externalCallNotifier = externalCallNotifier;
+    addListener(this.statusBarNotifier);
+    EnrichedCallComponent.get(this.context)
         .getEnrichedCallManager()
-        .registerStateChangedListener(mStatusBarNotifier);
+        .registerStateChangedListener(this.statusBarNotifier);
 
-    mProximitySensor = proximitySensor;
-    addListener(mProximitySensor);
+    this.proximitySensor = proximitySensor;
+    addListener(this.proximitySensor);
 
-    if (mThemeColorManager == null) {
-      mThemeColorManager =
-          new ThemeColorManager(new InCallUIMaterialColorMapUtils(mContext.getResources()));
+    if (themeColorManager == null) {
+      themeColorManager =
+          new ThemeColorManager(new InCallUIMaterialColorMapUtils(this.context.getResources()));
     }
 
-    mCallList = callList;
-    mExternalCallList = externalCallList;
-    externalCallList.addExternalCallListener(mExternalCallNotifier);
-    externalCallList.addExternalCallListener(mExternalCallListener);
+    this.callList = callList;
+    this.externalCallList = externalCallList;
+    externalCallList.addExternalCallListener(this.externalCallNotifier);
+    externalCallList.addExternalCallListener(externalCallListener);
 
     // This only gets called by the service so this is okay.
-    mServiceConnected = true;
+    serviceConnected = true;
 
     // The final thing we do in this set up is add ourselves as a listener to CallList.  This
     // will kick off an update and the whole process can start.
-    mCallList.addListener(this);
+    this.callList.addListener(this);
 
     // Create spam call list listener and add it to the list of listeners
-    mSpamCallListListener =
+    spamCallListListener =
         new SpamCallListListener(
             context, DialerExecutorComponent.get(context).dialerExecutorFactory());
-    mCallList.addListener(mSpamCallListListener);
+    this.callList.addListener(spamCallListListener);
 
     VideoPauseController.getInstance().setUp(this);
 
-    mFilteredQueryHandler = filteredNumberQueryHandler;
-    mContext
+    filteredQueryHandler = filteredNumberQueryHandler;
+    this.context
         .getSystemService(TelephonyManager.class)
-        .listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
+        .listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
 
     AudioModeProvider.getInstance().addListener(this);
 
@@ -395,13 +395,13 @@
    */
   public void tearDown() {
     LogUtil.d("InCallPresenter.tearDown", "tearDown");
-    mCallList.clearOnDisconnect();
+    callList.clearOnDisconnect();
 
-    mServiceConnected = false;
+    serviceConnected = false;
 
-    mContext
+    context
         .getSystemService(TelephonyManager.class)
-        .listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
+        .listen(phoneStateListener, PhoneStateListener.LISTEN_NONE);
 
     attemptCleanup();
     VideoPauseController.getInstance().tearDown();
@@ -409,12 +409,12 @@
   }
 
   private void attemptFinishActivity() {
-    mScreenTimeoutEnabled = true;
-    final boolean doFinish = (mInCallActivity != null && isActivityStarted());
+    screenTimeoutEnabled = true;
+    final boolean doFinish = (inCallActivity != null && isActivityStarted());
     LogUtil.i("InCallPresenter.attemptFinishActivity", "Hide in call UI: " + doFinish);
     if (doFinish) {
-      mInCallActivity.setExcludeFromRecents(true);
-      mInCallActivity.finish();
+      inCallActivity.setExcludeFromRecents(true);
+      inCallActivity.finish();
     }
   }
 
@@ -426,12 +426,12 @@
     if (inCallActivity == null) {
       throw new IllegalArgumentException("unregisterActivity cannot be called with null");
     }
-    if (mInCallActivity == null) {
+    if (this.inCallActivity == null) {
       LogUtil.i(
           "InCallPresenter.unsetActivity", "No InCallActivity currently set, no need to unset.");
       return;
     }
-    if (mInCallActivity != inCallActivity) {
+    if (this.inCallActivity != inCallActivity) {
       LogUtil.w(
           "InCallPresenter.unsetActivity",
           "Second instance of InCallActivity is trying to unregister when another"
@@ -451,8 +451,8 @@
     boolean doAttemptCleanup = false;
 
     if (inCallActivity != null) {
-      if (mInCallActivity == null) {
-        mContext = inCallActivity.getApplicationContext();
+      if (this.inCallActivity == null) {
+        context = inCallActivity.getApplicationContext();
         updateListeners = true;
         LogUtil.i("InCallPresenter.updateActivity", "UI Initialized");
       } else {
@@ -461,13 +461,13 @@
         // this happens (like going to/from background) so we do not set updateListeners.
       }
 
-      mInCallActivity = inCallActivity;
-      mInCallActivity.setExcludeFromRecents(false);
+      this.inCallActivity = inCallActivity;
+      this.inCallActivity.setExcludeFromRecents(false);
 
       // By the time the UI finally comes up, the call may already be disconnected.
       // If that's the case, we may need to show an error dialog.
-      if (mCallList != null && mCallList.getDisconnectedCall() != null) {
-        showDialogOrToastForDisconnectedCall(mCallList.getDisconnectedCall());
+      if (callList != null && callList.getDisconnectedCall() != null) {
+        showDialogOrToastForDisconnectedCall(callList.getDisconnectedCall());
       }
 
       // When the UI comes up, we need to first check the in-call state.
@@ -476,7 +476,7 @@
       // If we dont have any calls, start tearing down the UI instead.
       // NOTE: This code relies on {@link #mInCallActivity} being set so we run it after
       // it has been set.
-      if (mInCallState == InCallState.NO_CALLS) {
+      if (inCallState == InCallState.NO_CALLS) {
         LogUtil.i("InCallPresenter.updateActivity", "UI Initialized, but no calls left. Shut down");
         attemptFinishActivity();
         Trace.endSection();
@@ -485,7 +485,7 @@
     } else {
       LogUtil.i("InCallPresenter.updateActivity", "UI Destroyed");
       updateListeners = true;
-      mInCallActivity = null;
+      this.inCallActivity = null;
 
       // We attempt cleanup for the destroy case but only after we recalculate the state
       // to see if we need to come back up or stay shut down. This is why we do the
@@ -509,7 +509,7 @@
     // state here even if the service is disconnected since we may not have finished a state
     // transition while finish()ing.
     if (updateListeners) {
-      onCallListChange(mCallList);
+      onCallListChange(callList);
     }
 
     if (doAttemptCleanup) {
@@ -520,7 +520,7 @@
 
   public void setManageConferenceActivity(
       @Nullable ManageConferenceActivity manageConferenceActivity) {
-    mManageConferenceActivity = manageConferenceActivity;
+    this.manageConferenceActivity = manageConferenceActivity;
   }
 
   public void onBringToForeground(boolean showDialpad) {
@@ -535,18 +535,18 @@
       maybeBlockCall(call, latencyReport);
     } else {
       if (call.getDetails().hasProperty(CallCompat.Details.PROPERTY_IS_EXTERNAL_CALL)) {
-        mExternalCallList.onCallAdded(call);
+        externalCallList.onCallAdded(call);
       } else {
         latencyReport.onCallBlockingDone();
-        mCallList.onCallAdded(mContext, call, latencyReport);
+        callList.onCallAdded(context, call, latencyReport);
       }
     }
 
     // Since a call has been added we are no longer waiting for Telecom to send us a call.
     setBoundAndWaitingForOutgoingCall(false, null);
-    call.registerCallback(mCallCallback);
+    call.registerCallback(callCallback);
     // TODO(maxwelb): Return the future in recordPhoneLookupInfo and propagate.
-    PhoneLookupHistoryRecorder.recordPhoneLookupInfo(mContext.getApplicationContext(), call);
+    PhoneLookupHistoryRecorder.recordPhoneLookupInfo(context.getApplicationContext(), call);
     Trace.endSection();
   }
 
@@ -554,7 +554,7 @@
     if (call.getState() != android.telecom.Call.STATE_RINGING) {
       return false;
     }
-    if (!UserManagerCompat.isUserUnlocked(mContext)) {
+    if (!UserManagerCompat.isUserUnlocked(context)) {
       LogUtil.i(
           "InCallPresenter.shouldAttemptBlocking",
           "not attempting to block incoming call because user is locked");
@@ -566,7 +566,7 @@
           "Not attempting to block incoming emergency call");
       return false;
     }
-    if (FilteredNumbersUtil.hasRecentEmergencyCall(mContext)) {
+    if (FilteredNumbersUtil.hasRecentEmergencyCall(context)) {
       LogUtil.i(
           "InCallPresenter.shouldAttemptBlocking",
           "Not attempting to block incoming call due to recent emergency call");
@@ -575,7 +575,7 @@
     if (call.getDetails().hasProperty(CallCompat.Details.PROPERTY_IS_EXTERNAL_CALL)) {
       return false;
     }
-    if (FilteredNumberCompat.useNewFiltering(mContext)) {
+    if (FilteredNumberCompat.useNewFiltering(context)) {
       LogUtil.i(
           "InCallPresenter.shouldAttemptBlocking",
           "not attempting to block incoming call because framework blocking is in use");
@@ -591,7 +591,7 @@
    * call anyways.
    */
   private void maybeBlockCall(final android.telecom.Call call, final LatencyReport latencyReport) {
-    final String countryIso = GeoUtil.getCurrentCountryIso(mContext);
+    final String countryIso = GeoUtil.getCurrentCountryIso(context);
     final String number = TelecomCallUtil.getNumber(call);
     final long timeAdded = System.currentTimeMillis();
 
@@ -609,7 +609,7 @@
           public void run() {
             hasTimedOut.set(true);
             latencyReport.onCallBlockingDone();
-            mCallList.onCallAdded(mContext, call, latencyReport);
+            callList.onCallAdded(context, call, latencyReport);
           }
         };
     handler.postDelayed(runnable, BLOCK_QUERY_TIMEOUT_MS);
@@ -628,7 +628,7 @@
             if (id == null) {
               if (!hasTimedOut.get()) {
                 latencyReport.onCallBlockingDone();
-                mCallList.onCallAdded(mContext, call, latencyReport);
+                callList.onCallAdded(context, call, latencyReport);
               }
             } else if (id == FilteredNumberAsyncQueryHandler.INVALID_ID) {
               LogUtil.d(
@@ -637,68 +637,68 @@
                 handler.removeCallbacks(runnable);
 
                 latencyReport.onCallBlockingDone();
-                mCallList.onCallAdded(mContext, call, latencyReport);
+                callList.onCallAdded(context, call, latencyReport);
               }
             } else {
               LogUtil.i(
                   "InCallPresenter.onCheckComplete", "Rejecting incoming call from blocked number");
               call.reject(false, null);
-              Logger.get(mContext).logInteraction(InteractionEvent.Type.CALL_BLOCKED);
+              Logger.get(context).logInteraction(InteractionEvent.Type.CALL_BLOCKED);
 
               /*
                * If mContext is null, then the InCallPresenter was torn down before the
                * block check had a chance to complete. The context is no longer valid, so
                * don't attempt to remove the call log entry.
                */
-              if (mContext == null) {
+              if (context == null) {
                 return;
               }
               // Register observer to update the call log.
               // BlockedNumberContentObserver will unregister after successful log or timeout.
               BlockedNumberContentObserver contentObserver =
-                  new BlockedNumberContentObserver(mContext, new Handler(), number, timeAdded);
+                  new BlockedNumberContentObserver(context, new Handler(), number, timeAdded);
               contentObserver.register();
             }
           }
         };
 
-    mFilteredQueryHandler.isBlockedNumber(onCheckBlockedListener, number, countryIso);
+    filteredQueryHandler.isBlockedNumber(onCheckBlockedListener, number, countryIso);
   }
 
   public void onCallRemoved(android.telecom.Call call) {
     if (call.getDetails().hasProperty(CallCompat.Details.PROPERTY_IS_EXTERNAL_CALL)) {
-      mExternalCallList.onCallRemoved(call);
+      externalCallList.onCallRemoved(call);
     } else {
-      mCallList.onCallRemoved(mContext, call);
-      call.unregisterCallback(mCallCallback);
+      callList.onCallRemoved(context, call);
+      call.unregisterCallback(callCallback);
     }
   }
 
   public void onCanAddCallChanged(boolean canAddCall) {
-    for (CanAddCallListener listener : mCanAddCallListeners) {
+    for (CanAddCallListener listener : canAddCallListeners) {
       listener.onCanAddCallChanged(canAddCall);
     }
   }
 
   @Override
   public void onWiFiToLteHandover(DialerCall call) {
-    if (mInCallActivity != null) {
-      mInCallActivity.showToastForWiFiToLteHandover(call);
+    if (inCallActivity != null) {
+      inCallActivity.showToastForWiFiToLteHandover(call);
     }
   }
 
   @Override
   public void onHandoverToWifiFailed(DialerCall call) {
-    if (mInCallActivity != null) {
-      mInCallActivity.showDialogOrToastForWifiHandoverFailure(call);
+    if (inCallActivity != null) {
+      inCallActivity.showDialogOrToastForWifiHandoverFailure(call);
     }
   }
 
   @Override
   public void onInternationalCallOnWifi(@NonNull DialerCall call) {
     LogUtil.enterBlock("InCallPresenter.onInternationalCallOnWifi");
-    if (mInCallActivity != null) {
-      mInCallActivity.showDialogForInternationalCallOnWifi(call);
+    if (inCallActivity != null) {
+      inCallActivity.showDialogForInternationalCallOnWifi(call);
     }
   }
 
@@ -711,8 +711,8 @@
   @Override
   public void onCallListChange(CallList callList) {
     Trace.beginSection("InCallPresenter.onCallListChange");
-    if (mInCallActivity != null && mInCallActivity.isInCallScreenAnimating()) {
-      mAwaitingCallListUpdate = true;
+    if (inCallActivity != null && inCallActivity.isInCallScreenAnimating()) {
+      awaitingCallListUpdate = true;
       Trace.endSection();
       return;
     }
@@ -721,10 +721,10 @@
       return;
     }
 
-    mAwaitingCallListUpdate = false;
+    awaitingCallListUpdate = false;
 
     InCallState newState = getPotentialStateFromCallList(callList);
-    InCallState oldState = mInCallState;
+    InCallState oldState = inCallState;
     LogUtil.d(
         "InCallPresenter.onCallListChange",
         "onCallListChange oldState= " + oldState + " newState=" + newState);
@@ -740,7 +740,7 @@
       waitingForAccountCall.disconnect();
       // The InCallActivity might be destroyed or not started yet at this point.
       if (isActivityStarted()) {
-        mInCallActivity.dismissPendingDialogs();
+        inCallActivity.dismissPendingDialogs();
       }
     }
 
@@ -752,20 +752,20 @@
     LogUtil.i(
         "InCallPresenter.onCallListChange",
         "Phone switching state: " + oldState + " -> " + newState);
-    mInCallState = newState;
+    inCallState = newState;
 
     // notify listeners of new state
-    for (InCallStateListener listener : mListeners) {
+    for (InCallStateListener listener : listeners) {
       LogUtil.d(
           "InCallPresenter.onCallListChange",
-          "Notify " + listener + " of state " + mInCallState.toString());
-      listener.onStateChange(oldState, mInCallState, callList);
+          "Notify " + listener + " of state " + inCallState.toString());
+      listener.onStateChange(oldState, inCallState, callList);
     }
 
     if (isActivityStarted()) {
       final boolean hasCall =
           callList.getActiveOrBackgroundCall() != null || callList.getOutgoingCall() != null;
-      mInCallActivity.dismissKeyguard(hasCall);
+      inCallActivity.dismissKeyguard(hasCall);
     }
     Trace.endSection();
   }
@@ -775,22 +775,22 @@
   public void onIncomingCall(DialerCall call) {
     Trace.beginSection("InCallPresenter.onIncomingCall");
     InCallState newState = startOrFinishUi(InCallState.INCOMING);
-    InCallState oldState = mInCallState;
+    InCallState oldState = inCallState;
 
     LogUtil.i(
         "InCallPresenter.onIncomingCall", "Phone switching state: " + oldState + " -> " + newState);
-    mInCallState = newState;
+    inCallState = newState;
 
     Trace.beginSection("listener.onIncomingCall");
-    for (IncomingCallListener listener : mIncomingCallListeners) {
-      listener.onIncomingCall(oldState, mInCallState, call);
+    for (IncomingCallListener listener : incomingCallListeners) {
+      listener.onIncomingCall(oldState, inCallState, call);
     }
     Trace.endSection();
 
     Trace.beginSection("onPrimaryCallStateChanged");
-    if (mInCallActivity != null) {
+    if (inCallActivity != null) {
       // Re-evaluate which fragment is being shown.
-      mInCallActivity.onPrimaryCallStateChanged();
+      inCallActivity.onPrimaryCallStateChanged();
     }
     Trace.endSection();
     Trace.endSection();
@@ -799,16 +799,16 @@
   @Override
   public void onUpgradeToVideo(DialerCall call) {
     if (VideoUtils.hasReceivedVideoUpgradeRequest(call.getVideoTech().getSessionModificationState())
-        && mInCallState == InCallPresenter.InCallState.INCOMING) {
+        && inCallState == InCallPresenter.InCallState.INCOMING) {
       LogUtil.i(
           "InCallPresenter.onUpgradeToVideo",
           "rejecting upgrade request due to existing incoming call");
       call.getVideoTech().declineVideoRequest();
     }
 
-    if (mInCallActivity != null) {
+    if (inCallActivity != null) {
       // Re-evaluate which fragment is being shown.
-      mInCallActivity.onPrimaryCallStateChanged();
+      inCallActivity.onPrimaryCallStateChanged();
     }
   }
 
@@ -816,15 +816,15 @@
   public void onSessionModificationStateChange(DialerCall call) {
     int newState = call.getVideoTech().getSessionModificationState();
     LogUtil.i("InCallPresenter.onSessionModificationStateChange", "state: %d", newState);
-    if (mProximitySensor == null) {
+    if (proximitySensor == null) {
       LogUtil.i("InCallPresenter.onSessionModificationStateChange", "proximitySensor is null");
       return;
     }
-    mProximitySensor.setIsAttemptingVideoCall(
+    proximitySensor.setIsAttemptingVideoCall(
         call.hasSentVideoUpgradeRequest() || call.hasReceivedVideoUpgradeRequest());
-    if (mInCallActivity != null) {
+    if (inCallActivity != null) {
       // Re-evaluate which fragment is being shown.
-      mInCallActivity.onPrimaryCallStateChanged();
+      inCallActivity.onPrimaryCallStateChanged();
     }
   }
 
@@ -837,21 +837,21 @@
     showDialogOrToastForDisconnectedCall(call);
 
     // We need to do the run the same code as onCallListChange.
-    onCallListChange(mCallList);
+    onCallListChange(callList);
 
     if (isActivityStarted()) {
-      mInCallActivity.dismissKeyguard(false);
+      inCallActivity.dismissKeyguard(false);
     }
 
     if (call.isEmergencyCall()) {
-      FilteredNumbersUtil.recordLastEmergencyCallTime(mContext);
+      FilteredNumbersUtil.recordLastEmergencyCallTime(context);
     }
 
-    if (!mCallList.hasLiveCall()
+    if (!callList.hasLiveCall()
         && !call.getLogState().isIncoming
         && !isSecretCode(call.getNumber())
         && !call.isVoiceMailNumber()) {
-      PostCall.onCallDisconnected(mContext, call.getNumber(), call.getConnectTimeMillis());
+      PostCall.onCallDisconnected(context, call.getNumber(), call.getConnectTimeMillis());
     }
   }
 
@@ -884,7 +884,7 @@
     }
 
     if (newState == InCallState.NO_CALLS) {
-      if (mBoundAndWaitingForOutgoingCall) {
+      if (boundAndWaitingForOutgoingCall) {
         return InCallState.PENDING_OUTGOING;
       }
     }
@@ -893,98 +893,98 @@
   }
 
   public boolean isBoundAndWaitingForOutgoingCall() {
-    return mBoundAndWaitingForOutgoingCall;
+    return boundAndWaitingForOutgoingCall;
   }
 
   public void setBoundAndWaitingForOutgoingCall(boolean isBound, PhoneAccountHandle handle) {
     LogUtil.i(
         "InCallPresenter.setBoundAndWaitingForOutgoingCall",
         "setBoundAndWaitingForOutgoingCall: " + isBound);
-    mBoundAndWaitingForOutgoingCall = isBound;
-    mThemeColorManager.setPendingPhoneAccountHandle(handle);
-    if (isBound && mInCallState == InCallState.NO_CALLS) {
-      mInCallState = InCallState.PENDING_OUTGOING;
+    boundAndWaitingForOutgoingCall = isBound;
+    themeColorManager.setPendingPhoneAccountHandle(handle);
+    if (isBound && inCallState == InCallState.NO_CALLS) {
+      inCallState = InCallState.PENDING_OUTGOING;
     }
   }
 
   public void onShrinkAnimationComplete() {
-    if (mAwaitingCallListUpdate) {
-      onCallListChange(mCallList);
+    if (awaitingCallListUpdate) {
+      onCallListChange(callList);
     }
   }
 
   public void addIncomingCallListener(IncomingCallListener listener) {
     Objects.requireNonNull(listener);
-    mIncomingCallListeners.add(listener);
+    incomingCallListeners.add(listener);
   }
 
   public void removeIncomingCallListener(IncomingCallListener listener) {
     if (listener != null) {
-      mIncomingCallListeners.remove(listener);
+      incomingCallListeners.remove(listener);
     }
   }
 
   public void addListener(InCallStateListener listener) {
     Objects.requireNonNull(listener);
-    mListeners.add(listener);
+    listeners.add(listener);
   }
 
   public void removeListener(InCallStateListener listener) {
     if (listener != null) {
-      mListeners.remove(listener);
+      listeners.remove(listener);
     }
   }
 
   public void addDetailsListener(InCallDetailsListener listener) {
     Objects.requireNonNull(listener);
-    mDetailsListeners.add(listener);
+    detailsListeners.add(listener);
   }
 
   public void removeDetailsListener(InCallDetailsListener listener) {
     if (listener != null) {
-      mDetailsListeners.remove(listener);
+      detailsListeners.remove(listener);
     }
   }
 
   public void addCanAddCallListener(CanAddCallListener listener) {
     Objects.requireNonNull(listener);
-    mCanAddCallListeners.add(listener);
+    canAddCallListeners.add(listener);
   }
 
   public void removeCanAddCallListener(CanAddCallListener listener) {
     if (listener != null) {
-      mCanAddCallListeners.remove(listener);
+      canAddCallListeners.remove(listener);
     }
   }
 
   public void addOrientationListener(InCallOrientationListener listener) {
     Objects.requireNonNull(listener);
-    mOrientationListeners.add(listener);
+    orientationListeners.add(listener);
   }
 
   public void removeOrientationListener(InCallOrientationListener listener) {
     if (listener != null) {
-      mOrientationListeners.remove(listener);
+      orientationListeners.remove(listener);
     }
   }
 
   public void addInCallEventListener(InCallEventListener listener) {
     Objects.requireNonNull(listener);
-    mInCallEventListeners.add(listener);
+    inCallEventListeners.add(listener);
   }
 
   public void removeInCallEventListener(InCallEventListener listener) {
     if (listener != null) {
-      mInCallEventListeners.remove(listener);
+      inCallEventListeners.remove(listener);
     }
   }
 
   public ProximitySensor getProximitySensor() {
-    return mProximitySensor;
+    return proximitySensor;
   }
 
   public PseudoScreenState getPseudoScreenState() {
-    return mPseudoScreenState;
+    return pseudoScreenState;
   }
 
   /** Returns true if the incall app is the foreground application. */
@@ -992,10 +992,10 @@
     if (!isActivityStarted()) {
       return false;
     }
-    if (mManageConferenceActivity != null && mManageConferenceActivity.isVisible()) {
+    if (manageConferenceActivity != null && manageConferenceActivity.isVisible()) {
       return true;
     }
-    return mInCallActivity.isVisible();
+    return inCallActivity.isVisible();
   }
 
   /**
@@ -1004,9 +1004,9 @@
    * (not in foreground).
    */
   public boolean isActivityStarted() {
-    return (mInCallActivity != null
-        && !mInCallActivity.isDestroyed()
-        && !mInCallActivity.isFinishing());
+    return (inCallActivity != null
+        && !inCallActivity.isDestroyed()
+        && !inCallActivity.isFinishing());
   }
 
   /**
@@ -1015,7 +1015,7 @@
    * @return {@code true} if the In-Call app is changing configuration.
    */
   public boolean isChangingConfigurations() {
-    return mIsChangingConfigurations;
+    return isChangingConfigurations;
   }
 
   /**
@@ -1024,54 +1024,54 @@
    */
   /*package*/
   void updateIsChangingConfigurations() {
-    mIsChangingConfigurations = false;
-    if (mInCallActivity != null) {
-      mIsChangingConfigurations = mInCallActivity.isChangingConfigurations();
+    isChangingConfigurations = false;
+    if (inCallActivity != null) {
+      isChangingConfigurations = inCallActivity.isChangingConfigurations();
     }
     LogUtil.v(
         "InCallPresenter.updateIsChangingConfigurations",
-        "updateIsChangingConfigurations = " + mIsChangingConfigurations);
+        "updateIsChangingConfigurations = " + isChangingConfigurations);
   }
 
   /** Called when the activity goes in/out of the foreground. */
   public void onUiShowing(boolean showing) {
     // We need to update the notification bar when we leave the UI because that
     // could trigger it to show again.
-    if (mStatusBarNotifier != null) {
-      mStatusBarNotifier.updateNotification();
+    if (statusBarNotifier != null) {
+      statusBarNotifier.updateNotification();
     }
 
-    if (mProximitySensor != null) {
-      mProximitySensor.onInCallShowing(showing);
+    if (proximitySensor != null) {
+      proximitySensor.onInCallShowing(showing);
     }
 
     if (!showing) {
       updateIsChangingConfigurations();
     }
 
-    for (InCallUiListener listener : mInCallUiListeners) {
+    for (InCallUiListener listener : inCallUiListeners) {
       listener.onUiShowing(showing);
     }
 
-    if (mInCallActivity != null) {
+    if (inCallActivity != null) {
       // Re-evaluate which fragment is being shown.
-      mInCallActivity.onPrimaryCallStateChanged();
+      inCallActivity.onPrimaryCallStateChanged();
     }
   }
 
   public void refreshUi() {
-    if (mInCallActivity != null) {
+    if (inCallActivity != null) {
       // Re-evaluate which fragment is being shown.
-      mInCallActivity.onPrimaryCallStateChanged();
+      inCallActivity.onPrimaryCallStateChanged();
     }
   }
 
   public void addInCallUiListener(InCallUiListener listener) {
-    mInCallUiListeners.add(listener);
+    inCallUiListeners.add(listener);
   }
 
   public boolean removeInCallUiListener(InCallUiListener listener) {
-    return mInCallUiListeners.remove(listener);
+    return inCallUiListeners.remove(listener);
   }
 
   /*package*/
@@ -1090,8 +1090,8 @@
   private void notifyVideoPauseController(boolean showing) {
     LogUtil.d(
         "InCallPresenter.notifyVideoPauseController",
-        "mIsChangingConfigurations=" + mIsChangingConfigurations);
-    if (!mIsChangingConfigurations) {
+        "mIsChangingConfigurations=" + isChangingConfigurations);
+    if (!isChangingConfigurations) {
       VideoPauseController.getInstance().onUiShowing(showing);
     }
   }
@@ -1105,14 +1105,14 @@
     // If the activity hadn't actually been started previously, yet there are still calls
     // present (e.g. a call was accepted by a bluetooth or wired headset), we want to
     // bring it up the UI regardless.
-    if (!isShowingInCallUi() && mInCallState != InCallState.NO_CALLS) {
+    if (!isShowingInCallUi() && inCallState != InCallState.NO_CALLS) {
       showInCall(showDialpad, false /* newOutgoingCall */);
     }
   }
 
   public void onPostDialCharWait(String callId, String chars) {
     if (isActivityStarted()) {
-      mInCallActivity.showDialogForPostCharWait(callId, chars);
+      inCallActivity.showDialogForPostCharWait(callId, chars);
     }
   }
 
@@ -1129,7 +1129,7 @@
     // of the Phone.
 
     /** INCOMING CALL */
-    final CallList calls = mCallList;
+    final CallList calls = callList;
     final DialerCall incomingCall = calls.getIncomingCall();
     LogUtil.v("InCallPresenter.handleCallKey", "incomingCall: " + incomingCall);
 
@@ -1185,7 +1185,7 @@
 
   /** Clears the previous fullscreen state. */
   public void clearFullscreen() {
-    mIsFullScreen = false;
+    isFullScreen = false;
   }
 
   /**
@@ -1216,12 +1216,12 @@
           "setFullScreen overridden as dialpad is shown = " + isFullScreen);
     }
 
-    if (mIsFullScreen == isFullScreen && !force) {
+    if (this.isFullScreen == isFullScreen && !force) {
       LogUtil.v("InCallPresenter.setFullScreen", "setFullScreen ignored as already in that state.");
       return;
     }
-    mIsFullScreen = isFullScreen;
-    notifyFullscreenModeChange(mIsFullScreen);
+    this.isFullScreen = isFullScreen;
+    notifyFullscreenModeChange(this.isFullScreen);
   }
 
   /**
@@ -1229,7 +1229,7 @@
    *     otherwise.
    */
   public boolean isFullscreen() {
-    return mIsFullScreen;
+    return isFullScreen;
   }
 
   /**
@@ -1238,7 +1238,7 @@
    * @param isFullscreenMode {@code True} if entering full screen mode.
    */
   public void notifyFullscreenModeChange(boolean isFullscreenMode) {
-    for (InCallEventListener listener : mInCallEventListeners) {
+    for (InCallEventListener listener : inCallEventListeners) {
       listener.onFullscreenModeChanged(isFullscreenMode);
     }
   }
@@ -1254,8 +1254,8 @@
       setDisconnectCauseForMissingAccounts(call);
     }
 
-    mInCallActivity.showDialogOrToastForDisconnectedCall(
-        new DisconnectMessage(mInCallActivity, call));
+    inCallActivity.showDialogOrToastForDisconnectedCall(
+        new DisconnectMessage(inCallActivity, call));
   }
 
   /**
@@ -1265,13 +1265,13 @@
   private InCallState startOrFinishUi(InCallState newState) {
     Trace.beginSection("InCallPresenter.startOrFinishUi");
     LogUtil.d(
-        "InCallPresenter.startOrFinishUi", "startOrFinishUi: " + mInCallState + " -> " + newState);
+        "InCallPresenter.startOrFinishUi", "startOrFinishUi: " + inCallState + " -> " + newState);
 
     // TODO: Consider a proper state machine implementation
 
     // If the state isn't changing we have already done any starting/stopping of activities in
     // a previous pass...so lets cut out early
-    if (newState == mInCallState) {
+    if (newState == inCallState) {
       Trace.endSection();
       return newState;
     }
@@ -1318,14 +1318,14 @@
     // This is different from the incoming call sequence because we do not need to shock the
     // user with a top-level notification.  Just show the call UI normally.
     boolean callCardFragmentVisible =
-        mInCallActivity != null && mInCallActivity.getCallCardFragmentVisible();
+        inCallActivity != null && inCallActivity.getCallCardFragmentVisible();
     final boolean mainUiNotVisible = !isShowingInCallUi() || !callCardFragmentVisible;
     boolean showCallUi = InCallState.OUTGOING == newState && mainUiNotVisible;
 
     // Direct transition from PENDING_OUTGOING -> INCALL means that there was an error in the
     // outgoing call process, so the UI should be brought up to show an error dialog.
     showCallUi |=
-        (InCallState.PENDING_OUTGOING == mInCallState
+        (InCallState.PENDING_OUTGOING == inCallState
             && InCallState.INCALL == newState
             && !isShowingInCallUi());
 
@@ -1340,19 +1340,19 @@
     showCallUi |=
         InCallState.PENDING_OUTGOING == newState
             && mainUiNotVisible
-            && isCallWithNoValidAccounts(mCallList.getPendingOutgoingCall());
+            && isCallWithNoValidAccounts(callList.getPendingOutgoingCall());
 
     // The only time that we have an instance of mInCallActivity and it isn't started is
     // when it is being destroyed.  In that case, lets avoid bringing up another instance of
     // the activity.  When it is finally destroyed, we double check if we should bring it back
     // up so we aren't going to lose anything by avoiding a second startup here.
-    boolean activityIsFinishing = mInCallActivity != null && !isActivityStarted();
+    boolean activityIsFinishing = inCallActivity != null && !isActivityStarted();
     if (activityIsFinishing) {
       LogUtil.i(
           "InCallPresenter.startOrFinishUi",
-          "Undo the state change: " + newState + " -> " + mInCallState);
+          "Undo the state change: " + newState + " -> " + inCallState);
       Trace.endSection();
-      return mInCallState;
+      return inCallState;
     }
 
     // We're about the bring up the in-call UI for outgoing and incoming call. If we still have
@@ -1362,7 +1362,7 @@
     if ((newState == InCallState.INCOMING || newState == InCallState.PENDING_OUTGOING)
         && !showCallUi
         && isActivityStarted()) {
-      mInCallActivity.dismissPendingDialogs();
+      inCallActivity.dismissPendingDialogs();
     }
 
     if (showCallUi || showAccountPicker) {
@@ -1371,7 +1371,7 @@
     } else if (startIncomingCallSequence) {
       LogUtil.i("InCallPresenter.startOrFinishUi", "Start Full Screen in call UI");
 
-      mStatusBarNotifier.updateNotification();
+      statusBarNotifier.updateNotification();
     } else if (newState == InCallState.NO_CALLS) {
       // The new state is the no calls state.  Tear everything down.
       attemptFinishActivity();
@@ -1401,8 +1401,8 @@
       String scheme = call.getHandle().getScheme();
       final String errorMsg =
           PhoneAccount.SCHEME_TEL.equals(scheme)
-              ? mContext.getString(R.string.callFailed_simError)
-              : mContext.getString(R.string.incall_error_supp_service_unknown);
+              ? context.getString(R.string.callFailed_simError)
+              : context.getString(R.string.incall_error_supp_service_unknown);
       DisconnectCause disconnectCause =
           new DisconnectCause(DisconnectCause.ERROR, null, errorMsg, errorMsg);
       call.setDisconnectCause(disconnectCause);
@@ -1415,7 +1415,7 @@
    *     InCallPresenter or not.
    */
   public boolean isReadyForTearDown() {
-    return mInCallActivity == null && !mServiceConnected && mInCallState == InCallState.NO_CALLS;
+    return inCallActivity == null && !serviceConnected && inCallState == InCallState.NO_CALLS;
   }
 
   /**
@@ -1427,53 +1427,53 @@
 
       cleanupSurfaces();
 
-      mIsChangingConfigurations = false;
+      isChangingConfigurations = false;
 
       // blow away stale contact info so that we get fresh data on
       // the next set of calls
-      if (mContactInfoCache != null) {
-        mContactInfoCache.clearCache();
+      if (contactInfoCache != null) {
+        contactInfoCache.clearCache();
       }
-      mContactInfoCache = null;
+      contactInfoCache = null;
 
-      if (mProximitySensor != null) {
-        removeListener(mProximitySensor);
-        mProximitySensor.tearDown();
+      if (proximitySensor != null) {
+        removeListener(proximitySensor);
+        proximitySensor.tearDown();
       }
-      mProximitySensor = null;
+      proximitySensor = null;
 
-      if (mStatusBarNotifier != null) {
-        removeListener(mStatusBarNotifier);
-        EnrichedCallComponent.get(mContext)
+      if (statusBarNotifier != null) {
+        removeListener(statusBarNotifier);
+        EnrichedCallComponent.get(context)
             .getEnrichedCallManager()
-            .unregisterStateChangedListener(mStatusBarNotifier);
+            .unregisterStateChangedListener(statusBarNotifier);
       }
 
-      if (mExternalCallNotifier != null && mExternalCallList != null) {
-        mExternalCallList.removeExternalCallListener(mExternalCallNotifier);
+      if (externalCallNotifier != null && externalCallList != null) {
+        externalCallList.removeExternalCallListener(externalCallNotifier);
       }
-      mStatusBarNotifier = null;
+      statusBarNotifier = null;
 
-      if (mCallList != null) {
-        mCallList.removeListener(this);
-        mCallList.removeListener(mSpamCallListListener);
+      if (callList != null) {
+        callList.removeListener(this);
+        callList.removeListener(spamCallListListener);
       }
-      mCallList = null;
+      callList = null;
 
-      mContext = null;
-      mInCallActivity = null;
-      mManageConferenceActivity = null;
+      context = null;
+      inCallActivity = null;
+      manageConferenceActivity = null;
 
-      mListeners.clear();
-      mIncomingCallListeners.clear();
-      mDetailsListeners.clear();
-      mCanAddCallListeners.clear();
-      mOrientationListeners.clear();
-      mInCallEventListeners.clear();
-      mInCallUiListeners.clear();
-      if (!mInCallUiLocks.isEmpty()) {
-        LogUtil.e("InCallPresenter.attemptCleanup", "held in call locks: " + mInCallUiLocks);
-        mInCallUiLocks.clear();
+      listeners.clear();
+      incomingCallListeners.clear();
+      detailsListeners.clear();
+      canAddCallListeners.clear();
+      orientationListeners.clear();
+      inCallEventListeners.clear();
+      inCallUiListeners.clear();
+      if (!inCallUiLocks.isEmpty()) {
+        LogUtil.e("InCallPresenter.attemptCleanup", "held in call locks: " + inCallUiLocks);
+        inCallUiLocks.clear();
       }
       LogUtil.d("InCallPresenter.attemptCleanup", "finished");
     }
@@ -1481,26 +1481,25 @@
 
   public void showInCall(boolean showDialpad, boolean newOutgoingCall) {
     LogUtil.i("InCallPresenter.showInCall", "Showing InCallActivity");
-    mContext.startActivity(
-        InCallActivity.getIntent(
-            mContext, showDialpad, newOutgoingCall, false /* forFullScreen */));
+    context.startActivity(
+        InCallActivity.getIntent(context, showDialpad, newOutgoingCall, false /* forFullScreen */));
   }
 
   public void onServiceBind() {
-    mServiceBound = true;
+    serviceBound = true;
   }
 
   public void onServiceUnbind() {
     InCallPresenter.getInstance().setBoundAndWaitingForOutgoingCall(false, null);
-    mServiceBound = false;
+    serviceBound = false;
   }
 
   public boolean isServiceBound() {
-    return mServiceBound;
+    return serviceBound;
   }
 
   public void maybeStartRevealAnimation(Intent intent) {
-    if (intent == null || mInCallActivity != null) {
+    if (intent == null || inCallActivity != null) {
       return;
     }
     final Bundle extras = intent.getBundleExtra(TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS);
@@ -1521,9 +1520,9 @@
     InCallPresenter.getInstance().setBoundAndWaitingForOutgoingCall(true, accountHandle);
 
     final Intent activityIntent =
-        InCallActivity.getIntent(mContext, false, true, false /* forFullScreen */);
+        InCallActivity.getIntent(context, false, true, false /* forFullScreen */);
     activityIntent.putExtra(TouchPointManager.TOUCH_POINT, touchPoint);
-    mContext.startActivity(activityIntent);
+    context.startActivity(activityIntent);
   }
 
   /**
@@ -1533,11 +1532,11 @@
    */
   public InCallCameraManager getInCallCameraManager() {
     synchronized (this) {
-      if (mInCallCameraManager == null) {
-        mInCallCameraManager = new InCallCameraManager(mContext);
+      if (inCallCameraManager == null) {
+        inCallCameraManager = new InCallCameraManager(context);
       }
 
-      return mInCallCameraManager;
+      return inCallCameraManager;
     }
   }
 
@@ -1555,14 +1554,14 @@
         "InCallPresenter.onDeviceOrientationChange",
         "onDeviceOrientationChange: orientation= " + orientation);
 
-    if (mCallList != null) {
-      mCallList.notifyCallsOfDeviceRotation(orientation);
+    if (callList != null) {
+      callList.notifyCallsOfDeviceRotation(orientation);
     } else {
       LogUtil.w("InCallPresenter.onDeviceOrientationChange", "CallList is null.");
     }
 
     // Notify listeners of device orientation changed.
-    for (InCallOrientationListener listener : mOrientationListeners) {
+    for (InCallOrientationListener listener : orientationListeners) {
       listener.onDeviceOrientationChanged(orientation);
     }
   }
@@ -1575,29 +1574,29 @@
    *     landscape. {@code false} if the in-call UI should be locked in portrait.
    */
   public void setInCallAllowsOrientationChange(boolean allowOrientationChange) {
-    if (mInCallActivity == null) {
+    if (inCallActivity == null) {
       LogUtil.e(
           "InCallPresenter.setInCallAllowsOrientationChange",
           "InCallActivity is null. Can't set requested orientation.");
       return;
     }
-    mInCallActivity.setAllowOrientationChange(allowOrientationChange);
+    inCallActivity.setAllowOrientationChange(allowOrientationChange);
   }
 
   public void enableScreenTimeout(boolean enable) {
     LogUtil.v("InCallPresenter.enableScreenTimeout", "enableScreenTimeout: value=" + enable);
-    mScreenTimeoutEnabled = enable;
+    screenTimeoutEnabled = enable;
     applyScreenTimeout();
   }
 
   private void applyScreenTimeout() {
-    if (mInCallActivity == null) {
+    if (inCallActivity == null) {
       LogUtil.e("InCallPresenter.applyScreenTimeout", "InCallActivity is null.");
       return;
     }
 
-    final Window window = mInCallActivity.getWindow();
-    if (mScreenTimeoutEnabled) {
+    final Window window = inCallActivity.getWindow();
+    if (screenTimeoutEnabled) {
       window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
     } else {
       window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
@@ -1611,11 +1610,11 @@
    *     be hidden.
    */
   public void showConferenceCallManager(boolean show) {
-    if (mInCallActivity != null) {
-      mInCallActivity.showConferenceFragment(show);
+    if (inCallActivity != null) {
+      inCallActivity.showConferenceFragment(show);
     }
-    if (!show && mManageConferenceActivity != null) {
-      mManageConferenceActivity.finish();
+    if (!show && manageConferenceActivity != null) {
+      manageConferenceActivity.finish();
     }
   }
 
@@ -1625,31 +1624,31 @@
    * @return {@code true} if the dialpad is visible, {@code false} otherwise.
    */
   public boolean isDialpadVisible() {
-    if (mInCallActivity == null) {
+    if (inCallActivity == null) {
       return false;
     }
-    return mInCallActivity.isDialpadVisible();
+    return inCallActivity.isDialpadVisible();
   }
 
   public ThemeColorManager getThemeColorManager() {
-    return mThemeColorManager;
+    return themeColorManager;
   }
 
   @VisibleForTesting
   public void setThemeColorManager(ThemeColorManager themeColorManager) {
-    mThemeColorManager = themeColorManager;
+    this.themeColorManager = themeColorManager;
   }
 
   /** Called when the foreground call changes. */
   public void onForegroundCallChanged(DialerCall newForegroundCall) {
-    mThemeColorManager.onForegroundCallChanged(mContext, newForegroundCall);
-    if (mInCallActivity != null) {
-      mInCallActivity.onForegroundCallChanged(newForegroundCall);
+    themeColorManager.onForegroundCallChanged(context, newForegroundCall);
+    if (inCallActivity != null) {
+      inCallActivity.onForegroundCallChanged(newForegroundCall);
     }
   }
 
   public InCallActivity getActivity() {
-    return mInCallActivity;
+    return inCallActivity;
   }
 
   /** Called when the UI begins, and starts the callstate callbacks if necessary. */
@@ -1657,7 +1656,7 @@
     if (inCallActivity == null) {
       throw new IllegalArgumentException("registerActivity cannot be called with null");
     }
-    if (mInCallActivity != null && mInCallActivity != inCallActivity) {
+    if (this.inCallActivity != null && this.inCallActivity != inCallActivity) {
       LogUtil.w(
           "InCallPresenter.setActivity", "Setting a second activity before destroying the first.");
     }
@@ -1665,47 +1664,46 @@
   }
 
   ExternalCallNotifier getExternalCallNotifier() {
-    return mExternalCallNotifier;
+    return externalCallNotifier;
   }
 
   VideoSurfaceTexture getLocalVideoSurfaceTexture() {
-    if (mLocalVideoSurfaceTexture == null) {
+    if (localVideoSurfaceTexture == null) {
       boolean isPixel2017 = false;
-      if (mContext != null) {
-        isPixel2017 = mContext.getPackageManager().hasSystemFeature(PIXEL2017_SYSTEM_FEATURE);
+      if (context != null) {
+        isPixel2017 = context.getPackageManager().hasSystemFeature(PIXEL2017_SYSTEM_FEATURE);
       }
-      mLocalVideoSurfaceTexture = VideoSurfaceBindings.createLocalVideoSurfaceTexture(isPixel2017);
+      localVideoSurfaceTexture = VideoSurfaceBindings.createLocalVideoSurfaceTexture(isPixel2017);
     }
-    return mLocalVideoSurfaceTexture;
+    return localVideoSurfaceTexture;
   }
 
   VideoSurfaceTexture getRemoteVideoSurfaceTexture() {
-    if (mRemoteVideoSurfaceTexture == null) {
+    if (remoteVideoSurfaceTexture == null) {
       boolean isPixel2017 = false;
-      if (mContext != null) {
-        isPixel2017 = mContext.getPackageManager().hasSystemFeature(PIXEL2017_SYSTEM_FEATURE);
+      if (context != null) {
+        isPixel2017 = context.getPackageManager().hasSystemFeature(PIXEL2017_SYSTEM_FEATURE);
       }
-      mRemoteVideoSurfaceTexture =
-          VideoSurfaceBindings.createRemoteVideoSurfaceTexture(isPixel2017);
+      remoteVideoSurfaceTexture = VideoSurfaceBindings.createRemoteVideoSurfaceTexture(isPixel2017);
     }
-    return mRemoteVideoSurfaceTexture;
+    return remoteVideoSurfaceTexture;
   }
 
   void cleanupSurfaces() {
-    if (mRemoteVideoSurfaceTexture != null) {
-      mRemoteVideoSurfaceTexture.setDoneWithSurface();
-      mRemoteVideoSurfaceTexture = null;
+    if (remoteVideoSurfaceTexture != null) {
+      remoteVideoSurfaceTexture.setDoneWithSurface();
+      remoteVideoSurfaceTexture = null;
     }
-    if (mLocalVideoSurfaceTexture != null) {
-      mLocalVideoSurfaceTexture.setDoneWithSurface();
-      mLocalVideoSurfaceTexture = null;
+    if (localVideoSurfaceTexture != null) {
+      localVideoSurfaceTexture.setDoneWithSurface();
+      localVideoSurfaceTexture = null;
     }
   }
 
   @Override
   public void onAudioStateChanged(CallAudioState audioState) {
-    if (mStatusBarNotifier != null) {
-      mStatusBarNotifier.updateNotification();
+    if (statusBarNotifier != null) {
+      statusBarNotifier.updateNotification();
     }
   }
 
@@ -1804,7 +1802,7 @@
   public InCallUiLock acquireInCallUiLock(String tag) {
     Assert.isMainThread();
     InCallUiLock lock = new InCallUiLockImpl(tag);
-    mInCallUiLocks.add(lock);
+    inCallUiLocks.add(lock);
     return lock;
   }
 
@@ -1812,10 +1810,10 @@
   private void releaseInCallUiLock(InCallUiLock lock) {
     Assert.isMainThread();
     LogUtil.i("InCallPresenter.releaseInCallUiLock", "releasing %s", lock);
-    mInCallUiLocks.remove(lock);
-    if (mInCallUiLocks.isEmpty()) {
+    inCallUiLocks.remove(lock);
+    if (inCallUiLocks.isEmpty()) {
       LogUtil.i("InCallPresenter.releaseInCallUiLock", "all locks released");
-      if (mInCallState == InCallState.NO_CALLS) {
+      if (inCallState == InCallState.NO_CALLS) {
         LogUtil.i("InCallPresenter.releaseInCallUiLock", "no more calls, finishing UI");
         attemptFinishActivity();
         attemptCleanup();
@@ -1826,14 +1824,14 @@
   @MainThread
   public boolean isInCallUiLocked() {
     Assert.isMainThread();
-    if (mInCallUiLocks.isEmpty()) {
+    if (inCallUiLocks.isEmpty()) {
       return false;
     }
-    for (InCallUiLock lock : mInCallUiLocks) {
+    for (InCallUiLock lock : inCallUiLocks) {
       LogUtil.i("InCallPresenter.isInCallUiLocked", "still locked by %s", lock);
     }
     return true;
   }
 
-  private final Set<InCallUiLock> mInCallUiLocks = new ArraySet<>();
+  private final Set<InCallUiLock> inCallUiLocks = new ArraySet<>();
 }
diff --git a/java/com/android/incallui/InCallUIMaterialColorMapUtils.java b/java/com/android/incallui/InCallUIMaterialColorMapUtils.java
index 7b06a5e..945e9fb 100644
--- a/java/com/android/incallui/InCallUIMaterialColorMapUtils.java
+++ b/java/com/android/incallui/InCallUIMaterialColorMapUtils.java
@@ -23,15 +23,15 @@
 
 public class InCallUIMaterialColorMapUtils extends MaterialColorMapUtils {
 
-  private final TypedArray mPrimaryColors;
-  private final TypedArray mSecondaryColors;
-  private final Resources mResources;
+  private final TypedArray primaryColors;
+  private final TypedArray secondaryColors;
+  private final Resources resources;
 
   public InCallUIMaterialColorMapUtils(Resources resources) {
     super(resources);
-    mPrimaryColors = resources.obtainTypedArray(R.array.background_colors);
-    mSecondaryColors = resources.obtainTypedArray(R.array.background_colors_dark);
-    mResources = resources;
+    primaryColors = resources.obtainTypedArray(R.array.background_colors);
+    secondaryColors = resources.obtainTypedArray(R.array.background_colors_dark);
+    this.resources = resources;
   }
 
   /**
@@ -52,12 +52,12 @@
   @Override
   public MaterialPalette calculatePrimaryAndSecondaryColor(int color) {
     if (color == PhoneAccount.NO_HIGHLIGHT_COLOR) {
-      return getDefaultPrimaryAndSecondaryColors(mResources);
+      return getDefaultPrimaryAndSecondaryColors(resources);
     }
 
-    for (int i = 0; i < mPrimaryColors.length(); i++) {
-      if (mPrimaryColors.getColor(i, 0) == color) {
-        return new MaterialPalette(mPrimaryColors.getColor(i, 0), mSecondaryColors.getColor(i, 0));
+    for (int i = 0; i < primaryColors.length(); i++) {
+      if (primaryColors.getColor(i, 0) == color) {
+        return new MaterialPalette(primaryColors.getColor(i, 0), secondaryColors.getColor(i, 0));
       }
     }
 
diff --git a/java/com/android/incallui/PostCharDialogFragment.java b/java/com/android/incallui/PostCharDialogFragment.java
index a852f76..4bcc68e 100644
--- a/java/com/android/incallui/PostCharDialogFragment.java
+++ b/java/com/android/incallui/PostCharDialogFragment.java
@@ -32,28 +32,28 @@
   private static final String STATE_CALL_ID = "CALL_ID";
   private static final String STATE_POST_CHARS = "POST_CHARS";
 
-  private String mCallId;
-  private String mPostDialStr;
+  private String callId;
+  private String postDialStr;
 
   public PostCharDialogFragment() {}
 
   public PostCharDialogFragment(String callId, String postDialStr) {
-    mCallId = callId;
-    mPostDialStr = postDialStr;
+    this.callId = callId;
+    this.postDialStr = postDialStr;
   }
 
   @Override
   public Dialog onCreateDialog(Bundle savedInstanceState) {
     super.onCreateDialog(savedInstanceState);
 
-    if (mPostDialStr == null && savedInstanceState != null) {
-      mCallId = savedInstanceState.getString(STATE_CALL_ID);
-      mPostDialStr = savedInstanceState.getString(STATE_POST_CHARS);
+    if (postDialStr == null && savedInstanceState != null) {
+      callId = savedInstanceState.getString(STATE_CALL_ID);
+      postDialStr = savedInstanceState.getString(STATE_POST_CHARS);
     }
 
     final StringBuilder buf = new StringBuilder();
     buf.append(getResources().getText(R.string.wait_prompt_str));
-    buf.append(mPostDialStr);
+    buf.append(postDialStr);
 
     final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
     builder.setMessage(buf.toString());
@@ -63,7 +63,7 @@
         new DialogInterface.OnClickListener() {
           @Override
           public void onClick(DialogInterface dialog, int whichButton) {
-            TelecomAdapter.getInstance().postDialContinue(mCallId, true);
+            TelecomAdapter.getInstance().postDialContinue(callId, true);
           }
         });
     builder.setNegativeButton(
@@ -83,14 +83,14 @@
   public void onCancel(DialogInterface dialog) {
     super.onCancel(dialog);
 
-    TelecomAdapter.getInstance().postDialContinue(mCallId, false);
+    TelecomAdapter.getInstance().postDialContinue(callId, false);
   }
 
   @Override
   public void onSaveInstanceState(Bundle outState) {
     super.onSaveInstanceState(outState);
 
-    outState.putString(STATE_CALL_ID, mCallId);
-    outState.putString(STATE_POST_CHARS, mPostDialStr);
+    outState.putString(STATE_CALL_ID, callId);
+    outState.putString(STATE_POST_CHARS, postDialStr);
   }
 }
diff --git a/java/com/android/incallui/ProximitySensor.java b/java/com/android/incallui/ProximitySensor.java
index 123ca53..f82b75d 100644
--- a/java/com/android/incallui/ProximitySensor.java
+++ b/java/com/android/incallui/ProximitySensor.java
@@ -44,49 +44,49 @@
 
   private static final String TAG = ProximitySensor.class.getSimpleName();
 
-  private final PowerManager mPowerManager;
-  private final PowerManager.WakeLock mProximityWakeLock;
-  private final AudioModeProvider mAudioModeProvider;
-  private final AccelerometerListener mAccelerometerListener;
-  private final ProximityDisplayListener mDisplayListener;
-  private int mOrientation = AccelerometerListener.ORIENTATION_UNKNOWN;
-  private boolean mUiShowing = false;
-  private boolean mIsPhoneOffhook = false;
-  private boolean mDialpadVisible;
-  private boolean mIsAttemptingVideoCall;
-  private boolean mIsVideoCall;
+  private final PowerManager powerManager;
+  private final PowerManager.WakeLock proximityWakeLock;
+  private final AudioModeProvider audioModeProvider;
+  private final AccelerometerListener accelerometerListener;
+  private final ProximityDisplayListener displayListener;
+  private int orientation = AccelerometerListener.ORIENTATION_UNKNOWN;
+  private boolean uiShowing = false;
+  private boolean isPhoneOffhook = false;
+  private boolean dialpadVisible;
+  private boolean isAttemptingVideoCall;
+  private boolean isVideoCall;
 
   public ProximitySensor(
       @NonNull Context context,
       @NonNull AudioModeProvider audioModeProvider,
       @NonNull AccelerometerListener accelerometerListener) {
     Trace.beginSection("ProximitySensor.Constructor");
-    mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
-    if (mPowerManager.isWakeLockLevelSupported(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK)) {
-      mProximityWakeLock =
-          mPowerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, TAG);
+    powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
+    if (powerManager.isWakeLockLevelSupported(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK)) {
+      proximityWakeLock =
+          powerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, TAG);
     } else {
       LogUtil.i("ProximitySensor.constructor", "Device does not support proximity wake lock.");
-      mProximityWakeLock = null;
+      proximityWakeLock = null;
     }
-    mAccelerometerListener = accelerometerListener;
-    mAccelerometerListener.setListener(this);
+    this.accelerometerListener = accelerometerListener;
+    this.accelerometerListener.setListener(this);
 
-    mDisplayListener =
+    displayListener =
         new ProximityDisplayListener(
             (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE));
-    mDisplayListener.register();
+    displayListener.register();
 
-    mAudioModeProvider = audioModeProvider;
-    mAudioModeProvider.addListener(this);
+    this.audioModeProvider = audioModeProvider;
+    this.audioModeProvider.addListener(this);
     Trace.endSection();
   }
 
   public void tearDown() {
-    mAudioModeProvider.removeListener(this);
+    audioModeProvider.removeListener(this);
 
-    mAccelerometerListener.enable(false);
-    mDisplayListener.unregister();
+    accelerometerListener.enable(false);
+    displayListener.unregister();
 
     turnOffProximitySensor(true);
   }
@@ -94,7 +94,7 @@
   /** Called to identify when the device is laid down flat. */
   @Override
   public void orientationChanged(int orientation) {
-    mOrientation = orientation;
+    this.orientation = orientation;
     updateProximitySensorMode();
   }
 
@@ -113,12 +113,12 @@
     DialerCall activeCall = callList.getActiveCall();
     boolean isVideoCall = activeCall != null && activeCall.isVideoCall();
 
-    if (isOffhook != mIsPhoneOffhook || mIsVideoCall != isVideoCall) {
-      mIsPhoneOffhook = isOffhook;
-      mIsVideoCall = isVideoCall;
+    if (isOffhook != isPhoneOffhook || this.isVideoCall != isVideoCall) {
+      isPhoneOffhook = isOffhook;
+      this.isVideoCall = isVideoCall;
 
-      mOrientation = AccelerometerListener.ORIENTATION_UNKNOWN;
-      mAccelerometerListener.enable(mIsPhoneOffhook);
+      orientation = AccelerometerListener.ORIENTATION_UNKNOWN;
+      accelerometerListener.enable(isPhoneOffhook);
 
       updateProximitySensorMode();
     }
@@ -130,7 +130,7 @@
   }
 
   public void onDialpadVisible(boolean visible) {
-    mDialpadVisible = visible;
+    dialpadVisible = visible;
     updateProximitySensorMode();
   }
 
@@ -139,25 +139,25 @@
         "ProximitySensor.setIsAttemptingVideoCall",
         "isAttemptingVideoCall: %b",
         isAttemptingVideoCall);
-    mIsAttemptingVideoCall = isAttemptingVideoCall;
+    this.isAttemptingVideoCall = isAttemptingVideoCall;
     updateProximitySensorMode();
   }
   /** Used to save when the UI goes in and out of the foreground. */
   public void onInCallShowing(boolean showing) {
     if (showing) {
-      mUiShowing = true;
+      uiShowing = true;
 
       // We only consider the UI not showing for instances where another app took the foreground.
       // If we stopped showing because the screen is off, we still consider that showing.
-    } else if (mPowerManager.isScreenOn()) {
-      mUiShowing = false;
+    } else if (powerManager.isScreenOn()) {
+      uiShowing = false;
     }
     updateProximitySensorMode();
   }
 
   void onDisplayStateChanged(boolean isDisplayOn) {
     LogUtil.i("ProximitySensor.onDisplayStateChanged", "isDisplayOn: %b", isDisplayOn);
-    mAccelerometerListener.enable(isDisplayOn);
+    accelerometerListener.enable(isDisplayOn);
   }
 
   /**
@@ -167,14 +167,14 @@
    * replaced with the ProximityDisplayListener.
    */
   public boolean isScreenReallyOff() {
-    return !mPowerManager.isScreenOn();
+    return !powerManager.isScreenOn();
   }
 
   private void turnOnProximitySensor() {
-    if (mProximityWakeLock != null) {
-      if (!mProximityWakeLock.isHeld()) {
+    if (proximityWakeLock != null) {
+      if (!proximityWakeLock.isHeld()) {
         LogUtil.i("ProximitySensor.turnOnProximitySensor", "acquiring wake lock");
-        mProximityWakeLock.acquire();
+        proximityWakeLock.acquire();
       } else {
         LogUtil.i("ProximitySensor.turnOnProximitySensor", "wake lock already acquired");
       }
@@ -182,11 +182,11 @@
   }
 
   private void turnOffProximitySensor(boolean screenOnImmediately) {
-    if (mProximityWakeLock != null) {
-      if (mProximityWakeLock.isHeld()) {
+    if (proximityWakeLock != null) {
+      if (proximityWakeLock.isHeld()) {
         LogUtil.i("ProximitySensor.turnOffProximitySensor", "releasing wake lock");
         int flags = (screenOnImmediately ? 0 : PowerManager.RELEASE_FLAG_WAIT_FOR_NO_PROXIMITY);
-        mProximityWakeLock.release(flags);
+        proximityWakeLock.release(flags);
       } else {
         LogUtil.i("ProximitySensor.turnOffProximitySensor", "wake lock already released");
       }
@@ -210,39 +210,39 @@
    */
   private synchronized void updateProximitySensorMode() {
     Trace.beginSection("ProximitySensor.updateProximitySensorMode");
-    final int audioRoute = mAudioModeProvider.getAudioState().getRoute();
+    final int audioRoute = audioModeProvider.getAudioState().getRoute();
 
     boolean screenOnImmediately =
         (CallAudioState.ROUTE_WIRED_HEADSET == audioRoute
             || CallAudioState.ROUTE_SPEAKER == audioRoute
             || CallAudioState.ROUTE_BLUETOOTH == audioRoute
-            || mIsAttemptingVideoCall
-            || mIsVideoCall);
+            || isAttemptingVideoCall
+            || isVideoCall);
 
     // We do not keep the screen off when the user is outside in-call screen and we are
     // horizontal, but we do not force it on when we become horizontal until the
     // proximity sensor goes negative.
-    final boolean horizontal = (mOrientation == AccelerometerListener.ORIENTATION_HORIZONTAL);
-    screenOnImmediately |= !mUiShowing && horizontal;
+    final boolean horizontal = (orientation == AccelerometerListener.ORIENTATION_HORIZONTAL);
+    screenOnImmediately |= !uiShowing && horizontal;
 
     // We do not keep the screen off when dialpad is visible, we are horizontal, and
     // the in-call screen is being shown.
     // At that moment we're pretty sure users want to use it, instead of letting the
     // proximity sensor turn off the screen by their hands.
-    screenOnImmediately |= mDialpadVisible && horizontal;
+    screenOnImmediately |= dialpadVisible && horizontal;
 
     LogUtil.i(
         "ProximitySensor.updateProximitySensorMode",
         "screenOnImmediately: %b, dialPadVisible: %b, "
             + "offHook: %b, horizontal: %b, uiShowing: %b, audioRoute: %s",
         screenOnImmediately,
-        mDialpadVisible,
-        mIsPhoneOffhook,
-        mOrientation == AccelerometerListener.ORIENTATION_HORIZONTAL,
-        mUiShowing,
+        dialpadVisible,
+        isPhoneOffhook,
+        orientation == AccelerometerListener.ORIENTATION_HORIZONTAL,
+        uiShowing,
         CallAudioState.audioRouteToString(audioRoute));
 
-    if (mIsPhoneOffhook && !screenOnImmediately) {
+    if (isPhoneOffhook && !screenOnImmediately) {
       LogUtil.v("ProximitySensor.updateProximitySensorMode", "turning on proximity sensor");
       // Phone is in use!  Arrange for the screen to turn off
       // automatically when the sensor detects a close object.
@@ -263,19 +263,19 @@
    */
   public class ProximityDisplayListener implements DisplayListener {
 
-    private DisplayManager mDisplayManager;
-    private boolean mIsDisplayOn = true;
+    private DisplayManager displayManager;
+    private boolean isDisplayOn = true;
 
     ProximityDisplayListener(DisplayManager displayManager) {
-      mDisplayManager = displayManager;
+      this.displayManager = displayManager;
     }
 
     void register() {
-      mDisplayManager.registerDisplayListener(this, null);
+      displayManager.registerDisplayListener(this, null);
     }
 
     void unregister() {
-      mDisplayManager.unregisterDisplayListener(this);
+      displayManager.unregisterDisplayListener(this);
     }
 
     @Override
@@ -284,14 +284,14 @@
     @Override
     public void onDisplayChanged(int displayId) {
       if (displayId == Display.DEFAULT_DISPLAY) {
-        final Display display = mDisplayManager.getDisplay(displayId);
+        final Display display = displayManager.getDisplay(displayId);
 
         final boolean isDisplayOn = display.getState() != Display.STATE_OFF;
         // For call purposes, we assume that as long as the screen is not truly off, it is
         // considered on, even if it is in an unknown or low power idle state.
-        if (isDisplayOn != mIsDisplayOn) {
-          mIsDisplayOn = isDisplayOn;
-          onDisplayStateChanged(mIsDisplayOn);
+        if (isDisplayOn != this.isDisplayOn) {
+          this.isDisplayOn = isDisplayOn;
+          onDisplayStateChanged(this.isDisplayOn);
         }
       }
     }
diff --git a/java/com/android/incallui/StatusBarNotifier.java b/java/com/android/incallui/StatusBarNotifier.java
index 4da858f..960fd14 100644
--- a/java/com/android/incallui/StatusBarNotifier.java
+++ b/java/com/android/incallui/StatusBarNotifier.java
@@ -112,31 +112,31 @@
 
   private static final long[] VIBRATE_PATTERN = new long[] {0, 1000, 1000};
 
-  private final Context mContext;
-  private final ContactInfoCache mContactInfoCache;
-  private final DialerRingtoneManager mDialerRingtoneManager;
-  @Nullable private ContactsPreferences mContactsPreferences;
-  private int mCurrentNotification = NOTIFICATION_NONE;
-  private int mCallState = DialerCall.State.INVALID;
-  private int mVideoState = VideoProfile.STATE_AUDIO_ONLY;
-  private int mSavedIcon = 0;
-  private String mSavedContent = null;
-  private Bitmap mSavedLargeIcon;
-  private String mSavedContentTitle;
+  private final Context context;
+  private final ContactInfoCache contactInfoCache;
+  private final DialerRingtoneManager dialerRingtoneManager;
+  @Nullable private ContactsPreferences contactsPreferences;
+  private int currentNotification = NOTIFICATION_NONE;
+  private int callState = DialerCall.State.INVALID;
+  private int videoState = VideoProfile.STATE_AUDIO_ONLY;
+  private int savedIcon = 0;
+  private String savedContent = null;
+  private Bitmap savedLargeIcon;
+  private String savedContentTitle;
   private CallAudioState savedCallAudioState;
-  private Uri mRingtone;
-  private StatusBarCallListener mStatusBarCallListener;
+  private Uri ringtone;
+  private StatusBarCallListener statusBarCallListener;
 
   public StatusBarNotifier(@NonNull Context context, @NonNull ContactInfoCache contactInfoCache) {
     Trace.beginSection("StatusBarNotifier.Constructor");
-    mContext = Assert.isNotNull(context);
-    mContactsPreferences = ContactsPreferencesFactory.newContactsPreferences(mContext);
-    mContactInfoCache = contactInfoCache;
-    mDialerRingtoneManager =
+    this.context = Assert.isNotNull(context);
+    contactsPreferences = ContactsPreferencesFactory.newContactsPreferences(this.context);
+    this.contactInfoCache = contactInfoCache;
+    dialerRingtoneManager =
         new DialerRingtoneManager(
             new InCallTonePlayer(new ToneGeneratorFactory(), new PausableExecutorImpl()),
             CallList.getInstance());
-    mCurrentNotification = NOTIFICATION_NONE;
+    currentNotification = NOTIFICATION_NONE;
     Trace.endSection();
   }
 
@@ -213,12 +213,12 @@
    * @see #updateInCallNotification()
    */
   private void cancelNotification() {
-    if (mStatusBarCallListener != null) {
+    if (statusBarCallListener != null) {
       setStatusBarCallListener(null);
     }
-    if (mCurrentNotification != NOTIFICATION_NONE) {
+    if (currentNotification != NOTIFICATION_NONE) {
       TelecomAdapter.getInstance().stopForegroundNotification();
-      mCurrentNotification = NOTIFICATION_NONE;
+      currentNotification = NOTIFICATION_NONE;
     }
   }
 
@@ -253,7 +253,7 @@
     // This callback will always get called immediately and synchronously with whatever data
     // it has available, and may make a subsequent call later (same thread) if it had to
     // call into the contacts provider for more data.
-    mContactInfoCache.findInfo(call, isIncoming, this);
+    contactInfoCache.findInfo(call, isIncoming, this);
     Trace.endSection();
   }
 
@@ -278,7 +278,7 @@
     Trace.beginSection("read icon and strings");
     // Check if data has changed; if nothing is different, don't issue another notification.
     final int iconResId = getIconToDisplay(call);
-    Bitmap largeIcon = getLargeIconToDisplay(mContext, contactInfo, call);
+    Bitmap largeIcon = getLargeIconToDisplay(context, contactInfo, call);
     final CharSequence content = getContentString(call, contactInfo.userType);
     final String contentTitle = getContentTitle(contactInfo, call);
     Trace.endSection();
@@ -290,7 +290,7 @@
     if (callState == DialerCall.State.INCOMING
         || callState == DialerCall.State.CALL_WAITING
         || isVideoUpgradeRequest) {
-      if (ConfigProviderBindings.get(mContext)
+      if (ConfigProviderBindings.get(context)
           .getBoolean("quiet_incoming_call_if_ui_showing", true)) {
         notificationType =
             InCallPresenter.getInstance().isShowingInCallUi()
@@ -329,10 +329,10 @@
     // This builder is used for the notification shown when the device is locked and the user
     // has set their notification settings to 'hide sensitive content'
     // {@see Notification.Builder#setPublicVersion}.
-    Notification.Builder publicBuilder = new Notification.Builder(mContext);
+    Notification.Builder publicBuilder = new Notification.Builder(context);
     publicBuilder
         .setSmallIcon(iconResId)
-        .setColor(mContext.getResources().getColor(R.color.dialer_theme_color, mContext.getTheme()))
+        .setColor(context.getResources().getColor(R.color.dialer_theme_color, context.getTheme()))
         // Hide work call state for the lock screen notification
         .setContentTitle(getContentString(call, ContactsUtils.USER_TYPE_CURRENT));
     setNotificationWhen(call, callState, publicBuilder);
@@ -357,7 +357,7 @@
         builder.setCategory(Notification.CATEGORY_CALL);
         // This will be ignored on O+ and handled by the channel
         builder.setPriority(Notification.PRIORITY_MAX);
-        if (mCurrentNotification != NOTIFICATION_INCOMING_CALL) {
+        if (currentNotification != NOTIFICATION_INCOMING_CALL) {
           LogUtil.i(
               "StatusBarNotifier.buildAndSendNotification",
               "Canceling old notification so this one can be noisy");
@@ -403,20 +403,20 @@
     // Fire off the notification
     Notification notification = builder.build();
 
-    if (mDialerRingtoneManager.shouldPlayRingtone(callState, contactInfo.contactRingtoneUri)) {
+    if (dialerRingtoneManager.shouldPlayRingtone(callState, contactInfo.contactRingtoneUri)) {
       notification.flags |= Notification.FLAG_INSISTENT;
       notification.sound = contactInfo.contactRingtoneUri;
       AudioAttributes.Builder audioAttributes = new AudioAttributes.Builder();
       audioAttributes.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC);
       audioAttributes.setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE);
       notification.audioAttributes = audioAttributes.build();
-      if (mDialerRingtoneManager.shouldVibrate(mContext.getContentResolver())) {
+      if (dialerRingtoneManager.shouldVibrate(context.getContentResolver())) {
         notification.vibrate = VIBRATE_PATTERN;
       }
     }
-    if (mDialerRingtoneManager.shouldPlayCallWaitingTone(callState)) {
+    if (dialerRingtoneManager.shouldPlayCallWaitingTone(callState)) {
       LogUtil.v("StatusBarNotifier.buildAndSendNotification", "playing call waiting tone");
-      mDialerRingtoneManager.playCallWaitingTone();
+      dialerRingtoneManager.playCallWaitingTone();
     }
 
     LogUtil.i(
@@ -428,7 +428,7 @@
 
     Trace.endSection();
     call.getLatencyReport().onNotificationShown();
-    mCurrentNotification = notificationType;
+    currentNotification = notificationType;
     Trace.endSection();
   }
 
@@ -486,57 +486,57 @@
     // if new title is not null, it should be different from saved version OR
     // if new title is null, the saved version should not be null
     final boolean contentTitleChanged =
-        (contentTitle != null && !contentTitle.equals(mSavedContentTitle))
-            || (contentTitle == null && mSavedContentTitle != null);
+        (contentTitle != null && !contentTitle.equals(savedContentTitle))
+            || (contentTitle == null && savedContentTitle != null);
 
     boolean largeIconChanged;
-    if (mSavedLargeIcon == null) {
+    if (savedLargeIcon == null) {
       largeIconChanged = largeIcon != null;
     } else {
-      largeIconChanged = largeIcon == null || !mSavedLargeIcon.sameAs(largeIcon);
+      largeIconChanged = largeIcon == null || !savedLargeIcon.sameAs(largeIcon);
     }
 
     // any change means we are definitely updating
     boolean retval =
-        (mSavedIcon != icon)
-            || !Objects.equals(mSavedContent, content)
-            || (mCallState != state)
-            || (mVideoState != videoState)
+        (savedIcon != icon)
+            || !Objects.equals(savedContent, content)
+            || (callState != state)
+            || (this.videoState != videoState)
             || largeIconChanged
             || contentTitleChanged
-            || !Objects.equals(mRingtone, ringtone)
+            || !Objects.equals(this.ringtone, ringtone)
             || !Objects.equals(savedCallAudioState, callAudioState);
 
     LogUtil.d(
         "StatusBarNotifier.checkForChangeAndSaveData",
         "data changed: icon: %b, content: %b, state: %b, videoState: %b, largeIcon: %b, title: %b,"
             + "ringtone: %b, audioState: %b, type: %b",
-        (mSavedIcon != icon),
-        !Objects.equals(mSavedContent, content),
-        (mCallState != state),
-        (mVideoState != videoState),
+        (savedIcon != icon),
+        !Objects.equals(savedContent, content),
+        (callState != state),
+        (this.videoState != videoState),
         largeIconChanged,
         contentTitleChanged,
-        !Objects.equals(mRingtone, ringtone),
+        !Objects.equals(this.ringtone, ringtone),
         !Objects.equals(savedCallAudioState, callAudioState),
-        mCurrentNotification != notificationType);
+        currentNotification != notificationType);
     // If we aren't showing a notification right now or the notification type is changing,
     // definitely do an update.
-    if (mCurrentNotification != notificationType) {
-      if (mCurrentNotification == NOTIFICATION_NONE) {
+    if (currentNotification != notificationType) {
+      if (currentNotification == NOTIFICATION_NONE) {
         LogUtil.d(
             "StatusBarNotifier.checkForChangeAndSaveData", "showing notification for first time.");
       }
       retval = true;
     }
 
-    mSavedIcon = icon;
-    mSavedContent = content;
-    mCallState = state;
-    mVideoState = videoState;
-    mSavedLargeIcon = largeIcon;
-    mSavedContentTitle = contentTitle;
-    mRingtone = ringtone;
+    savedIcon = icon;
+    savedContent = content;
+    callState = state;
+    this.videoState = videoState;
+    savedLargeIcon = largeIcon;
+    savedContentTitle = contentTitle;
+    this.ringtone = ringtone;
     savedCallAudioState = callAudioState;
 
     if (retval) {
@@ -553,12 +553,12 @@
   String getContentTitle(ContactCacheEntry contactInfo, DialerCall call) {
     if (call.isConferenceCall()) {
       return CallerInfoUtils.getConferenceString(
-          mContext, call.hasProperty(Details.PROPERTY_GENERIC_CONFERENCE));
+          context, call.hasProperty(Details.PROPERTY_GENERIC_CONFERENCE));
     }
 
     String preferredName =
         ContactDisplayUtils.getPreferredDisplayName(
-            contactInfo.namePrimary, contactInfo.nameAlternative, mContactsPreferences);
+            contactInfo.namePrimary, contactInfo.nameAlternative, contactsPreferences);
     if (TextUtils.isEmpty(preferredName)) {
       return TextUtils.isEmpty(contactInfo.number)
           ? null
@@ -623,9 +623,9 @@
       return null;
     }
     final int height =
-        (int) mContext.getResources().getDimension(android.R.dimen.notification_large_icon_height);
+        (int) context.getResources().getDimension(android.R.dimen.notification_large_icon_height);
     final int width =
-        (int) mContext.getResources().getDimension(android.R.dimen.notification_large_icon_width);
+        (int) context.getResources().getDimension(android.R.dimen.notification_large_icon_width);
     return BitmapUtil.getRoundedBitmap(bitmap, width, height);
   }
 
@@ -649,7 +649,7 @@
         || call.isVideoCall()) {
       return R.drawable.quantum_ic_videocam_white_24;
     } else if (call.hasProperty(PROPERTY_HIGH_DEF_AUDIO)
-        && MotorolaUtils.shouldShowHdIconInNotification(mContext)) {
+        && MotorolaUtils.shouldShowHdIconInNotification(context)) {
       // Normally when a call is ongoing the status bar displays an icon of a phone. This is a
       // helpful hint for users so they know how to get back to the call. For Sprint HD calls, we
       // replace this icon with an icon of a phone with a HD badge. This is a carrier requirement.
@@ -658,8 +658,7 @@
       return R.drawable.quantum_ic_phone_locked_vd_theme_24;
     }
     // If ReturnToCall is enabled, use the static icon. The animated one will show in the bubble.
-    if (ReturnToCallController.isEnabled(mContext)
-        || NewReturnToCallController.isEnabled(mContext)) {
+    if (ReturnToCallController.isEnabled(context) || NewReturnToCallController.isEnabled(context)) {
       return R.drawable.quantum_ic_call_vd_theme_24;
     } else {
       return R.drawable.on_going_call;
@@ -676,14 +675,14 @@
         && call.getNumberPresentation() == TelecomManager.PRESENTATION_ALLOWED) {
 
       if (!TextUtils.isEmpty(call.getChildNumber())) {
-        return mContext.getString(R.string.child_number, call.getChildNumber());
+        return context.getString(R.string.child_number, call.getChildNumber());
       } else if (!TextUtils.isEmpty(call.getCallSubject()) && call.isCallSubjectSupported()) {
         return call.getCallSubject();
       }
     }
 
     int resId = R.string.notification_ongoing_call;
-    String wifiBrand = mContext.getString(R.string.notification_call_wifi_brand);
+    String wifiBrand = context.getString(R.string.notification_call_wifi_brand);
     if (call.hasProperty(Details.PROPERTY_WIFI)) {
       resId = R.string.notification_ongoing_call_wifi_template;
     }
@@ -720,16 +719,16 @@
     boolean isWorkCall = call.hasProperty(PROPERTY_ENTERPRISE_CALL);
     if (userType == ContactsUtils.USER_TYPE_WORK || isWorkCall) {
       resId = getWorkStringFromPersonalString(resId);
-      wifiBrand = mContext.getString(R.string.notification_call_wifi_work_brand);
+      wifiBrand = context.getString(R.string.notification_call_wifi_work_brand);
     }
 
     if (resId == R.string.notification_incoming_call_wifi_template
         || resId == R.string.notification_ongoing_call_wifi_template) {
       // TODO(a bug): Potentially apply this template logic everywhere.
-      return mContext.getString(resId, wifiBrand);
+      return context.getString(resId, wifiBrand);
     }
 
-    return mContext.getString(resId);
+    return context.getString(resId);
   }
 
   private boolean shouldShowEnrichedCallNotification(Session session) {
@@ -769,7 +768,7 @@
       } else {
         resId = R.string.important_notification_incoming_call;
       }
-      if (mContext.getString(resId).length() > 50) {
+      if (context.getString(resId).length() > 50) {
         resId = R.string.important_notification_incoming_call_attachments;
       }
     } else {
@@ -795,7 +794,7 @@
         resId = R.string.notification_incoming_call_with_message;
       }
     }
-    if (mContext.getString(resId).length() > 50) {
+    if (context.getString(resId).length() > 50) {
       resId = R.string.notification_incoming_call_attachments;
     }
     return resId;
@@ -803,10 +802,10 @@
 
   private CharSequence getMultiSimIncomingText(DialerCall call) {
     PhoneAccount phoneAccount =
-        mContext.getSystemService(TelecomManager.class).getPhoneAccount(call.getAccountHandle());
+        context.getSystemService(TelecomManager.class).getPhoneAccount(call.getAccountHandle());
     SpannableString string =
         new SpannableString(
-            mContext.getString(
+            context.getString(
                 R.string.notification_incoming_call_mutli_sim, phoneAccount.getLabel()));
     int accountStart = string.toString().lastIndexOf(phoneAccount.getLabel().toString());
     int accountEnd = accountStart + phoneAccount.getLabel().length();
@@ -838,13 +837,13 @@
   }
 
   private Spannable getActionText(@StringRes int stringRes, @ColorRes int colorRes) {
-    Spannable spannable = new SpannableString(mContext.getText(stringRes));
+    Spannable spannable = new SpannableString(context.getText(stringRes));
     if (VERSION.SDK_INT >= VERSION_CODES.N_MR1) {
       // This will only work for cases where the Notification.Builder has a fullscreen intent set
       // Notification.Builder that does not have a full screen intent will take the color of the
       // app and the following leads to a no-op.
       spannable.setSpan(
-          new ForegroundColorSpan(mContext.getColor(colorRes)), 0, spannable.length(), 0);
+          new ForegroundColorSpan(context.getColor(colorRes)), 0, spannable.length(), 0);
     }
     return spannable;
   }
@@ -854,10 +853,10 @@
         "StatusBarNotifier.addAnswerAction",
         "will show \"answer\" action in the incoming call Notification");
     PendingIntent answerVoicePendingIntent =
-        createNotificationPendingIntent(mContext, ACTION_ANSWER_VOICE_INCOMING_CALL);
+        createNotificationPendingIntent(context, ACTION_ANSWER_VOICE_INCOMING_CALL);
     builder.addAction(
         new Notification.Action.Builder(
-                Icon.createWithResource(mContext, R.drawable.quantum_ic_call_white_24),
+                Icon.createWithResource(context, R.drawable.quantum_ic_call_white_24),
                 getActionText(
                     R.string.notification_action_answer, R.color.notification_action_accept),
                 answerVoicePendingIntent)
@@ -869,10 +868,10 @@
         "StatusBarNotifier.addDismissAction",
         "will show \"decline\" action in the incoming call Notification");
     PendingIntent declinePendingIntent =
-        createNotificationPendingIntent(mContext, ACTION_DECLINE_INCOMING_CALL);
+        createNotificationPendingIntent(context, ACTION_DECLINE_INCOMING_CALL);
     builder.addAction(
         new Notification.Action.Builder(
-                Icon.createWithResource(mContext, R.drawable.quantum_ic_close_white_24),
+                Icon.createWithResource(context, R.drawable.quantum_ic_close_white_24),
                 getActionText(
                     R.string.notification_action_dismiss, R.color.notification_action_dismiss),
                 declinePendingIntent)
@@ -884,11 +883,11 @@
         "StatusBarNotifier.addHangupAction",
         "will show \"hang-up\" action in the ongoing active call Notification");
     PendingIntent hangupPendingIntent =
-        createNotificationPendingIntent(mContext, ACTION_HANG_UP_ONGOING_CALL);
+        createNotificationPendingIntent(context, ACTION_HANG_UP_ONGOING_CALL);
     builder.addAction(
         new Notification.Action.Builder(
-                Icon.createWithResource(mContext, R.drawable.quantum_ic_call_end_white_24),
-                mContext.getText(R.string.notification_action_end_call),
+                Icon.createWithResource(context, R.drawable.quantum_ic_call_end_white_24),
+                context.getText(R.string.notification_action_end_call),
                 hangupPendingIntent)
             .build());
   }
@@ -911,11 +910,11 @@
         "StatusBarNotifier.addSpeakerOnAction",
         "will show \"Speaker on\" action in the ongoing active call Notification");
     PendingIntent speakerOnPendingIntent =
-        createNotificationPendingIntent(mContext, ACTION_TURN_ON_SPEAKER);
+        createNotificationPendingIntent(context, ACTION_TURN_ON_SPEAKER);
     builder.addAction(
         new Notification.Action.Builder(
-                Icon.createWithResource(mContext, R.drawable.quantum_ic_volume_up_white_24),
-                mContext.getText(R.string.notification_action_speaker_on),
+                Icon.createWithResource(context, R.drawable.quantum_ic_volume_up_white_24),
+                context.getText(R.string.notification_action_speaker_on),
                 speakerOnPendingIntent)
             .build());
   }
@@ -925,11 +924,11 @@
         "StatusBarNotifier.addSpeakerOffAction",
         "will show \"Speaker off\" action in the ongoing active call Notification");
     PendingIntent speakerOffPendingIntent =
-        createNotificationPendingIntent(mContext, ACTION_TURN_OFF_SPEAKER);
+        createNotificationPendingIntent(context, ACTION_TURN_OFF_SPEAKER);
     builder.addAction(
         new Notification.Action.Builder(
-                Icon.createWithResource(mContext, R.drawable.quantum_ic_phone_in_talk_white_24),
-                mContext.getText(R.string.notification_action_speaker_off),
+                Icon.createWithResource(context, R.drawable.quantum_ic_phone_in_talk_white_24),
+                context.getText(R.string.notification_action_speaker_off),
                 speakerOffPendingIntent)
             .build());
   }
@@ -939,10 +938,10 @@
         "StatusBarNotifier.addVideoCallAction",
         "will show \"video\" action in the incoming call Notification");
     PendingIntent answerVideoPendingIntent =
-        createNotificationPendingIntent(mContext, ACTION_ANSWER_VIDEO_INCOMING_CALL);
+        createNotificationPendingIntent(context, ACTION_ANSWER_VIDEO_INCOMING_CALL);
     builder.addAction(
         new Notification.Action.Builder(
-                Icon.createWithResource(mContext, R.drawable.quantum_ic_videocam_white_24),
+                Icon.createWithResource(context, R.drawable.quantum_ic_videocam_white_24),
                 getActionText(
                     R.string.notification_action_answer_video,
                     R.color.notification_action_answer_video),
@@ -955,10 +954,10 @@
         "StatusBarNotifier.addAcceptUpgradeRequestAction",
         "will show \"accept upgrade\" action in the incoming call Notification");
     PendingIntent acceptVideoPendingIntent =
-        createNotificationPendingIntent(mContext, ACTION_ACCEPT_VIDEO_UPGRADE_REQUEST);
+        createNotificationPendingIntent(context, ACTION_ACCEPT_VIDEO_UPGRADE_REQUEST);
     builder.addAction(
         new Notification.Action.Builder(
-                Icon.createWithResource(mContext, R.drawable.quantum_ic_videocam_white_24),
+                Icon.createWithResource(context, R.drawable.quantum_ic_videocam_white_24),
                 getActionText(
                     R.string.notification_action_accept, R.color.notification_action_accept),
                 acceptVideoPendingIntent)
@@ -970,10 +969,10 @@
         "StatusBarNotifier.addDismissUpgradeRequestAction",
         "will show \"dismiss upgrade\" action in the incoming call Notification");
     PendingIntent declineVideoPendingIntent =
-        createNotificationPendingIntent(mContext, ACTION_DECLINE_VIDEO_UPGRADE_REQUEST);
+        createNotificationPendingIntent(context, ACTION_DECLINE_VIDEO_UPGRADE_REQUEST);
     builder.addAction(
         new Notification.Action.Builder(
-                Icon.createWithResource(mContext, R.drawable.quantum_ic_videocam_white_24),
+                Icon.createWithResource(context, R.drawable.quantum_ic_videocam_white_24),
                 getActionText(
                     R.string.notification_action_dismiss, R.color.notification_action_dismiss),
                 declineVideoPendingIntent)
@@ -992,7 +991,7 @@
   }
 
   private Notification.Builder getNotificationBuilder() {
-    final Notification.Builder builder = new Notification.Builder(mContext);
+    final Notification.Builder builder = new Notification.Builder(context);
     builder.setOngoing(true);
     builder.setOnlyAlertOnce(true);
     // This will be ignored on O+ and handled by the channel
@@ -1005,7 +1004,7 @@
   private PendingIntent createLaunchPendingIntent(boolean isFullScreen) {
     Intent intent =
         InCallActivity.getIntent(
-            mContext, false /* showDialpad */, false /* newOutgoingCall */, isFullScreen);
+            context, false /* showDialpad */, false /* newOutgoingCall */, isFullScreen);
 
     int requestCode = InCallActivity.PendingIntentRequestCodes.NON_FULL_SCREEN;
     if (isFullScreen) {
@@ -1019,14 +1018,14 @@
     // and clicks the notification's expanded view.  It's also used to
     // launch the InCallActivity immediately when when there's an incoming
     // call (see the "fullScreenIntent" field below).
-    return PendingIntent.getActivity(mContext, requestCode, intent, 0);
+    return PendingIntent.getActivity(context, requestCode, intent, 0);
   }
 
   private void setStatusBarCallListener(StatusBarCallListener listener) {
-    if (mStatusBarCallListener != null) {
-      mStatusBarCallListener.cleanup();
+    if (statusBarCallListener != null) {
+      statusBarCallListener.cleanup();
     }
-    mStatusBarCallListener = listener;
+    statusBarCallListener = listener;
   }
 
   private boolean hasMultiplePhoneAccounts(DialerCall call) {
@@ -1057,15 +1056,15 @@
 
   private class StatusBarCallListener implements DialerCallListener {
 
-    private DialerCall mDialerCall;
+    private DialerCall dialerCall;
 
     StatusBarCallListener(DialerCall dialerCall) {
-      mDialerCall = dialerCall;
-      mDialerCall.addListener(this);
+      this.dialerCall = dialerCall;
+      this.dialerCall.addListener(this);
     }
 
     void cleanup() {
-      mDialerCall.removeListener(this);
+      dialerCall.removeListener(this);
     }
 
     @Override
@@ -1074,7 +1073,7 @@
     @Override
     public void onDialerCallUpdate() {
       if (CallList.getInstance().getIncomingCall() == null) {
-        mDialerRingtoneManager.stopCallWaitingTone();
+        dialerRingtoneManager.stopCallWaitingTone();
       }
     }
 
@@ -1105,7 +1104,7 @@
      */
     @Override
     public void onDialerCallSessionModificationStateChange() {
-      if (mDialerCall.getVideoTech().getSessionModificationState()
+      if (dialerCall.getVideoTech().getSessionModificationState()
           == SessionModificationState.NO_REQUEST) {
         cleanup();
         updateNotification();
diff --git a/java/com/android/incallui/TransactionSafeFragmentActivity.java b/java/com/android/incallui/TransactionSafeFragmentActivity.java
index a6b078c..696ecf1 100644
--- a/java/com/android/incallui/TransactionSafeFragmentActivity.java
+++ b/java/com/android/incallui/TransactionSafeFragmentActivity.java
@@ -25,30 +25,30 @@
  */
 public abstract class TransactionSafeFragmentActivity extends FragmentActivity {
 
-  private boolean mIsSafeToCommitTransactions;
+  private boolean isSafeToCommitTransactions;
 
   @Override
   protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
-    mIsSafeToCommitTransactions = true;
+    isSafeToCommitTransactions = true;
   }
 
   @Override
   protected void onStart() {
     super.onStart();
-    mIsSafeToCommitTransactions = true;
+    isSafeToCommitTransactions = true;
   }
 
   @Override
   protected void onResume() {
     super.onResume();
-    mIsSafeToCommitTransactions = true;
+    isSafeToCommitTransactions = true;
   }
 
   @Override
   protected void onSaveInstanceState(Bundle outState) {
     super.onSaveInstanceState(outState);
-    mIsSafeToCommitTransactions = false;
+    isSafeToCommitTransactions = false;
   }
 
   /**
@@ -59,6 +59,6 @@
    * outState)} (if that method is overridden), so the flag is properly set.
    */
   public boolean isSafeToCommitTransactions() {
-    return mIsSafeToCommitTransactions;
+    return isSafeToCommitTransactions;
   }
 }
diff --git a/java/com/android/incallui/VideoCallPresenter.java b/java/com/android/incallui/VideoCallPresenter.java
index e589bb3..a19d45f 100644
--- a/java/com/android/incallui/VideoCallPresenter.java
+++ b/java/com/android/incallui/VideoCallPresenter.java
@@ -82,61 +82,61 @@
         InCallPresenter.InCallEventListener,
         VideoCallScreenDelegate {
 
-  private static boolean mIsVideoMode = false;
+  private static boolean isVideoMode = false;
 
-  private final Handler mHandler = new Handler();
-  private VideoCallScreen mVideoCallScreen;
+  private final Handler handler = new Handler();
+  private VideoCallScreen videoCallScreen;
 
   /** The current context. */
-  private Context mContext;
+  private Context context;
 
   /** The call the video surfaces are currently related to */
-  private DialerCall mPrimaryCall;
+  private DialerCall primaryCall;
   /**
    * The {@link VideoCall} used to inform the video telephony layer of changes to the video
    * surfaces.
    */
-  private VideoCall mVideoCall;
+  private VideoCall videoCall;
   /** Determines if the current UI state represents a video call. */
-  private int mCurrentVideoState;
+  private int currentVideoState;
   /** DialerCall's current state */
-  private int mCurrentCallState = DialerCall.State.INVALID;
+  private int currentCallState = DialerCall.State.INVALID;
   /** Determines the device orientation (portrait/lanscape). */
-  private int mDeviceOrientation = InCallOrientationEventListener.SCREEN_ORIENTATION_UNKNOWN;
+  private int deviceOrientation = InCallOrientationEventListener.SCREEN_ORIENTATION_UNKNOWN;
   /** Tracks the state of the preview surface negotiation with the telephony layer. */
-  private int mPreviewSurfaceState = PreviewSurfaceState.NONE;
+  private int previewSurfaceState = PreviewSurfaceState.NONE;
   /**
    * Determines whether video calls should automatically enter full screen mode after {@link
-   * #mAutoFullscreenTimeoutMillis} milliseconds.
+   * #autoFullscreenTimeoutMillis} milliseconds.
    */
-  private boolean mIsAutoFullscreenEnabled = false;
+  private boolean isAutoFullscreenEnabled = false;
   /**
    * Determines the number of milliseconds after which a video call will automatically enter
-   * fullscreen mode. Requires {@link #mIsAutoFullscreenEnabled} to be {@code true}.
+   * fullscreen mode. Requires {@link #isAutoFullscreenEnabled} to be {@code true}.
    */
-  private int mAutoFullscreenTimeoutMillis = 0;
+  private int autoFullscreenTimeoutMillis = 0;
   /**
    * Determines if the countdown is currently running to automatically enter full screen video mode.
    */
-  private boolean mAutoFullScreenPending = false;
+  private boolean autoFullScreenPending = false;
   /** Whether if the call is remotely held. */
-  private boolean mIsRemotelyHeld = false;
+  private boolean isRemotelyHeld = false;
   /**
    * Runnable which is posted to schedule automatically entering fullscreen mode. Will not auto
    * enter fullscreen mode if the dialpad is visible (doing so would make it impossible to exit the
    * dialpad).
    */
-  private Runnable mAutoFullscreenRunnable =
+  private Runnable autoFullscreenRunnable =
       new Runnable() {
         @Override
         public void run() {
-          if (mAutoFullScreenPending
+          if (autoFullScreenPending
               && !InCallPresenter.getInstance().isDialpadVisible()
-              && mIsVideoMode) {
+              && isVideoMode) {
 
             LogUtil.v("VideoCallPresenter.mAutoFullScreenRunnable", "entering fullscreen mode");
             InCallPresenter.getInstance().setFullScreen(true);
-            mAutoFullScreenPending = false;
+            autoFullScreenPending = false;
           } else {
             LogUtil.v(
                 "VideoCallPresenter.mAutoFullScreenRunnable",
@@ -293,12 +293,12 @@
    */
   @Override
   public void initVideoCallScreenDelegate(Context context, VideoCallScreen videoCallScreen) {
-    mContext = context;
-    mVideoCallScreen = videoCallScreen;
-    mIsAutoFullscreenEnabled =
-        mContext.getResources().getBoolean(R.bool.video_call_auto_fullscreen);
-    mAutoFullscreenTimeoutMillis =
-        mContext.getResources().getInteger(R.integer.video_call_auto_fullscreen_timeout);
+    this.context = context;
+    this.videoCallScreen = videoCallScreen;
+    isAutoFullscreenEnabled =
+        this.context.getResources().getBoolean(R.bool.video_call_auto_fullscreen);
+    autoFullscreenTimeoutMillis =
+        this.context.getResources().getInteger(R.integer.video_call_auto_fullscreen_timeout);
   }
 
   /** Called when the user interface is ready to be used. */
@@ -313,7 +313,7 @@
       return;
     }
 
-    mDeviceOrientation = InCallOrientationEventListener.getCurrentOrientation();
+    deviceOrientation = InCallOrientationEventListener.getCurrentOrientation();
 
     // Register for call state changes last
     InCallPresenter.getInstance().addListener(this);
@@ -327,8 +327,8 @@
 
     // Register for surface and video events from {@link InCallVideoCallListener}s.
     InCallVideoCallCallbackNotifier.getInstance().addSurfaceChangeListener(this);
-    mCurrentVideoState = VideoProfile.STATE_AUDIO_ONLY;
-    mCurrentCallState = DialerCall.State.INVALID;
+    currentVideoState = VideoProfile.STATE_AUDIO_ONLY;
+    currentCallState = DialerCall.State.INVALID;
 
     InCallPresenter.InCallState inCallState = InCallPresenter.getInstance().getInCallState();
     onStateChange(inCallState, inCallState, CallList.getInstance());
@@ -359,8 +359,8 @@
     // Ensure that the call's camera direction is updated (most likely to UNKNOWN). Normally this
     // happens after any call state changes but we're unregistering from InCallPresenter above so
     // we won't get any more call state changes. See a bug.
-    if (mPrimaryCall != null) {
-      updateCameraSelection(mPrimaryCall);
+    if (primaryCall != null) {
+      updateCameraSelection(primaryCall);
     }
 
     isVideoCallScreenUiReady = false;
@@ -376,7 +376,7 @@
       InCallPresenter.getInstance().setFullScreen(true);
     } else {
       InCallPresenter.getInstance().setFullScreen(false);
-      maybeAutoEnterFullscreen(mPrimaryCall);
+      maybeAutoEnterFullscreen(primaryCall);
       // If Activity is not multiwindow, fullscreen will be driven by SystemUI visibility changes
       // instead. See #onSystemUiVisibilityChange(boolean)
 
@@ -391,7 +391,7 @@
     LogUtil.i("VideoCallPresenter.onSystemUiVisibilityChange", "visible: " + visible);
     if (visible) {
       InCallPresenter.getInstance().setFullScreen(false);
-      maybeAutoEnterFullscreen(mPrimaryCall);
+      maybeAutoEnterFullscreen(primaryCall);
     }
   }
 
@@ -412,7 +412,7 @@
 
   @Override
   public int getDeviceOrientation() {
-    return mDeviceOrientation;
+    return deviceOrientation;
   }
 
   /**
@@ -422,13 +422,13 @@
   @Override
   public void onCameraPermissionGranted() {
     LogUtil.i("VideoCallPresenter.onCameraPermissionGranted", "");
-    PermissionsUtil.setCameraPrivacyToastShown(mContext);
-    enableCamera(mPrimaryCall, isCameraRequired());
+    PermissionsUtil.setCameraPrivacyToastShown(context);
+    enableCamera(primaryCall, isCameraRequired());
     showVideoUi(
-        mPrimaryCall.getVideoState(),
-        mPrimaryCall.getState(),
-        mPrimaryCall.getVideoTech().getSessionModificationState(),
-        mPrimaryCall.isRemotelyHeld());
+        primaryCall.getVideoState(),
+        primaryCall.getState(),
+        primaryCall.getVideoTech().getSessionModificationState(),
+        primaryCall.isRemotelyHeld());
     InCallPresenter.getInstance().getInCallCameraManager().onCameraPermissionGranted();
   }
 
@@ -438,10 +438,10 @@
    */
   @Override
   public void resetAutoFullscreenTimer() {
-    if (mAutoFullScreenPending) {
+    if (autoFullScreenPending) {
       LogUtil.i("VideoCallPresenter.resetAutoFullscreenTimer", "resetting");
-      mHandler.removeCallbacks(mAutoFullscreenRunnable);
-      mHandler.postDelayed(mAutoFullscreenRunnable, mAutoFullscreenTimeoutMillis);
+      handler.removeCallbacks(autoFullscreenRunnable);
+      handler.postDelayed(autoFullscreenRunnable, autoFullscreenTimeoutMillis);
     }
   }
 
@@ -519,16 +519,16 @@
       currentCall = primary = callList.getActiveCall();
     }
 
-    final boolean primaryChanged = !Objects.equals(mPrimaryCall, primary);
+    final boolean primaryChanged = !Objects.equals(primaryCall, primary);
     LogUtil.i(
         "VideoCallPresenter.onStateChange",
         "primaryChanged: %b, primary: %s, mPrimaryCall: %s",
         primaryChanged,
         primary,
-        mPrimaryCall);
+        primaryCall);
     if (primaryChanged) {
       onPrimaryCallChanged(primary);
-    } else if (mPrimaryCall != null) {
+    } else if (primaryCall != null) {
       updateVideoCall(primary);
     }
     updateCallCache(primary);
@@ -549,9 +549,9 @@
   @Override
   public void onFullscreenModeChanged(boolean isFullscreenMode) {
     cancelAutoFullScreen();
-    if (mPrimaryCall != null) {
+    if (primaryCall != null) {
       updateFullscreenAndGreenScreenMode(
-          mPrimaryCall.getState(), mPrimaryCall.getVideoTech().getSessionModificationState());
+          primaryCall.getState(), primaryCall.getVideoTech().getSessionModificationState());
     } else {
       updateFullscreenAndGreenScreenMode(State.INVALID, SessionModificationState.NO_REQUEST);
     }
@@ -559,7 +559,7 @@
 
   private void checkForVideoStateChange(DialerCall call) {
     final boolean shouldShowVideoUi = shouldShowVideoUiForCall(call);
-    final boolean hasVideoStateChanged = mCurrentVideoState != call.getVideoState();
+    final boolean hasVideoStateChanged = currentVideoState != call.getVideoState();
 
     LogUtil.v(
         "VideoCallPresenter.checkForVideoStateChange",
@@ -568,7 +568,7 @@
         shouldShowVideoUi,
         hasVideoStateChanged,
         isVideoMode(),
-        VideoProfile.videoStateToString(mCurrentVideoState),
+        VideoProfile.videoStateToString(currentVideoState),
         VideoProfile.videoStateToString(call.getVideoState()));
     if (!hasVideoStateChanged) {
       return;
@@ -586,8 +586,8 @@
   private void checkForCallStateChange(DialerCall call) {
     final boolean shouldShowVideoUi = shouldShowVideoUiForCall(call);
     final boolean hasCallStateChanged =
-        mCurrentCallState != call.getState() || mIsRemotelyHeld != call.isRemotelyHeld();
-    mIsRemotelyHeld = call.isRemotelyHeld();
+        currentCallState != call.getState() || isRemotelyHeld != call.isRemotelyHeld();
+    isRemotelyHeld = call.isRemotelyHeld();
 
     LogUtil.v(
         "VideoCallPresenter.checkForCallStateChange",
@@ -646,20 +646,20 @@
   }
 
   private boolean isVideoMode() {
-    return mIsVideoMode;
+    return isVideoMode;
   }
 
   private void updateCallCache(DialerCall call) {
     if (call == null) {
-      mCurrentVideoState = VideoProfile.STATE_AUDIO_ONLY;
-      mCurrentCallState = DialerCall.State.INVALID;
-      mVideoCall = null;
-      mPrimaryCall = null;
+      currentVideoState = VideoProfile.STATE_AUDIO_ONLY;
+      currentCallState = DialerCall.State.INVALID;
+      videoCall = null;
+      primaryCall = null;
     } else {
-      mCurrentVideoState = call.getVideoState();
-      mVideoCall = call.getVideoCall();
-      mCurrentCallState = call.getState();
-      mPrimaryCall = call;
+      currentVideoState = call.getVideoState();
+      videoCall = call.getVideoCall();
+      currentCallState = call.getState();
+      primaryCall = call;
     }
   }
 
@@ -677,12 +677,12 @@
         "call: %s, details: %s, mPrimaryCall: %s",
         call,
         details,
-        mPrimaryCall);
+        primaryCall);
     if (call == null) {
       return;
     }
     // If the details change is not for the currently active call no update is required.
-    if (!call.equals(mPrimaryCall)) {
+    if (!call.equals(primaryCall)) {
       LogUtil.v("VideoCallPresenter.onDetailsChanged", "details not for current active call");
       return;
     }
@@ -708,14 +708,14 @@
 
   private void updateFullscreenAndGreenScreenMode(
       int callState, @SessionModificationState int sessionModificationState) {
-    if (mVideoCallScreen != null) {
+    if (videoCallScreen != null) {
       boolean shouldShowFullscreen = InCallPresenter.getInstance().isFullscreen();
       boolean shouldShowGreenScreen =
           callState == State.DIALING
               || callState == State.CONNECTING
               || callState == State.INCOMING
               || isVideoUpgrade(sessionModificationState);
-      mVideoCallScreen.updateFullscreenAndGreenScreenMode(
+      videoCallScreen.updateFullscreenAndGreenScreenMode(
           shouldShowFullscreen, shouldShowGreenScreen);
     }
   }
@@ -727,8 +727,8 @@
         "VideoCallPresenter.checkForVideoCallChange",
         "videoCall: %s, mVideoCall: %s",
         videoCall,
-        mVideoCall);
-    if (!Objects.equals(videoCall, mVideoCall)) {
+        this.videoCall);
+    if (!Objects.equals(videoCall, this.videoCall)) {
       changeVideoCall(call);
     }
   }
@@ -745,11 +745,11 @@
         "VideoCallPresenter.changeVideoCall",
         "videoCall: %s, mVideoCall: %s",
         videoCall,
-        mVideoCall);
-    final boolean hasChanged = mVideoCall == null && videoCall != null;
+        this.videoCall);
+    final boolean hasChanged = this.videoCall == null && videoCall != null;
 
-    mVideoCall = videoCall;
-    if (mVideoCall == null) {
+    this.videoCall = videoCall;
+    if (this.videoCall == null) {
       LogUtil.v("VideoCallPresenter.changeVideoCall", "video call or primary call is null. Return");
       return;
     }
@@ -760,10 +760,9 @@
   }
 
   private boolean isCameraRequired() {
-    return mPrimaryCall != null
+    return primaryCall != null
         && isCameraRequired(
-            mPrimaryCall.getVideoState(),
-            mPrimaryCall.getVideoTech().getSessionModificationState());
+            primaryCall.getVideoState(), primaryCall.getVideoTech().getSessionModificationState());
   }
 
   /**
@@ -781,7 +780,7 @@
         "videoCall: %s, videoState: %d",
         videoCall,
         newVideoState);
-    if (mVideoCallScreen == null) {
+    if (videoCallScreen == null) {
       LogUtil.e("VideoCallPresenter.adjustVideoMode", "error VideoCallScreen is null so returning");
       return;
     }
@@ -803,14 +802,14 @@
       }
 
       Assert.checkState(
-          mDeviceOrientation != InCallOrientationEventListener.SCREEN_ORIENTATION_UNKNOWN);
-      videoCall.setDeviceOrientation(mDeviceOrientation);
+          deviceOrientation != InCallOrientationEventListener.SCREEN_ORIENTATION_UNKNOWN);
+      videoCall.setDeviceOrientation(deviceOrientation);
       enableCamera(
           call, isCameraRequired(newVideoState, call.getVideoTech().getSessionModificationState()));
     }
-    int previousVideoState = mCurrentVideoState;
-    mCurrentVideoState = newVideoState;
-    mIsVideoMode = true;
+    int previousVideoState = currentVideoState;
+    currentVideoState = newVideoState;
+    isVideoMode = true;
 
     // adjustVideoMode may be called if we are already in a 1-way video state.  In this case
     // we do not want to trigger auto-fullscreen mode.
@@ -842,17 +841,17 @@
       return;
     }
 
-    boolean hasCameraPermission = VideoUtils.hasCameraPermissionAndShownPrivacyToast(mContext);
+    boolean hasCameraPermission = VideoUtils.hasCameraPermissionAndShownPrivacyToast(context);
     if (!hasCameraPermission) {
       call.getVideoTech().setCamera(null);
-      mPreviewSurfaceState = PreviewSurfaceState.NONE;
+      previewSurfaceState = PreviewSurfaceState.NONE;
       // TODO(wangqi): Inform remote party that the video is off. This is similar to a bug.
     } else if (isCameraRequired) {
       InCallCameraManager cameraManager = InCallPresenter.getInstance().getInCallCameraManager();
       call.getVideoTech().setCamera(cameraManager.getActiveCameraId());
-      mPreviewSurfaceState = PreviewSurfaceState.CAMERA_SET;
+      previewSurfaceState = PreviewSurfaceState.CAMERA_SET;
     } else {
-      mPreviewSurfaceState = PreviewSurfaceState.NONE;
+      previewSurfaceState = PreviewSurfaceState.NONE;
       call.getVideoTech().setCamera(null);
     }
   }
@@ -866,10 +865,10 @@
         DialerCall.State.ACTIVE,
         SessionModificationState.NO_REQUEST,
         false /* isRemotelyHeld */);
-    enableCamera(mPrimaryCall, false);
+    enableCamera(primaryCall, false);
     InCallPresenter.getInstance().setFullScreen(false);
     InCallPresenter.getInstance().enableScreenTimeout(false);
-    mIsVideoMode = false;
+    isVideoMode = false;
   }
 
   /**
@@ -885,12 +884,12 @@
       int callState,
       @SessionModificationState int sessionModificationState,
       boolean isRemotelyHeld) {
-    if (mVideoCallScreen == null) {
+    if (videoCallScreen == null) {
       LogUtil.e("VideoCallPresenter.showVideoUi", "videoCallScreen is null returning");
       return;
     }
     boolean showIncomingVideo = showIncomingVideo(videoState, callState);
-    boolean showOutgoingVideo = showOutgoingVideo(mContext, videoState, sessionModificationState);
+    boolean showOutgoingVideo = showOutgoingVideo(context, videoState, sessionModificationState);
     LogUtil.i(
         "VideoCallPresenter.showVideoUi",
         "showIncoming: %b, showOutgoing: %b, isRemotelyHeld: %b",
@@ -898,7 +897,7 @@
         showOutgoingVideo,
         isRemotelyHeld);
     updateRemoteVideoSurfaceDimensions();
-    mVideoCallScreen.showVideoViews(showOutgoingVideo, showIncomingVideo, isRemotelyHeld);
+    videoCallScreen.showVideoViews(showOutgoingVideo, showIncomingVideo, isRemotelyHeld);
 
     InCallPresenter.getInstance().enableScreenTimeout(VideoProfile.isAudioOnly(videoState));
     updateFullscreenAndGreenScreenMode(callState, sessionModificationState);
@@ -914,20 +913,20 @@
   @Override
   public void onUpdatePeerDimensions(DialerCall call, int width, int height) {
     LogUtil.i("VideoCallPresenter.onUpdatePeerDimensions", "width: %d, height: %d", width, height);
-    if (mVideoCallScreen == null) {
+    if (videoCallScreen == null) {
       LogUtil.e("VideoCallPresenter.onUpdatePeerDimensions", "videoCallScreen is null");
       return;
     }
-    if (!call.equals(mPrimaryCall)) {
+    if (!call.equals(primaryCall)) {
       LogUtil.e(
           "VideoCallPresenter.onUpdatePeerDimensions", "current call is not equal to primary");
       return;
     }
 
     // Change size of display surface to match the peer aspect ratio
-    if (width > 0 && height > 0 && mVideoCallScreen != null) {
+    if (width > 0 && height > 0 && videoCallScreen != null) {
       getRemoteVideoSurfaceTexture().setSourceVideoDimensions(new Point(width, height));
-      mVideoCallScreen.onRemoteVideoDimensionsChanged();
+      videoCallScreen.onRemoteVideoDimensionsChanged();
     }
   }
 
@@ -947,25 +946,25 @@
         call,
         width,
         height);
-    if (mVideoCallScreen == null) {
+    if (videoCallScreen == null) {
       LogUtil.e("VideoCallPresenter.onCameraDimensionsChange", "ui is null");
       return;
     }
 
-    if (!call.equals(mPrimaryCall)) {
+    if (!call.equals(primaryCall)) {
       LogUtil.e("VideoCallPresenter.onCameraDimensionsChange", "not the primary call");
       return;
     }
 
-    mPreviewSurfaceState = PreviewSurfaceState.CAPABILITIES_RECEIVED;
+    previewSurfaceState = PreviewSurfaceState.CAPABILITIES_RECEIVED;
     changePreviewDimensions(width, height);
 
     // Check if the preview surface is ready yet; if it is, set it on the {@code VideoCall}.
     // If it not yet ready, it will be set when when creation completes.
     Surface surface = getLocalVideoSurfaceTexture().getSavedSurface();
     if (surface != null) {
-      mPreviewSurfaceState = PreviewSurfaceState.SURFACE_SET;
-      mVideoCall.setPreviewSurface(surface);
+      previewSurfaceState = PreviewSurfaceState.SURFACE_SET;
+      videoCall.setPreviewSurface(surface);
     }
   }
 
@@ -976,13 +975,13 @@
    * @param height The new height.
    */
   private void changePreviewDimensions(int width, int height) {
-    if (mVideoCallScreen == null) {
+    if (videoCallScreen == null) {
       return;
     }
 
     // Resize the surface used to display the preview video
     getLocalVideoSurfaceTexture().setSurfaceDimensions(new Point(width, height));
-    mVideoCallScreen.onLocalVideoDimensionsChanged();
+    videoCallScreen.onLocalVideoDimensionsChanged();
   }
 
   /**
@@ -999,11 +998,11 @@
     LogUtil.i(
         "VideoCallPresenter.onDeviceOrientationChanged",
         "orientation: %d -> %d",
-        mDeviceOrientation,
+        deviceOrientation,
         orientation);
-    mDeviceOrientation = orientation;
+    deviceOrientation = orientation;
 
-    if (mVideoCallScreen == null) {
+    if (videoCallScreen == null) {
       LogUtil.e("VideoCallPresenter.onDeviceOrientationChanged", "videoCallScreen is null");
       return;
     }
@@ -1019,7 +1018,7 @@
         previewDimensions);
     changePreviewDimensions(previewDimensions.x, previewDimensions.y);
 
-    mVideoCallScreen.onLocalVideoOrientationChanged();
+    videoCallScreen.onLocalVideoOrientationChanged();
   }
 
   /**
@@ -1046,7 +1045,7 @@
    * @param call The current call.
    */
   protected void maybeAutoEnterFullscreen(DialerCall call) {
-    if (!mIsAutoFullscreenEnabled) {
+    if (!isAutoFullscreenEnabled) {
       return;
     }
 
@@ -1054,63 +1053,62 @@
         || call.getState() != DialerCall.State.ACTIVE
         || !isBidirectionalVideoCall(call)
         || InCallPresenter.getInstance().isFullscreen()
-        || (mContext != null && AccessibilityUtil.isTouchExplorationEnabled(mContext))) {
+        || (context != null && AccessibilityUtil.isTouchExplorationEnabled(context))) {
       // Ensure any previously scheduled attempt to enter fullscreen is cancelled.
       cancelAutoFullScreen();
       return;
     }
 
-    if (mAutoFullScreenPending) {
+    if (autoFullScreenPending) {
       LogUtil.v("VideoCallPresenter.maybeAutoEnterFullscreen", "already pending.");
       return;
     }
     LogUtil.v("VideoCallPresenter.maybeAutoEnterFullscreen", "scheduled");
-    mAutoFullScreenPending = true;
-    mHandler.removeCallbacks(mAutoFullscreenRunnable);
-    mHandler.postDelayed(mAutoFullscreenRunnable, mAutoFullscreenTimeoutMillis);
+    autoFullScreenPending = true;
+    handler.removeCallbacks(autoFullscreenRunnable);
+    handler.postDelayed(autoFullscreenRunnable, autoFullscreenTimeoutMillis);
   }
 
   /** Cancels pending auto fullscreen mode. */
   @Override
   public void cancelAutoFullScreen() {
-    if (!mAutoFullScreenPending) {
+    if (!autoFullScreenPending) {
       LogUtil.v("VideoCallPresenter.cancelAutoFullScreen", "none pending.");
       return;
     }
     LogUtil.v("VideoCallPresenter.cancelAutoFullScreen", "cancelling pending");
-    mAutoFullScreenPending = false;
-    mHandler.removeCallbacks(mAutoFullscreenRunnable);
+    autoFullScreenPending = false;
+    handler.removeCallbacks(autoFullscreenRunnable);
   }
 
   @Override
   public boolean shouldShowCameraPermissionToast() {
-    if (mPrimaryCall == null) {
+    if (primaryCall == null) {
       LogUtil.i("VideoCallPresenter.shouldShowCameraPermissionToast", "null call");
       return false;
     }
-    if (mPrimaryCall.didShowCameraPermission()) {
+    if (primaryCall.didShowCameraPermission()) {
       LogUtil.i(
           "VideoCallPresenter.shouldShowCameraPermissionToast", "already shown for this call");
       return false;
     }
-    if (!ConfigProviderBindings.get(mContext)
-        .getBoolean("camera_permission_dialog_allowed", true)) {
+    if (!ConfigProviderBindings.get(context).getBoolean("camera_permission_dialog_allowed", true)) {
       LogUtil.i("VideoCallPresenter.shouldShowCameraPermissionToast", "disabled by config");
       return false;
     }
-    return !VideoUtils.hasCameraPermission(mContext)
-        || !PermissionsUtil.hasCameraPrivacyToastShown(mContext);
+    return !VideoUtils.hasCameraPermission(context)
+        || !PermissionsUtil.hasCameraPrivacyToastShown(context);
   }
 
   @Override
   public void onCameraPermissionDialogShown() {
-    if (mPrimaryCall != null) {
-      mPrimaryCall.setDidShowCameraPermission(true);
+    if (primaryCall != null) {
+      primaryCall.setDidShowCameraPermission(true);
     }
   }
 
   private void updateRemoteVideoSurfaceDimensions() {
-    Activity activity = mVideoCallScreen.getVideoCallScreenFragment().getActivity();
+    Activity activity = videoCallScreen.getVideoCallScreenFragment().getActivity();
     if (activity != null) {
       Point screenSize = new Point();
       activity.getWindowManager().getDefaultDisplay().getSize(screenSize);
@@ -1131,46 +1129,46 @@
   private class LocalDelegate implements VideoSurfaceDelegate {
     @Override
     public void onSurfaceCreated(VideoSurfaceTexture videoCallSurface) {
-      if (mVideoCallScreen == null) {
+      if (videoCallScreen == null) {
         LogUtil.e("VideoCallPresenter.LocalDelegate.onSurfaceCreated", "no UI");
         return;
       }
-      if (mVideoCall == null) {
+      if (videoCall == null) {
         LogUtil.e("VideoCallPresenter.LocalDelegate.onSurfaceCreated", "no video call");
         return;
       }
 
       // If the preview surface has just been created and we have already received camera
       // capabilities, but not yet set the surface, we will set the surface now.
-      if (mPreviewSurfaceState == PreviewSurfaceState.CAPABILITIES_RECEIVED) {
-        mPreviewSurfaceState = PreviewSurfaceState.SURFACE_SET;
-        mVideoCall.setPreviewSurface(videoCallSurface.getSavedSurface());
-      } else if (mPreviewSurfaceState == PreviewSurfaceState.NONE && isCameraRequired()) {
-        enableCamera(mPrimaryCall, true);
+      if (previewSurfaceState == PreviewSurfaceState.CAPABILITIES_RECEIVED) {
+        previewSurfaceState = PreviewSurfaceState.SURFACE_SET;
+        videoCall.setPreviewSurface(videoCallSurface.getSavedSurface());
+      } else if (previewSurfaceState == PreviewSurfaceState.NONE && isCameraRequired()) {
+        enableCamera(primaryCall, true);
       }
     }
 
     @Override
     public void onSurfaceReleased(VideoSurfaceTexture videoCallSurface) {
-      if (mVideoCall == null) {
+      if (videoCall == null) {
         LogUtil.e("VideoCallPresenter.LocalDelegate.onSurfaceReleased", "no video call");
         return;
       }
 
-      mVideoCall.setPreviewSurface(null);
-      enableCamera(mPrimaryCall, false);
+      videoCall.setPreviewSurface(null);
+      enableCamera(primaryCall, false);
     }
 
     @Override
     public void onSurfaceDestroyed(VideoSurfaceTexture videoCallSurface) {
-      if (mVideoCall == null) {
+      if (videoCall == null) {
         LogUtil.e("VideoCallPresenter.LocalDelegate.onSurfaceDestroyed", "no video call");
         return;
       }
 
       boolean isChangingConfigurations = InCallPresenter.getInstance().isChangingConfigurations();
       if (!isChangingConfigurations) {
-        enableCamera(mPrimaryCall, false);
+        enableCamera(primaryCall, false);
       } else {
         LogUtil.i(
             "VideoCallPresenter.LocalDelegate.onSurfaceDestroyed",
@@ -1187,24 +1185,24 @@
   private class RemoteDelegate implements VideoSurfaceDelegate {
     @Override
     public void onSurfaceCreated(VideoSurfaceTexture videoCallSurface) {
-      if (mVideoCallScreen == null) {
+      if (videoCallScreen == null) {
         LogUtil.e("VideoCallPresenter.RemoteDelegate.onSurfaceCreated", "no UI");
         return;
       }
-      if (mVideoCall == null) {
+      if (videoCall == null) {
         LogUtil.e("VideoCallPresenter.RemoteDelegate.onSurfaceCreated", "no video call");
         return;
       }
-      mVideoCall.setDisplaySurface(videoCallSurface.getSavedSurface());
+      videoCall.setDisplaySurface(videoCallSurface.getSavedSurface());
     }
 
     @Override
     public void onSurfaceReleased(VideoSurfaceTexture videoCallSurface) {
-      if (mVideoCall == null) {
+      if (videoCall == null) {
         LogUtil.e("VideoCallPresenter.RemoteDelegate.onSurfaceReleased", "no video call");
         return;
       }
-      mVideoCall.setDisplaySurface(null);
+      videoCall.setDisplaySurface(null);
     }
 
     @Override
diff --git a/java/com/android/incallui/VideoPauseController.java b/java/com/android/incallui/VideoPauseController.java
index 36c9ef3..1a65010 100644
--- a/java/com/android/incallui/VideoPauseController.java
+++ b/java/com/android/incallui/VideoPauseController.java
@@ -32,26 +32,26 @@
  * to the background and subsequently brought back to the foreground.
  */
 class VideoPauseController implements InCallStateListener, IncomingCallListener {
-  private static VideoPauseController sVideoPauseController;
-  private InCallPresenter mInCallPresenter;
+  private static VideoPauseController videoPauseController;
+  private InCallPresenter inCallPresenter;
 
   /** The current call, if applicable. */
-  private DialerCall mPrimaryCall = null;
+  private DialerCall primaryCall = null;
 
   /**
    * The cached state of primary call, updated after onStateChange has processed.
    *
    * <p>These values are stored to detect specific changes in state between onStateChange calls.
    */
-  private int mPrevCallState = State.INVALID;
+  private int prevCallState = State.INVALID;
 
-  private boolean mWasVideoCall = false;
+  private boolean wasVideoCall = false;
 
   /**
    * Tracks whether the application is in the background. {@code True} if the application is in the
    * background, {@code false} otherwise.
    */
-  private boolean mIsInBackground = false;
+  private boolean isInBackground = false;
 
   /**
    * Singleton accessor for the {@link VideoPauseController}.
@@ -60,10 +60,10 @@
    */
   /*package*/
   static synchronized VideoPauseController getInstance() {
-    if (sVideoPauseController == null) {
-      sVideoPauseController = new VideoPauseController();
+    if (videoPauseController == null) {
+      videoPauseController = new VideoPauseController();
     }
-    return sVideoPauseController;
+    return videoPauseController;
   }
 
   /**
@@ -84,7 +84,7 @@
    * @return {@code true} if the call is dialing, {@code false} otherwise.
    */
   private boolean wasDialing() {
-    return DialerCall.State.isDialing(mPrevCallState);
+    return DialerCall.State.isDialing(prevCallState);
   }
 
   /**
@@ -95,9 +95,9 @@
    */
   public void setUp(@NonNull InCallPresenter inCallPresenter) {
     LogUtil.enterBlock("VideoPauseController.setUp");
-    mInCallPresenter = Assert.isNotNull(inCallPresenter);
-    mInCallPresenter.addListener(this);
-    mInCallPresenter.addIncomingCallListener(this);
+    this.inCallPresenter = Assert.isNotNull(inCallPresenter);
+    this.inCallPresenter.addListener(this);
+    this.inCallPresenter.addIncomingCallListener(this);
   }
 
   /**
@@ -106,18 +106,18 @@
    */
   public void tearDown() {
     LogUtil.enterBlock("VideoPauseController.tearDown");
-    mInCallPresenter.removeListener(this);
-    mInCallPresenter.removeIncomingCallListener(this);
+    inCallPresenter.removeListener(this);
+    inCallPresenter.removeIncomingCallListener(this);
     clear();
   }
 
   /** Clears the internal state for the {@link VideoPauseController}. */
   private void clear() {
-    mInCallPresenter = null;
-    mPrimaryCall = null;
-    mPrevCallState = State.INVALID;
-    mWasVideoCall = false;
-    mIsInBackground = false;
+    inCallPresenter = null;
+    primaryCall = null;
+    prevCallState = State.INVALID;
+    wasVideoCall = false;
+    isInBackground = false;
   }
 
   /**
@@ -143,7 +143,7 @@
       call = callList.getActiveCall();
     }
 
-    boolean hasPrimaryCallChanged = !Objects.equals(call, mPrimaryCall);
+    boolean hasPrimaryCallChanged = !Objects.equals(call, primaryCall);
     boolean canVideoPause = videoCanPause(call);
 
     LogUtil.i(
@@ -151,18 +151,18 @@
         "hasPrimaryCallChanged: %b, videoCanPause: %b, isInBackground: %b",
         hasPrimaryCallChanged,
         canVideoPause,
-        mIsInBackground);
+        isInBackground);
 
     if (hasPrimaryCallChanged) {
       onPrimaryCallChanged(call);
       return;
     }
 
-    if (wasDialing() && canVideoPause && mIsInBackground) {
+    if (wasDialing() && canVideoPause && isInBackground) {
       // Bring UI to foreground if outgoing request becomes active while UI is in
       // background.
       bringToForeground();
-    } else if (!mWasVideoCall && canVideoPause && mIsInBackground) {
+    } else if (!wasVideoCall && canVideoPause && isInBackground) {
       // Bring UI to foreground if VoLTE call becomes active while UI is in
       // background.
       bringToForeground();
@@ -185,22 +185,22 @@
         "VideoPauseController.onPrimaryCallChanged",
         "new call: %s, old call: %s, mIsInBackground: %b",
         call,
-        mPrimaryCall,
-        mIsInBackground);
+        primaryCall,
+        isInBackground);
 
-    if (Objects.equals(call, mPrimaryCall)) {
+    if (Objects.equals(call, primaryCall)) {
       throw new IllegalStateException();
     }
     final boolean canVideoPause = videoCanPause(call);
 
-    if (canVideoPause && !mIsInBackground) {
+    if (canVideoPause && !isInBackground) {
       // Send resume request for the active call, if user rejects incoming call, ends dialing
       // call, or the call was previously in a paused state and UI is in the foreground.
       sendRequest(call, true);
-    } else if (isIncomingCall(call) && videoCanPause(mPrimaryCall)) {
+    } else if (isIncomingCall(call) && videoCanPause(primaryCall)) {
       // Send pause request if there is an active video call, and we just received a new
       // incoming call.
-      sendRequest(mPrimaryCall, false);
+      sendRequest(primaryCall, false);
     }
 
     updatePrimaryCallContext(call);
@@ -222,7 +222,7 @@
         newState,
         call);
 
-    if (Objects.equals(call, mPrimaryCall)) {
+    if (Objects.equals(call, primaryCall)) {
       return;
     }
 
@@ -236,13 +236,13 @@
    */
   private void updatePrimaryCallContext(DialerCall call) {
     if (call == null) {
-      mPrimaryCall = null;
-      mPrevCallState = State.INVALID;
-      mWasVideoCall = false;
+      primaryCall = null;
+      prevCallState = State.INVALID;
+      wasVideoCall = false;
     } else {
-      mPrimaryCall = call;
-      mPrevCallState = call.getState();
-      mWasVideoCall = call.isVideoCall();
+      primaryCall = call;
+      prevCallState = call.getState();
+      wasVideoCall = call.isVideoCall();
     }
   }
 
@@ -252,11 +252,11 @@
    * @param showing true if UI is in the foreground, false otherwise.
    */
   public void onUiShowing(boolean showing) {
-    if (mInCallPresenter == null) {
+    if (inCallPresenter == null) {
       return;
     }
 
-    final boolean isInCall = mInCallPresenter.getInCallState() == InCallState.INCALL;
+    final boolean isInCall = inCallPresenter.getInCallState() == InCallState.INCALL;
     if (showing) {
       onResume(isInCall);
     } else {
@@ -272,9 +272,9 @@
    *     video provider if we are in a call.
    */
   private void onResume(boolean isInCall) {
-    mIsInBackground = false;
+    isInBackground = false;
     if (isInCall) {
-      sendRequest(mPrimaryCall, true);
+      sendRequest(primaryCall, true);
     }
   }
 
@@ -286,16 +286,16 @@
    *     video provider if we are in a call.
    */
   private void onPause(boolean isInCall) {
-    mIsInBackground = true;
+    isInBackground = true;
     if (isInCall) {
-      sendRequest(mPrimaryCall, false);
+      sendRequest(primaryCall, false);
     }
   }
 
   private void bringToForeground() {
     LogUtil.enterBlock("VideoPauseController.bringToForeground");
-    if (mInCallPresenter != null) {
-      mInCallPresenter.bringToForeground(false);
+    if (inCallPresenter != null) {
+      inCallPresenter.bringToForeground(false);
     } else {
       LogUtil.e(
           "VideoPauseController.bringToForeground",
diff --git a/java/com/android/incallui/answer/impl/FixedAspectSurfaceView.java b/java/com/android/incallui/answer/impl/FixedAspectSurfaceView.java
index ad7d94d..1f7e6fe 100644
--- a/java/com/android/incallui/answer/impl/FixedAspectSurfaceView.java
+++ b/java/com/android/incallui/answer/impl/FixedAspectSurfaceView.java
@@ -34,7 +34,7 @@
 public class FixedAspectSurfaceView extends SurfaceView {
 
   /** Desired width/height ratio */
-  private float mAspectRatio;
+  private float aspectRatio;
 
   private final boolean scaleWidth;
   private final boolean scaleHeight;
@@ -60,7 +60,7 @@
    */
   public void setAspectRatio(float aspect) {
     Assert.checkArgument(aspect >= 0, "Aspect ratio must be positive");
-    mAspectRatio = aspect;
+    aspectRatio = aspect;
     requestLayout();
   }
 
@@ -71,9 +71,9 @@
 
     // Do the scaling
     if (scaleWidth) {
-      width = (int) (height * mAspectRatio);
+      width = (int) (height * aspectRatio);
     } else if (scaleHeight) {
-      height = (int) (width / mAspectRatio);
+      height = (int) (width / aspectRatio);
     }
 
     // Override width/height if needed for EXACTLY and AT_MOST specs
diff --git a/java/com/android/incallui/answer/impl/affordance/SwipeButtonHelper.java b/java/com/android/incallui/answer/impl/affordance/SwipeButtonHelper.java
index 1c66e63..6fb520c 100644
--- a/java/com/android/incallui/answer/impl/affordance/SwipeButtonHelper.java
+++ b/java/com/android/incallui/answer/impl/affordance/SwipeButtonHelper.java
@@ -273,16 +273,16 @@
     }
     animator.addListener(
         new AnimatorListenerAdapter() {
-          private boolean mCancelled;
+          private boolean cancelled;
 
           @Override
           public void onAnimationCancel(Animator animation) {
-            mCancelled = true;
+            cancelled = true;
           }
 
           @Override
           public void onAnimationEnd(Animator animation) {
-            if (mCancelled) {
+            if (cancelled) {
               swipeAnimator = null;
               targetedView = null;
               if (onFinishedListener != null) {
diff --git a/java/com/android/incallui/answer/impl/affordance/SwipeButtonView.java b/java/com/android/incallui/answer/impl/affordance/SwipeButtonView.java
index 46879ea..249c47a 100644
--- a/java/com/android/incallui/answer/impl/affordance/SwipeButtonView.java
+++ b/java/com/android/incallui/answer/impl/affordance/SwipeButtonView.java
@@ -474,16 +474,16 @@
 
   private Animator.AnimatorListener getEndListener(final Runnable runnable) {
     return new AnimatorListenerAdapter() {
-      boolean mCancelled;
+      boolean cancelled;
 
       @Override
       public void onAnimationCancel(Animator animation) {
-        mCancelled = true;
+        cancelled = true;
       }
 
       @Override
       public void onAnimationEnd(Animator animation) {
-        if (!mCancelled) {
+        if (!cancelled) {
           runnable.run();
         }
       }
diff --git a/java/com/android/incallui/answer/impl/classifier/AccelerationClassifier.java b/java/com/android/incallui/answer/impl/classifier/AccelerationClassifier.java
index ac50444..ae0d1c8 100644
--- a/java/com/android/incallui/answer/impl/classifier/AccelerationClassifier.java
+++ b/java/com/android/incallui/answer/impl/classifier/AccelerationClassifier.java
@@ -29,10 +29,10 @@
  * the speed of a part.
  */
 class AccelerationClassifier extends StrokeClassifier {
-  private final Map<Stroke, Data> mStrokeMap = new ArrayMap<>();
+  private final Map<Stroke, Data> strokeMap = new ArrayMap<>();
 
   public AccelerationClassifier(ClassifierData classifierData) {
-    mClassifierData = classifierData;
+    this.classifierData = classifierData;
   }
 
   @Override
@@ -45,23 +45,23 @@
     int action = event.getActionMasked();
 
     if (action == MotionEvent.ACTION_DOWN) {
-      mStrokeMap.clear();
+      strokeMap.clear();
     }
 
     for (int i = 0; i < event.getPointerCount(); i++) {
-      Stroke stroke = mClassifierData.getStroke(event.getPointerId(i));
+      Stroke stroke = classifierData.getStroke(event.getPointerId(i));
       Point point = stroke.getPoints().get(stroke.getPoints().size() - 1);
-      if (mStrokeMap.get(stroke) == null) {
-        mStrokeMap.put(stroke, new Data(point));
+      if (strokeMap.get(stroke) == null) {
+        strokeMap.put(stroke, new Data(point));
       } else {
-        mStrokeMap.get(stroke).addPoint(point);
+        strokeMap.get(stroke).addPoint(point);
       }
     }
   }
 
   @Override
   public float getFalseTouchEvaluation(Stroke stroke) {
-    Data data = mStrokeMap.get(stroke);
+    Data data = strokeMap.get(stroke);
     return 2 * SpeedRatioEvaluator.evaluate(data.maxSpeedRatio);
   }
 
diff --git a/java/com/android/incallui/answer/impl/classifier/AnglesClassifier.java b/java/com/android/incallui/answer/impl/classifier/AnglesClassifier.java
index dbfbcfc..24f04c4 100644
--- a/java/com/android/incallui/answer/impl/classifier/AnglesClassifier.java
+++ b/java/com/android/incallui/answer/impl/classifier/AnglesClassifier.java
@@ -47,10 +47,10 @@
  * angels or right angles)
  */
 class AnglesClassifier extends StrokeClassifier {
-  private Map<Stroke, Data> mStrokeMap = new ArrayMap<>();
+  private Map<Stroke, Data> strokeMap = new ArrayMap<>();
 
   public AnglesClassifier(ClassifierData classifierData) {
-    mClassifierData = classifierData;
+    this.classifierData = classifierData;
   }
 
   @Override
@@ -63,22 +63,22 @@
     int action = event.getActionMasked();
 
     if (action == MotionEvent.ACTION_DOWN) {
-      mStrokeMap.clear();
+      strokeMap.clear();
     }
 
     for (int i = 0; i < event.getPointerCount(); i++) {
-      Stroke stroke = mClassifierData.getStroke(event.getPointerId(i));
+      Stroke stroke = classifierData.getStroke(event.getPointerId(i));
 
-      if (mStrokeMap.get(stroke) == null) {
-        mStrokeMap.put(stroke, new Data());
+      if (strokeMap.get(stroke) == null) {
+        strokeMap.put(stroke, new Data());
       }
-      mStrokeMap.get(stroke).addPoint(stroke.getPoints().get(stroke.getPoints().size() - 1));
+      strokeMap.get(stroke).addPoint(stroke.getPoints().get(stroke.getPoints().size() - 1));
     }
   }
 
   @Override
   public float getFalseTouchEvaluation(Stroke stroke) {
-    Data data = mStrokeMap.get(stroke);
+    Data data = strokeMap.get(stroke);
     return AnglesVarianceEvaluator.evaluate(data.getAnglesVariance())
         + AnglesPercentageEvaluator.evaluate(data.getAnglesPercentage());
   }
@@ -87,82 +87,82 @@
     private static final float ANGLE_DEVIATION = (float) Math.PI / 20.0f;
     private static final float MIN_MOVE_DIST_DP = .01f;
 
-    private List<Point> mLastThreePoints = new ArrayList<>();
-    private float mFirstAngleVariance;
-    private float mPreviousAngle;
-    private float mBiggestAngle;
-    private float mSumSquares;
-    private float mSecondSumSquares;
-    private float mSum;
-    private float mSecondSum;
-    private float mCount;
-    private float mSecondCount;
-    private float mFirstLength;
-    private float mLength;
-    private float mAnglesCount;
-    private float mLeftAngles;
-    private float mRightAngles;
-    private float mStraightAngles;
+    private List<Point> lastThreePoints = new ArrayList<>();
+    private float firstAngleVariance;
+    private float previousAngle;
+    private float biggestAngle;
+    private float sumSquares;
+    private float secondSumSquares;
+    private float sum;
+    private float secondSum;
+    private float count;
+    private float secondCount;
+    private float firstLength;
+    private float length;
+    private float anglesCount;
+    private float leftAngles;
+    private float rightAngles;
+    private float straightAngles;
 
     public Data() {
-      mFirstAngleVariance = 0.0f;
-      mPreviousAngle = (float) Math.PI;
-      mBiggestAngle = 0.0f;
-      mSumSquares = mSecondSumSquares = 0.0f;
-      mSum = mSecondSum = 0.0f;
-      mCount = mSecondCount = 1.0f;
-      mLength = mFirstLength = 0.0f;
-      mAnglesCount = mLeftAngles = mRightAngles = mStraightAngles = 0.0f;
+      firstAngleVariance = 0.0f;
+      previousAngle = (float) Math.PI;
+      biggestAngle = 0.0f;
+      sumSquares = secondSumSquares = 0.0f;
+      sum = secondSum = 0.0f;
+      count = secondCount = 1.0f;
+      length = firstLength = 0.0f;
+      anglesCount = leftAngles = rightAngles = straightAngles = 0.0f;
     }
 
     public void addPoint(Point point) {
       // Checking if the added point is different than the previously added point
       // Repetitions and short distances are being ignored so that proper angles are calculated.
-      if (mLastThreePoints.isEmpty()
-          || (!mLastThreePoints.get(mLastThreePoints.size() - 1).equals(point)
-              && (mLastThreePoints.get(mLastThreePoints.size() - 1).dist(point)
+      if (lastThreePoints.isEmpty()
+          || (!lastThreePoints.get(lastThreePoints.size() - 1).equals(point)
+              && (lastThreePoints.get(lastThreePoints.size() - 1).dist(point)
                   > MIN_MOVE_DIST_DP))) {
-        if (!mLastThreePoints.isEmpty()) {
-          mLength += mLastThreePoints.get(mLastThreePoints.size() - 1).dist(point);
+        if (!lastThreePoints.isEmpty()) {
+          length += lastThreePoints.get(lastThreePoints.size() - 1).dist(point);
         }
-        mLastThreePoints.add(point);
-        if (mLastThreePoints.size() == 4) {
-          mLastThreePoints.remove(0);
+        lastThreePoints.add(point);
+        if (lastThreePoints.size() == 4) {
+          lastThreePoints.remove(0);
 
           float angle =
-              mLastThreePoints.get(1).getAngle(mLastThreePoints.get(0), mLastThreePoints.get(2));
+              lastThreePoints.get(1).getAngle(lastThreePoints.get(0), lastThreePoints.get(2));
 
-          mAnglesCount++;
+          anglesCount++;
           if (angle < Math.PI - ANGLE_DEVIATION) {
-            mLeftAngles++;
+            leftAngles++;
           } else if (angle <= Math.PI + ANGLE_DEVIATION) {
-            mStraightAngles++;
+            straightAngles++;
           } else {
-            mRightAngles++;
+            rightAngles++;
           }
 
-          float difference = angle - mPreviousAngle;
+          float difference = angle - previousAngle;
 
           // If this is the biggest angle of the stroke so then we save the value of
           // the angle variance so far and start to count the values for the angle
           // variance of the second part.
-          if (mBiggestAngle < angle) {
-            mBiggestAngle = angle;
-            mFirstLength = mLength;
-            mFirstAngleVariance = getAnglesVariance(mSumSquares, mSum, mCount);
-            mSecondSumSquares = 0.0f;
-            mSecondSum = 0.0f;
-            mSecondCount = 1.0f;
+          if (biggestAngle < angle) {
+            biggestAngle = angle;
+            firstLength = length;
+            firstAngleVariance = getAnglesVariance(sumSquares, sum, count);
+            secondSumSquares = 0.0f;
+            secondSum = 0.0f;
+            secondCount = 1.0f;
           } else {
-            mSecondSum += difference;
-            mSecondSumSquares += difference * difference;
-            mSecondCount += 1.0f;
+            secondSum += difference;
+            secondSumSquares += difference * difference;
+            secondCount += 1.0f;
           }
 
-          mSum += difference;
-          mSumSquares += difference * difference;
-          mCount += 1.0f;
-          mPreviousAngle = angle;
+          sum += difference;
+          sumSquares += difference * difference;
+          count += 1.0f;
+          previousAngle = angle;
         }
       }
     }
@@ -172,22 +172,21 @@
     }
 
     public float getAnglesVariance() {
-      float anglesVariance = getAnglesVariance(mSumSquares, mSum, mCount);
-      if (mFirstLength < mLength / 2f) {
+      float anglesVariance = getAnglesVariance(sumSquares, sum, count);
+      if (firstLength < length / 2f) {
         anglesVariance =
             Math.min(
                 anglesVariance,
-                mFirstAngleVariance
-                    + getAnglesVariance(mSecondSumSquares, mSecondSum, mSecondCount));
+                firstAngleVariance + getAnglesVariance(secondSumSquares, secondSum, secondCount));
       }
       return anglesVariance;
     }
 
     public float getAnglesPercentage() {
-      if (mAnglesCount == 0.0f) {
+      if (anglesCount == 0.0f) {
         return 1.0f;
       }
-      return (Math.max(mLeftAngles, mRightAngles) + mStraightAngles) / mAnglesCount;
+      return (Math.max(leftAngles, rightAngles) + straightAngles) / anglesCount;
     }
   }
 }
diff --git a/java/com/android/incallui/answer/impl/classifier/Classifier.java b/java/com/android/incallui/answer/impl/classifier/Classifier.java
index c6fbff3..1baa6b4 100644
--- a/java/com/android/incallui/answer/impl/classifier/Classifier.java
+++ b/java/com/android/incallui/answer/impl/classifier/Classifier.java
@@ -23,7 +23,7 @@
 abstract class Classifier {
 
   /** Contains all the information about touch events from which the classifier can query */
-  protected ClassifierData mClassifierData;
+  protected ClassifierData classifierData;
 
   /** Informs the classifier that a new touch event has occurred */
   public void onTouchEvent(MotionEvent event) {}
diff --git a/java/com/android/incallui/answer/impl/classifier/ClassifierData.java b/java/com/android/incallui/answer/impl/classifier/ClassifierData.java
index ae07d27..fe3fbe0 100644
--- a/java/com/android/incallui/answer/impl/classifier/ClassifierData.java
+++ b/java/com/android/incallui/answer/impl/classifier/ClassifierData.java
@@ -26,31 +26,31 @@
  * example, provide information on the current touch state.
  */
 class ClassifierData {
-  private SparseArray<Stroke> mCurrentStrokes = new SparseArray<>();
-  private ArrayList<Stroke> mEndingStrokes = new ArrayList<>();
-  private final float mDpi;
-  private final float mScreenHeight;
+  private SparseArray<Stroke> currentStrokes = new SparseArray<>();
+  private ArrayList<Stroke> endingStrokes = new ArrayList<>();
+  private final float dpi;
+  private final float screenHeight;
 
   public ClassifierData(float dpi, float screenHeight) {
-    mDpi = dpi;
-    mScreenHeight = screenHeight / dpi;
+    this.dpi = dpi;
+    this.screenHeight = screenHeight / dpi;
   }
 
   public void update(MotionEvent event) {
-    mEndingStrokes.clear();
+    endingStrokes.clear();
     int action = event.getActionMasked();
     if (action == MotionEvent.ACTION_DOWN) {
-      mCurrentStrokes.clear();
+      currentStrokes.clear();
     }
 
     for (int i = 0; i < event.getPointerCount(); i++) {
       int id = event.getPointerId(i);
-      if (mCurrentStrokes.get(id) == null) {
+      if (currentStrokes.get(id) == null) {
         // TODO (keyboardr): See if there's a way to use event.getEventTimeNanos() instead
-        mCurrentStrokes.put(
-            id, new Stroke(TimeUnit.MILLISECONDS.toNanos(event.getEventTime()), mDpi));
+        currentStrokes.put(
+            id, new Stroke(TimeUnit.MILLISECONDS.toNanos(event.getEventTime()), dpi));
       }
-      mCurrentStrokes
+      currentStrokes
           .get(id)
           .addPoint(
               event.getX(i), event.getY(i), TimeUnit.MILLISECONDS.toNanos(event.getEventTime()));
@@ -58,27 +58,27 @@
       if (action == MotionEvent.ACTION_UP
           || action == MotionEvent.ACTION_CANCEL
           || (action == MotionEvent.ACTION_POINTER_UP && i == event.getActionIndex())) {
-        mEndingStrokes.add(getStroke(id));
+        endingStrokes.add(getStroke(id));
       }
     }
   }
 
   void cleanUp(MotionEvent event) {
-    mEndingStrokes.clear();
+    endingStrokes.clear();
     int action = event.getActionMasked();
     for (int i = 0; i < event.getPointerCount(); i++) {
       int id = event.getPointerId(i);
       if (action == MotionEvent.ACTION_UP
           || action == MotionEvent.ACTION_CANCEL
           || (action == MotionEvent.ACTION_POINTER_UP && i == event.getActionIndex())) {
-        mCurrentStrokes.remove(id);
+        currentStrokes.remove(id);
       }
     }
   }
 
   /** @return the list of Strokes which are ending in the recently added MotionEvent */
   public ArrayList<Stroke> getEndingStrokes() {
-    return mEndingStrokes;
+    return endingStrokes;
   }
 
   /**
@@ -86,11 +86,11 @@
    * @return the Stroke assigned to the id
    */
   public Stroke getStroke(int id) {
-    return mCurrentStrokes.get(id);
+    return currentStrokes.get(id);
   }
 
   /** @return the height of the screen in inches */
   public float getScreenHeight() {
-    return mScreenHeight;
+    return screenHeight;
   }
 }
diff --git a/java/com/android/incallui/answer/impl/classifier/EndPointLengthClassifier.java b/java/com/android/incallui/answer/impl/classifier/EndPointLengthClassifier.java
index 95b3176..a111ccc 100644
--- a/java/com/android/incallui/answer/impl/classifier/EndPointLengthClassifier.java
+++ b/java/com/android/incallui/answer/impl/classifier/EndPointLengthClassifier.java
@@ -21,7 +21,7 @@
  */
 class EndPointLengthClassifier extends StrokeClassifier {
   public EndPointLengthClassifier(ClassifierData classifierData) {
-    mClassifierData = classifierData;
+    this.classifierData = classifierData;
   }
 
   @Override
diff --git a/java/com/android/incallui/answer/impl/classifier/EndPointRatioClassifier.java b/java/com/android/incallui/answer/impl/classifier/EndPointRatioClassifier.java
index 01a35c1..4336e00 100644
--- a/java/com/android/incallui/answer/impl/classifier/EndPointRatioClassifier.java
+++ b/java/com/android/incallui/answer/impl/classifier/EndPointRatioClassifier.java
@@ -22,7 +22,7 @@
  */
 class EndPointRatioClassifier extends StrokeClassifier {
   public EndPointRatioClassifier(ClassifierData classifierData) {
-    mClassifierData = classifierData;
+    this.classifierData = classifierData;
   }
 
   @Override
diff --git a/java/com/android/incallui/answer/impl/classifier/FalsingManager.java b/java/com/android/incallui/answer/impl/classifier/FalsingManager.java
index 9cdd888..3deff88 100644
--- a/java/com/android/incallui/answer/impl/classifier/FalsingManager.java
+++ b/java/com/android/incallui/answer/impl/classifier/FalsingManager.java
@@ -36,23 +36,23 @@
         Sensor.TYPE_PROXIMITY,
       };
 
-  private final SensorManager mSensorManager;
-  private final HumanInteractionClassifier mHumanInteractionClassifier;
-  private final AccessibilityManager mAccessibilityManager;
+  private final SensorManager sensorManager;
+  private final HumanInteractionClassifier humanInteractionClassifier;
+  private final AccessibilityManager accessibilityManager;
 
-  private boolean mSessionActive = false;
-  private boolean mScreenOn;
+  private boolean sessionActive = false;
+  private boolean screenOn;
 
   public FalsingManager(Context context) {
-    mSensorManager = context.getSystemService(SensorManager.class);
-    mAccessibilityManager = context.getSystemService(AccessibilityManager.class);
-    mHumanInteractionClassifier = new HumanInteractionClassifier(context);
-    mScreenOn = context.getSystemService(PowerManager.class).isInteractive();
+    sensorManager = context.getSystemService(SensorManager.class);
+    accessibilityManager = context.getSystemService(AccessibilityManager.class);
+    humanInteractionClassifier = new HumanInteractionClassifier(context);
+    screenOn = context.getSystemService(PowerManager.class).isInteractive();
   }
 
   /** Returns {@code true} iff the FalsingManager is enabled and able to classify touches */
   public boolean isEnabled() {
-    return mHumanInteractionClassifier.isEnabled();
+    return humanInteractionClassifier.isEnabled();
   }
 
   /**
@@ -62,8 +62,8 @@
   public boolean isFalseTouch() {
     // Touch exploration triggers false positives in the classifier and
     // already sufficiently prevents false unlocks.
-    return !mAccessibilityManager.isTouchExplorationEnabled()
-        && mHumanInteractionClassifier.isFalseTouch();
+    return !accessibilityManager.isTouchExplorationEnabled()
+        && humanInteractionClassifier.isFalseTouch();
   }
 
   /**
@@ -71,7 +71,7 @@
    * tracking changes if the manager is enabled.
    */
   public void onScreenOn() {
-    mScreenOn = true;
+    screenOn = true;
     sessionEntrypoint();
   }
 
@@ -80,7 +80,7 @@
    * will cause the manager to stop tracking changes.
    */
   public void onScreenOff() {
-    mScreenOn = false;
+    screenOn = false;
     sessionExitpoint();
   }
 
@@ -90,25 +90,25 @@
    * @param event MotionEvent to be classified as human or false.
    */
   public void onTouchEvent(MotionEvent event) {
-    if (mSessionActive) {
-      mHumanInteractionClassifier.onTouchEvent(event);
+    if (sessionActive) {
+      humanInteractionClassifier.onTouchEvent(event);
     }
   }
 
   @Override
   public synchronized void onSensorChanged(SensorEvent event) {
-    mHumanInteractionClassifier.onSensorChanged(event);
+    humanInteractionClassifier.onSensorChanged(event);
   }
 
   @Override
   public void onAccuracyChanged(Sensor sensor, int accuracy) {}
 
   private boolean shouldSessionBeActive() {
-    return isEnabled() && mScreenOn;
+    return isEnabled() && screenOn;
   }
 
   private boolean sessionEntrypoint() {
-    if (!mSessionActive && shouldSessionBeActive()) {
+    if (!sessionActive && shouldSessionBeActive()) {
       onSessionStart();
       return true;
     }
@@ -116,16 +116,16 @@
   }
 
   private void sessionExitpoint() {
-    if (mSessionActive && !shouldSessionBeActive()) {
-      mSessionActive = false;
-      mSensorManager.unregisterListener(this);
+    if (sessionActive && !shouldSessionBeActive()) {
+      sessionActive = false;
+      sensorManager.unregisterListener(this);
     }
   }
 
   private void onSessionStart() {
-    mSessionActive = true;
+    sessionActive = true;
 
-    if (mHumanInteractionClassifier.isEnabled()) {
+    if (humanInteractionClassifier.isEnabled()) {
       registerSensors(CLASSIFIER_SENSORS);
     }
   }
@@ -134,11 +134,11 @@
     Trace.beginSection("FalsingManager.registerSensors");
     for (int sensorType : sensors) {
       Trace.beginSection("get sensor " + sensorType);
-      Sensor s = mSensorManager.getDefaultSensor(sensorType);
+      Sensor s = sensorManager.getDefaultSensor(sensorType);
       Trace.endSection();
       if (s != null) {
         Trace.beginSection("register");
-        mSensorManager.registerListener(this, s, SensorManager.SENSOR_DELAY_GAME);
+        sensorManager.registerListener(this, s, SensorManager.SENSOR_DELAY_GAME);
         Trace.endSection();
       }
     }
diff --git a/java/com/android/incallui/answer/impl/classifier/HistoryEvaluator.java b/java/com/android/incallui/answer/impl/classifier/HistoryEvaluator.java
index 3f302c6..c0256a5 100644
--- a/java/com/android/incallui/answer/impl/classifier/HistoryEvaluator.java
+++ b/java/com/android/incallui/answer/impl/classifier/HistoryEvaluator.java
@@ -17,7 +17,6 @@
 package com.android.incallui.answer.impl.classifier;
 
 import android.os.SystemClock;
-
 import java.util.ArrayList;
 
 /**
@@ -28,27 +27,27 @@
   private static final float HISTORY_FACTOR = 0.9f;
   private static final float EPSILON = 1e-5f;
 
-  private final ArrayList<Data> mStrokes = new ArrayList<>();
-  private final ArrayList<Data> mGestureWeights = new ArrayList<>();
-  private long mLastUpdate;
+  private final ArrayList<Data> strokes = new ArrayList<>();
+  private final ArrayList<Data> gestureWeights = new ArrayList<>();
+  private long lastUpdate;
 
   public HistoryEvaluator() {
-    mLastUpdate = SystemClock.elapsedRealtime();
+    lastUpdate = SystemClock.elapsedRealtime();
   }
 
   public void addStroke(float evaluation) {
     decayValue();
-    mStrokes.add(new Data(evaluation));
+    strokes.add(new Data(evaluation));
   }
 
   public void addGesture(float evaluation) {
     decayValue();
-    mGestureWeights.add(new Data(evaluation));
+    gestureWeights.add(new Data(evaluation));
   }
 
   /** Calculates the weighted average of strokes and adds to it the weighted average of gestures */
   public float getEvaluation() {
-    return weightedAverage(mStrokes) + weightedAverage(mGestureWeights);
+    return weightedAverage(strokes) + weightedAverage(gestureWeights);
   }
 
   private float weightedAverage(ArrayList<Data> list) {
@@ -71,16 +70,16 @@
   private void decayValue() {
     long time = SystemClock.elapsedRealtime();
 
-    if (time <= mLastUpdate) {
+    if (time <= lastUpdate) {
       return;
     }
 
     // All weights are multiplied by HISTORY_FACTOR after each INTERVAL milliseconds.
-    float factor = (float) Math.pow(HISTORY_FACTOR, (time - mLastUpdate) / INTERVAL);
+    float factor = (float) Math.pow(HISTORY_FACTOR, (time - lastUpdate) / INTERVAL);
 
-    decayValue(mStrokes, factor);
-    decayValue(mGestureWeights, factor);
-    mLastUpdate = time;
+    decayValue(strokes, factor);
+    decayValue(gestureWeights, factor);
+    lastUpdate = time;
   }
 
   private void decayValue(ArrayList<Data> list, float factor) {
diff --git a/java/com/android/incallui/answer/impl/classifier/HumanInteractionClassifier.java b/java/com/android/incallui/answer/impl/classifier/HumanInteractionClassifier.java
index 5e83dfc..b661579 100644
--- a/java/com/android/incallui/answer/impl/classifier/HumanInteractionClassifier.java
+++ b/java/com/android/incallui/answer/impl/classifier/HumanInteractionClassifier.java
@@ -28,10 +28,10 @@
   private static final String CONFIG_ANSWER_FALSE_TOUCH_DETECTION_ENABLED =
       "answer_false_touch_detection_enabled";
 
-  private final StrokeClassifier[] mStrokeClassifiers;
-  private final GestureClassifier[] mGestureClassifiers;
-  private final HistoryEvaluator mHistoryEvaluator;
-  private final boolean mEnabled;
+  private final StrokeClassifier[] strokeClassifiers;
+  private final GestureClassifier[] gestureClassifiers;
+  private final HistoryEvaluator historyEvaluator;
+  private final boolean enabled;
 
   HumanInteractionClassifier(Context context) {
     DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
@@ -41,28 +41,28 @@
     // take the average.
     // Note that xdpi and ydpi are the physical pixels per inch and are not affected by scaling.
     float dpi = (displayMetrics.xdpi + displayMetrics.ydpi) / 2.0f;
-    mClassifierData = new ClassifierData(dpi, displayMetrics.heightPixels);
-    mHistoryEvaluator = new HistoryEvaluator();
-    mEnabled =
+    classifierData = new ClassifierData(dpi, displayMetrics.heightPixels);
+    historyEvaluator = new HistoryEvaluator();
+    enabled =
         ConfigProviderBindings.get(context)
             .getBoolean(CONFIG_ANSWER_FALSE_TOUCH_DETECTION_ENABLED, true);
 
-    mStrokeClassifiers =
+    strokeClassifiers =
         new StrokeClassifier[] {
-          new AnglesClassifier(mClassifierData),
-          new SpeedClassifier(mClassifierData),
-          new DurationCountClassifier(mClassifierData),
-          new EndPointRatioClassifier(mClassifierData),
-          new EndPointLengthClassifier(mClassifierData),
-          new AccelerationClassifier(mClassifierData),
-          new SpeedAnglesClassifier(mClassifierData),
-          new LengthCountClassifier(mClassifierData),
-          new DirectionClassifier(mClassifierData)
+          new AnglesClassifier(classifierData),
+          new SpeedClassifier(classifierData),
+          new DurationCountClassifier(classifierData),
+          new EndPointRatioClassifier(classifierData),
+          new EndPointLengthClassifier(classifierData),
+          new AccelerationClassifier(classifierData),
+          new SpeedAnglesClassifier(classifierData),
+          new LengthCountClassifier(classifierData),
+          new DirectionClassifier(classifierData)
         };
 
-    mGestureClassifiers =
+    gestureClassifiers =
         new GestureClassifier[] {
-          new PointerCountClassifier(mClassifierData), new ProximityClassifier(mClassifierData)
+          new PointerCountClassifier(classifierData), new ProximityClassifier(classifierData)
         };
   }
 
@@ -80,59 +80,59 @@
   }
 
   private void addTouchEvent(MotionEvent event) {
-    mClassifierData.update(event);
+    classifierData.update(event);
 
-    for (StrokeClassifier c : mStrokeClassifiers) {
+    for (StrokeClassifier c : strokeClassifiers) {
       c.onTouchEvent(event);
     }
 
-    for (GestureClassifier c : mGestureClassifiers) {
+    for (GestureClassifier c : gestureClassifiers) {
       c.onTouchEvent(event);
     }
 
-    int size = mClassifierData.getEndingStrokes().size();
+    int size = classifierData.getEndingStrokes().size();
     for (int i = 0; i < size; i++) {
-      Stroke stroke = mClassifierData.getEndingStrokes().get(i);
+      Stroke stroke = classifierData.getEndingStrokes().get(i);
       float evaluation = 0.0f;
-      for (StrokeClassifier c : mStrokeClassifiers) {
+      for (StrokeClassifier c : strokeClassifiers) {
         float e = c.getFalseTouchEvaluation(stroke);
         evaluation += e;
       }
 
-      mHistoryEvaluator.addStroke(evaluation);
+      historyEvaluator.addStroke(evaluation);
     }
 
     int action = event.getActionMasked();
     if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
       float evaluation = 0.0f;
-      for (GestureClassifier c : mGestureClassifiers) {
+      for (GestureClassifier c : gestureClassifiers) {
         float e = c.getFalseTouchEvaluation();
         evaluation += e;
       }
-      mHistoryEvaluator.addGesture(evaluation);
+      historyEvaluator.addGesture(evaluation);
     }
 
-    mClassifierData.cleanUp(event);
+    classifierData.cleanUp(event);
   }
 
   @Override
   public void onSensorChanged(SensorEvent event) {
-    for (Classifier c : mStrokeClassifiers) {
+    for (Classifier c : strokeClassifiers) {
       c.onSensorChanged(event);
     }
 
-    for (Classifier c : mGestureClassifiers) {
+    for (Classifier c : gestureClassifiers) {
       c.onSensorChanged(event);
     }
   }
 
   boolean isFalseTouch() {
-    float evaluation = mHistoryEvaluator.getEvaluation();
+    float evaluation = historyEvaluator.getEvaluation();
     return evaluation >= 5.0f;
   }
 
   public boolean isEnabled() {
-    return mEnabled;
+    return enabled;
   }
 
   @Override
diff --git a/java/com/android/incallui/answer/impl/classifier/PointerCountClassifier.java b/java/com/android/incallui/answer/impl/classifier/PointerCountClassifier.java
index 070de6c..b3ee849 100644
--- a/java/com/android/incallui/answer/impl/classifier/PointerCountClassifier.java
+++ b/java/com/android/incallui/answer/impl/classifier/PointerCountClassifier.java
@@ -20,10 +20,10 @@
 
 /** A classifier which looks at the total number of traces in the whole gesture. */
 class PointerCountClassifier extends GestureClassifier {
-  private int mCount;
+  private int count;
 
   public PointerCountClassifier(ClassifierData classifierData) {
-    mCount = 0;
+    count = 0;
   }
 
   @Override
@@ -36,16 +36,16 @@
     int action = event.getActionMasked();
 
     if (action == MotionEvent.ACTION_DOWN) {
-      mCount = 1;
+      count = 1;
     }
 
     if (action == MotionEvent.ACTION_POINTER_DOWN) {
-      ++mCount;
+      ++count;
     }
   }
 
   @Override
   public float getFalseTouchEvaluation() {
-    return PointerCountEvaluator.evaluate(mCount);
+    return PointerCountEvaluator.evaluate(count);
   }
 }
diff --git a/java/com/android/incallui/answer/impl/classifier/ProximityClassifier.java b/java/com/android/incallui/answer/impl/classifier/ProximityClassifier.java
index 28701ea..b63f15d 100644
--- a/java/com/android/incallui/answer/impl/classifier/ProximityClassifier.java
+++ b/java/com/android/incallui/answer/impl/classifier/ProximityClassifier.java
@@ -26,11 +26,11 @@
  * the proximity sensor showing the near state during the whole gesture
  */
 class ProximityClassifier extends GestureClassifier {
-  private long mGestureStartTimeNano;
-  private long mNearStartTimeNano;
-  private long mNearDuration;
-  private boolean mNear;
-  private float mAverageNear;
+  private long gestureStartTimeNano;
+  private long nearStartTimeNano;
+  private long nearDuration;
+  private boolean near;
+  private float averageNear;
 
   public ProximityClassifier(ClassifierData classifierData) {}
 
@@ -51,19 +51,19 @@
     int action = event.getActionMasked();
 
     if (action == MotionEvent.ACTION_DOWN) {
-      mGestureStartTimeNano = TimeUnit.MILLISECONDS.toNanos(event.getEventTime());
-      mNearStartTimeNano = TimeUnit.MILLISECONDS.toNanos(event.getEventTime());
-      mNearDuration = 0;
+      gestureStartTimeNano = TimeUnit.MILLISECONDS.toNanos(event.getEventTime());
+      nearStartTimeNano = TimeUnit.MILLISECONDS.toNanos(event.getEventTime());
+      nearDuration = 0;
     }
 
     if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
-      update(mNear, TimeUnit.MILLISECONDS.toNanos(event.getEventTime()));
-      long duration = TimeUnit.MILLISECONDS.toNanos(event.getEventTime()) - mGestureStartTimeNano;
+      update(near, TimeUnit.MILLISECONDS.toNanos(event.getEventTime()));
+      long duration = TimeUnit.MILLISECONDS.toNanos(event.getEventTime()) - gestureStartTimeNano;
 
       if (duration == 0) {
-        mAverageNear = mNear ? 1.0f : 0.0f;
+        averageNear = near ? 1.0f : 0.0f;
       } else {
-        mAverageNear = (float) mNearDuration / (float) duration;
+        averageNear = (float) nearDuration / (float) duration;
       }
     }
   }
@@ -75,23 +75,23 @@
   private void update(boolean near, long timestampNano) {
     // This if is necessary because MotionEvents and SensorEvents do not come in
     // chronological order
-    if (timestampNano > mNearStartTimeNano) {
+    if (timestampNano > nearStartTimeNano) {
       // if the state before was near then add the difference of the current time and
       // mNearStartTimeNano to mNearDuration.
-      if (mNear) {
-        mNearDuration += timestampNano - mNearStartTimeNano;
+      if (this.near) {
+        nearDuration += timestampNano - nearStartTimeNano;
       }
 
       // if the new state is near, set mNearStartTimeNano equal to this moment.
       if (near) {
-        mNearStartTimeNano = timestampNano;
+        nearStartTimeNano = timestampNano;
       }
     }
-    mNear = near;
+    this.near = near;
   }
 
   @Override
   public float getFalseTouchEvaluation() {
-    return ProximityEvaluator.evaluate(mAverageNear);
+    return ProximityEvaluator.evaluate(averageNear);
   }
 }
diff --git a/java/com/android/incallui/answer/impl/classifier/SpeedAnglesClassifier.java b/java/com/android/incallui/answer/impl/classifier/SpeedAnglesClassifier.java
index 36ae3ad..034c4fe 100644
--- a/java/com/android/incallui/answer/impl/classifier/SpeedAnglesClassifier.java
+++ b/java/com/android/incallui/answer/impl/classifier/SpeedAnglesClassifier.java
@@ -33,10 +33,10 @@
  * a good stroke is most often increases, so most of these angels should be in this interval.
  */
 class SpeedAnglesClassifier extends StrokeClassifier {
-  private Map<Stroke, Data> mStrokeMap = new ArrayMap<>();
+  private Map<Stroke, Data> strokeMap = new ArrayMap<>();
 
   public SpeedAnglesClassifier(ClassifierData classifierData) {
-    mClassifierData = classifierData;
+    this.classifierData = classifierData;
   }
 
   @Override
@@ -49,27 +49,27 @@
     int action = event.getActionMasked();
 
     if (action == MotionEvent.ACTION_DOWN) {
-      mStrokeMap.clear();
+      strokeMap.clear();
     }
 
     for (int i = 0; i < event.getPointerCount(); i++) {
-      Stroke stroke = mClassifierData.getStroke(event.getPointerId(i));
+      Stroke stroke = classifierData.getStroke(event.getPointerId(i));
 
-      if (mStrokeMap.get(stroke) == null) {
-        mStrokeMap.put(stroke, new Data());
+      if (strokeMap.get(stroke) == null) {
+        strokeMap.put(stroke, new Data());
       }
 
       if (action != MotionEvent.ACTION_UP
           && action != MotionEvent.ACTION_CANCEL
           && !(action == MotionEvent.ACTION_POINTER_UP && i == event.getActionIndex())) {
-        mStrokeMap.get(stroke).addPoint(stroke.getPoints().get(stroke.getPoints().size() - 1));
+        strokeMap.get(stroke).addPoint(stroke.getPoints().get(stroke.getPoints().size() - 1));
       }
     }
   }
 
   @Override
   public float getFalseTouchEvaluation(Stroke stroke) {
-    Data data = mStrokeMap.get(stroke);
+    Data data = strokeMap.get(stroke);
     return SpeedVarianceEvaluator.evaluate(data.getAnglesVariance())
         + SpeedAnglesPercentageEvaluator.evaluate(data.getAnglesPercentage());
   }
@@ -79,69 +79,69 @@
     private static final float LENGTH_SCALE = 1.0f;
     private static final float ANGLE_DEVIATION = (float) Math.PI / 10.0f;
 
-    private List<Point> mLastThreePoints = new ArrayList<>();
-    private Point mPreviousPoint;
-    private float mPreviousAngle;
-    private float mSumSquares;
-    private float mSum;
-    private float mCount;
-    private float mDist;
-    private float mAnglesCount;
-    private float mAcceleratingAngles;
+    private List<Point> lastThreePoints = new ArrayList<>();
+    private Point previousPoint;
+    private float previousAngle;
+    private float sumSquares;
+    private float sum;
+    private float count;
+    private float dist;
+    private float anglesCount;
+    private float acceleratingAngles;
 
     public Data() {
-      mPreviousPoint = null;
-      mPreviousAngle = (float) Math.PI;
-      mSumSquares = 0.0f;
-      mSum = 0.0f;
-      mCount = 1.0f;
-      mDist = 0.0f;
-      mAnglesCount = mAcceleratingAngles = 0.0f;
+      previousPoint = null;
+      previousAngle = (float) Math.PI;
+      sumSquares = 0.0f;
+      sum = 0.0f;
+      count = 1.0f;
+      dist = 0.0f;
+      anglesCount = acceleratingAngles = 0.0f;
     }
 
     public void addPoint(Point point) {
-      if (mPreviousPoint != null) {
-        mDist += mPreviousPoint.dist(point);
+      if (previousPoint != null) {
+        dist += previousPoint.dist(point);
       }
 
-      mPreviousPoint = point;
+      previousPoint = point;
       Point speedPoint =
-          new Point((float) point.timeOffsetNano / DURATION_SCALE, mDist / LENGTH_SCALE);
+          new Point((float) point.timeOffsetNano / DURATION_SCALE, dist / LENGTH_SCALE);
 
       // Checking if the added point is different than the previously added point
       // Repetitions are being ignored so that proper angles are calculated.
-      if (mLastThreePoints.isEmpty()
-          || !mLastThreePoints.get(mLastThreePoints.size() - 1).equals(speedPoint)) {
-        mLastThreePoints.add(speedPoint);
-        if (mLastThreePoints.size() == 4) {
-          mLastThreePoints.remove(0);
+      if (lastThreePoints.isEmpty()
+          || !lastThreePoints.get(lastThreePoints.size() - 1).equals(speedPoint)) {
+        lastThreePoints.add(speedPoint);
+        if (lastThreePoints.size() == 4) {
+          lastThreePoints.remove(0);
 
           float angle =
-              mLastThreePoints.get(1).getAngle(mLastThreePoints.get(0), mLastThreePoints.get(2));
+              lastThreePoints.get(1).getAngle(lastThreePoints.get(0), lastThreePoints.get(2));
 
-          mAnglesCount++;
+          anglesCount++;
           if (angle >= (float) Math.PI - ANGLE_DEVIATION) {
-            mAcceleratingAngles++;
+            acceleratingAngles++;
           }
 
-          float difference = angle - mPreviousAngle;
-          mSum += difference;
-          mSumSquares += difference * difference;
-          mCount += 1.0f;
-          mPreviousAngle = angle;
+          float difference = angle - previousAngle;
+          sum += difference;
+          sumSquares += difference * difference;
+          count += 1.0f;
+          previousAngle = angle;
         }
       }
     }
 
     public float getAnglesVariance() {
-      return mSumSquares / mCount - (mSum / mCount) * (mSum / mCount);
+      return sumSquares / count - (sum / count) * (sum / count);
     }
 
     public float getAnglesPercentage() {
-      if (mAnglesCount == 0.0f) {
+      if (anglesCount == 0.0f) {
         return 1.0f;
       }
-      return (mAcceleratingAngles) / mAnglesCount;
+      return (acceleratingAngles) / anglesCount;
     }
   }
 }
diff --git a/java/com/android/incallui/answer/impl/classifier/Stroke.java b/java/com/android/incallui/answer/impl/classifier/Stroke.java
index c542d0f..a334249 100644
--- a/java/com/android/incallui/answer/impl/classifier/Stroke.java
+++ b/java/com/android/incallui/answer/impl/classifier/Stroke.java
@@ -26,40 +26,40 @@
 
   private static final float NANOS_TO_SECONDS = 1e9f;
 
-  private ArrayList<Point> mPoints = new ArrayList<>();
-  private long mStartTimeNano;
-  private long mEndTimeNano;
-  private float mLength;
-  private final float mDpi;
+  private ArrayList<Point> points = new ArrayList<>();
+  private long startTimeNano;
+  private long endTimeNano;
+  private float length;
+  private final float dpi;
 
   public Stroke(long eventTimeNano, float dpi) {
-    mDpi = dpi;
-    mStartTimeNano = mEndTimeNano = eventTimeNano;
+    this.dpi = dpi;
+    startTimeNano = endTimeNano = eventTimeNano;
   }
 
   public void addPoint(float x, float y, long eventTimeNano) {
-    mEndTimeNano = eventTimeNano;
-    Point point = new Point(x / mDpi, y / mDpi, eventTimeNano - mStartTimeNano);
-    if (!mPoints.isEmpty()) {
-      mLength += mPoints.get(mPoints.size() - 1).dist(point);
+    endTimeNano = eventTimeNano;
+    Point point = new Point(x / dpi, y / dpi, eventTimeNano - startTimeNano);
+    if (!points.isEmpty()) {
+      length += points.get(points.size() - 1).dist(point);
     }
-    mPoints.add(point);
+    points.add(point);
   }
 
   public int getCount() {
-    return mPoints.size();
+    return points.size();
   }
 
   public float getTotalLength() {
-    return mLength;
+    return length;
   }
 
   public float getEndPointLength() {
-    return mPoints.get(0).dist(mPoints.get(mPoints.size() - 1));
+    return points.get(0).dist(points.get(points.size() - 1));
   }
 
   public long getDurationNanos() {
-    return mEndTimeNano - mStartTimeNano;
+    return endTimeNano - startTimeNano;
   }
 
   public float getDurationSeconds() {
@@ -67,6 +67,6 @@
   }
 
   public ArrayList<Point> getPoints() {
-    return mPoints;
+    return points;
   }
 }
diff --git a/java/com/android/incallui/answer/impl/utils/FlingAnimationUtils.java b/java/com/android/incallui/answer/impl/utils/FlingAnimationUtils.java
index 3acb2a2..baec308 100644
--- a/java/com/android/incallui/answer/impl/utils/FlingAnimationUtils.java
+++ b/java/com/android/incallui/answer/impl/utils/FlingAnimationUtils.java
@@ -41,7 +41,7 @@
   private float maxLengthSeconds;
   private float highVelocityPxPerSecond;
 
-  private AnimatorProperties mAnimatorProperties = new AnimatorProperties();
+  private AnimatorProperties animatorProperties = new AnimatorProperties();
 
   public FlingAnimationUtils(Context ctx, float maxLengthSeconds) {
     this.maxLengthSeconds = maxLengthSeconds;
@@ -127,23 +127,23 @@
     float velAbs = Math.abs(velocity);
     float durationSeconds = LINEAR_OUT_SLOW_IN_START_GRADIENT * diff / velAbs;
     if (durationSeconds <= maxLengthSeconds) {
-      mAnimatorProperties.interpolator = linearOutSlowIn;
+      animatorProperties.interpolator = linearOutSlowIn;
     } else if (velAbs >= minVelocityPxPerSecond) {
 
       // Cross fade between fast-out-slow-in and linear interpolator with current velocity.
       durationSeconds = maxLengthSeconds;
       VelocityInterpolator velocityInterpolator =
           new VelocityInterpolator(durationSeconds, velAbs, diff);
-      mAnimatorProperties.interpolator =
+      animatorProperties.interpolator =
           new InterpolatorInterpolator(velocityInterpolator, linearOutSlowIn, linearOutSlowIn);
     } else {
 
       // Just use a normal interpolator which doesn't take the velocity into account.
       durationSeconds = maxLengthSeconds;
-      mAnimatorProperties.interpolator = Interpolators.FAST_OUT_SLOW_IN;
+      animatorProperties.interpolator = Interpolators.FAST_OUT_SLOW_IN;
     }
-    mAnimatorProperties.duration = (long) (durationSeconds * 1000);
-    return mAnimatorProperties;
+    animatorProperties.duration = (long) (durationSeconds * 1000);
+    return animatorProperties;
   }
 
   /**
@@ -203,7 +203,7 @@
     Interpolator mLinearOutFasterIn = new PathInterpolator(0, 0, LINEAR_OUT_FASTER_IN_X2, y2);
     float durationSeconds = startGradient * diff / velAbs;
     if (durationSeconds <= maxLengthSeconds) {
-      mAnimatorProperties.interpolator = mLinearOutFasterIn;
+      animatorProperties.interpolator = mLinearOutFasterIn;
     } else if (velAbs >= minVelocityPxPerSecond) {
 
       // Cross fade between linear-out-faster-in and linear interpolator with current
@@ -213,15 +213,15 @@
           new VelocityInterpolator(durationSeconds, velAbs, diff);
       InterpolatorInterpolator superInterpolator =
           new InterpolatorInterpolator(velocityInterpolator, mLinearOutFasterIn, linearOutSlowIn);
-      mAnimatorProperties.interpolator = superInterpolator;
+      animatorProperties.interpolator = superInterpolator;
     } else {
 
       // Just use a normal interpolator which doesn't take the velocity into account.
       durationSeconds = maxLengthSeconds;
-      mAnimatorProperties.interpolator = Interpolators.FAST_OUT_LINEAR_IN;
+      animatorProperties.interpolator = Interpolators.FAST_OUT_LINEAR_IN;
     }
-    mAnimatorProperties.duration = (long) (durationSeconds * 1000);
-    return mAnimatorProperties;
+    animatorProperties.duration = (long) (durationSeconds * 1000);
+    return animatorProperties;
   }
 
   /**
@@ -246,42 +246,42 @@
   /** An interpolator which interpolates two interpolators with an interpolator. */
   private static final class InterpolatorInterpolator implements Interpolator {
 
-    private Interpolator mInterpolator1;
-    private Interpolator mInterpolator2;
-    private Interpolator mCrossfader;
+    private Interpolator interpolator1;
+    private Interpolator interpolator2;
+    private Interpolator crossfader;
 
     InterpolatorInterpolator(
         Interpolator interpolator1, Interpolator interpolator2, Interpolator crossfader) {
-      mInterpolator1 = interpolator1;
-      mInterpolator2 = interpolator2;
-      mCrossfader = crossfader;
+      this.interpolator1 = interpolator1;
+      this.interpolator2 = interpolator2;
+      this.crossfader = crossfader;
     }
 
     @Override
     public float getInterpolation(float input) {
-      float t = mCrossfader.getInterpolation(input);
-      return (1 - t) * mInterpolator1.getInterpolation(input)
-          + t * mInterpolator2.getInterpolation(input);
+      float t = crossfader.getInterpolation(input);
+      return (1 - t) * interpolator1.getInterpolation(input)
+          + t * interpolator2.getInterpolation(input);
     }
   }
 
   /** An interpolator which interpolates with a fixed velocity. */
   private static final class VelocityInterpolator implements Interpolator {
 
-    private float mDurationSeconds;
-    private float mVelocity;
-    private float mDiff;
+    private float durationSeconds;
+    private float velocity;
+    private float diff;
 
     private VelocityInterpolator(float durationSeconds, float velocity, float diff) {
-      mDurationSeconds = durationSeconds;
-      mVelocity = velocity;
-      mDiff = diff;
+      this.durationSeconds = durationSeconds;
+      this.velocity = velocity;
+      this.diff = diff;
     }
 
     @Override
     public float getInterpolation(float input) {
-      float time = input * mDurationSeconds;
-      return time * mVelocity / mDiff;
+      float time = input * durationSeconds;
+      return time * velocity / diff;
     }
   }
 
diff --git a/java/com/android/incallui/baseui/BaseFragment.java b/java/com/android/incallui/baseui/BaseFragment.java
index 58b8c6f..c1b6148 100644
--- a/java/com/android/incallui/baseui/BaseFragment.java
+++ b/java/com/android/incallui/baseui/BaseFragment.java
@@ -24,10 +24,10 @@
 
   private static final String KEY_FRAGMENT_HIDDEN = "key_fragment_hidden";
 
-  private T mPresenter;
+  private T presenter;
 
   protected BaseFragment() {
-    mPresenter = createPresenter();
+    presenter = createPresenter();
   }
 
   public abstract T createPresenter();
@@ -40,20 +40,20 @@
    * @return The presenter associated with this fragment.
    */
   public T getPresenter() {
-    return mPresenter;
+    return presenter;
   }
 
   @Override
   public void onActivityCreated(Bundle savedInstanceState) {
     super.onActivityCreated(savedInstanceState);
-    mPresenter.onUiReady(getUi());
+    presenter.onUiReady(getUi());
   }
 
   @Override
   public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     if (savedInstanceState != null) {
-      mPresenter.onRestoreInstanceState(savedInstanceState);
+      presenter.onRestoreInstanceState(savedInstanceState);
       if (savedInstanceState.getBoolean(KEY_FRAGMENT_HIDDEN)) {
         getFragmentManager().beginTransaction().hide(this).commit();
       }
@@ -63,13 +63,13 @@
   @Override
   public void onDestroyView() {
     super.onDestroyView();
-    mPresenter.onUiDestroy(getUi());
+    presenter.onUiDestroy(getUi());
   }
 
   @Override
   public void onSaveInstanceState(Bundle outState) {
     super.onSaveInstanceState(outState);
-    mPresenter.onSaveInstanceState(outState);
+    presenter.onSaveInstanceState(outState);
     outState.putBoolean(KEY_FRAGMENT_HIDDEN, isHidden());
   }
 }
diff --git a/java/com/android/incallui/baseui/Presenter.java b/java/com/android/incallui/baseui/Presenter.java
index 581ad47..e4df938 100644
--- a/java/com/android/incallui/baseui/Presenter.java
+++ b/java/com/android/incallui/baseui/Presenter.java
@@ -21,7 +21,7 @@
 /** Base class for Presenters. */
 public abstract class Presenter<U extends Ui> {
 
-  private U mUi;
+  private U ui;
 
   /**
    * Called after the UI view has been created. That is when fragment.onViewCreated() is called.
@@ -29,13 +29,13 @@
    * @param ui The Ui implementation that is now ready to be used.
    */
   public void onUiReady(U ui) {
-    mUi = ui;
+    this.ui = ui;
   }
 
   /** Called when the UI view is destroyed in Fragment.onDestroyView(). */
   public final void onUiDestroy(U ui) {
     onUiUnready(ui);
-    mUi = null;
+    this.ui = null;
   }
 
   /**
@@ -49,6 +49,6 @@
   public void onRestoreInstanceState(Bundle savedInstanceState) {}
 
   public U getUi() {
-    return mUi;
+    return ui;
   }
 }
diff --git a/java/com/android/incallui/call/CallList.java b/java/com/android/incallui/call/CallList.java
index 150b20e..e594808 100644
--- a/java/com/android/incallui/call/CallList.java
+++ b/java/com/android/incallui/call/CallList.java
@@ -65,24 +65,24 @@
 
   private static final int EVENT_DISCONNECTED_TIMEOUT = 1;
 
-  private static CallList sInstance = new CallList();
+  private static CallList instance = new CallList();
 
-  private final Map<String, DialerCall> mCallById = new ArrayMap<>();
-  private final Map<android.telecom.Call, DialerCall> mCallByTelecomCall = new ArrayMap<>();
+  private final Map<String, DialerCall> callById = new ArrayMap<>();
+  private final Map<android.telecom.Call, DialerCall> callByTelecomCall = new ArrayMap<>();
 
   /**
    * ConcurrentHashMap constructor params: 8 is initial table size, 0.9f is load factor before
    * resizing, 1 means we only expect a single thread to access the map so make only a single shard
    */
-  private final Set<Listener> mListeners =
+  private final Set<Listener> listeners =
       Collections.newSetFromMap(new ConcurrentHashMap<Listener, Boolean>(8, 0.9f, 1));
 
-  private final Set<DialerCall> mPendingDisconnectCalls =
+  private final Set<DialerCall> pendingDisconnectCalls =
       Collections.newSetFromMap(new ConcurrentHashMap<DialerCall, Boolean>(8, 0.9f, 1));
 
-  private UiListener mUiListeners;
+  private UiListener uiListeners;
   /** Handles the timeout for destroying disconnected calls. */
-  private final Handler mHandler =
+  private final Handler handler =
       new Handler() {
         @Override
         public void handleMessage(Message msg) {
@@ -107,12 +107,12 @@
 
   @VisibleForTesting
   public static void setCallListInstance(CallList callList) {
-    sInstance = callList;
+    instance = callList;
   }
 
   /** Static singleton accessor method. */
   public static CallList getInstance() {
-    return sInstance;
+    return instance;
   }
 
   public void onCallAdded(
@@ -125,8 +125,8 @@
       Logger.get(context)
           .logStartLatencyTimer(LoggingBindings.ON_CALL_ADDED_TO_ON_INCALL_UI_SHOWN_INCOMING);
     }
-    if (mUiListeners != null) {
-      mUiListeners.onCallAdded();
+    if (uiListeners != null) {
+      uiListeners.onCallAdded();
     }
     final DialerCall call =
         new DialerCall(context, this, telecomCall, latencyReport, true /* registerCallback */);
@@ -257,7 +257,7 @@
 
   @Override
   public DialerCall getDialerCallFromTelecomCall(Call telecomCall) {
-    return mCallByTelecomCall.get(telecomCall);
+    return callByTelecomCall.get(telecomCall);
   }
 
   private void updateUserMarkedSpamStatus(
@@ -301,8 +301,8 @@
   }
 
   public void onCallRemoved(Context context, android.telecom.Call telecomCall) {
-    if (mCallByTelecomCall.containsKey(telecomCall)) {
-      DialerCall call = mCallByTelecomCall.get(telecomCall);
+    if (callByTelecomCall.containsKey(telecomCall)) {
+      DialerCall call = callByTelecomCall.get(telecomCall);
       Assert.checkArgument(!call.isExternalCall());
 
       EnrichedCallManager manager = EnrichedCallComponent.get(context).getEnrichedCallManager();
@@ -352,8 +352,8 @@
    */
   public void onInternalCallMadeExternal(Context context, android.telecom.Call telecomCall) {
 
-    if (mCallByTelecomCall.containsKey(telecomCall)) {
-      DialerCall call = mCallByTelecomCall.get(telecomCall);
+    if (callByTelecomCall.containsKey(telecomCall)) {
+      DialerCall call = callByTelecomCall.get(telecomCall);
 
       // Don't log an already logged call. logCall() might be called multiple times
       // for the same call due to a bug.
@@ -367,8 +367,8 @@
       // However, the call won't be disconnected in this case.  Also, logic in updateCallInMap
       // would just re-add the call anyways.
       call.unregisterCallback();
-      mCallById.remove(call.getId());
-      mCallByTelecomCall.remove(telecomCall);
+      callById.remove(call.getId());
+      callByTelecomCall.remove(telecomCall);
     }
   }
 
@@ -379,7 +379,7 @@
       LogUtil.i("CallList.onIncoming", String.valueOf(call));
     }
 
-    for (Listener listener : mListeners) {
+    for (Listener listener : listeners) {
       listener.onIncomingCall(call);
     }
     Trace.endSection();
@@ -388,19 +388,19 @@
   public void addListener(@NonNull Listener listener) {
     Objects.requireNonNull(listener);
 
-    mListeners.add(listener);
+    listeners.add(listener);
 
     // Let the listener know about the active calls immediately.
     listener.onCallListChange(this);
   }
 
   public void setUiListener(UiListener uiListener) {
-    mUiListeners = uiListener;
+    uiListeners = uiListener;
   }
 
   public void removeListener(@Nullable Listener listener) {
     if (listener != null) {
-      mListeners.remove(listener);
+      listeners.remove(listener);
     }
   }
 
@@ -517,7 +517,7 @@
    * @return The first call with the upgrade to video state.
    */
   public DialerCall getVideoUpgradeRequestCall() {
-    for (DialerCall call : mCallById.values()) {
+    for (DialerCall call : callById.values()) {
       if (call.getVideoTech().getSessionModificationState()
           == SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST) {
         return call;
@@ -527,11 +527,11 @@
   }
 
   public DialerCall getCallById(String callId) {
-    return mCallById.get(callId);
+    return callById.get(callId);
   }
 
   public Collection<DialerCall> getAllCalls() {
-    return mCallById.values();
+    return callById.values();
   }
 
   /** Returns first call found in the call map with the specified state. */
@@ -546,7 +546,7 @@
   public DialerCall getCallWithState(int state, int positionToFind) {
     DialerCall retval = null;
     int position = 0;
-    for (DialerCall call : mCallById.values()) {
+    for (DialerCall call : callById.values()) {
       if (call.getState() == state) {
         if (position >= positionToFind) {
           retval = call;
@@ -565,7 +565,7 @@
    * call)
    */
   public boolean hasNonParentActiveOrBackgroundCall() {
-    for (DialerCall call : mCallById.values()) {
+    for (DialerCall call : callById.values()) {
       if ((call.getState() == State.ACTIVE
               || call.getState() == State.ONHOLD
               || call.getState() == State.CONFERENCED)
@@ -583,7 +583,7 @@
    * active calls, so this is relatively safe thing to do.
    */
   public void clearOnDisconnect() {
-    for (DialerCall call : mCallById.values()) {
+    for (DialerCall call : callById.values()) {
       final int state = call.getState();
       if (state != DialerCall.State.IDLE
           && state != DialerCall.State.INVALID
@@ -602,7 +602,7 @@
    * disconnect cause, and that any pending disconnects should immediately occur.
    */
   public void onErrorDialogDismissed() {
-    final Iterator<DialerCall> iterator = mPendingDisconnectCalls.iterator();
+    final Iterator<DialerCall> iterator = pendingDisconnectCalls.iterator();
     while (iterator.hasNext()) {
       DialerCall call = iterator.next();
       iterator.remove();
@@ -619,7 +619,7 @@
   void onUpdateCall(DialerCall call) {
     Trace.beginSection("CallList.onUpdateCall");
     LogUtil.d("CallList.onUpdateCall", String.valueOf(call));
-    if (!mCallById.containsKey(call.getId()) && call.isExternalCall()) {
+    if (!callById.containsKey(call.getId()) && call.isExternalCall()) {
       // When a regular call becomes external, it is removed from the call list, and there may be
       // pending updates to Telecom which are queued up on the Telecom call's handler which we no
       // longer wish to cause updates to the call in the CallList.  Bail here if the list of tracked
@@ -639,14 +639,14 @@
    */
   private void notifyGenericListeners() {
     Trace.beginSection("CallList.notifyGenericListeners");
-    for (Listener listener : mListeners) {
+    for (Listener listener : listeners) {
       listener.onCallListChange(this);
     }
     Trace.endSection();
   }
 
   private void notifyListenersOfDisconnect(DialerCall call) {
-    for (Listener listener : mListeners) {
+    for (Listener listener : listeners) {
       listener.onDisconnect(call);
     }
   }
@@ -664,26 +664,26 @@
 
     if (call.getState() == DialerCall.State.DISCONNECTED) {
       // update existing (but do not add!!) disconnected calls
-      if (mCallById.containsKey(call.getId())) {
+      if (callById.containsKey(call.getId())) {
         // For disconnected calls, we want to keep them alive for a few seconds so that the
         // UI has a chance to display anything it needs when a call is disconnected.
 
         // Set up a timer to destroy the call after X seconds.
-        final Message msg = mHandler.obtainMessage(EVENT_DISCONNECTED_TIMEOUT, call);
-        mHandler.sendMessageDelayed(msg, getDelayForDisconnect(call));
-        mPendingDisconnectCalls.add(call);
+        final Message msg = handler.obtainMessage(EVENT_DISCONNECTED_TIMEOUT, call);
+        handler.sendMessageDelayed(msg, getDelayForDisconnect(call));
+        pendingDisconnectCalls.add(call);
 
-        mCallById.put(call.getId(), call);
-        mCallByTelecomCall.put(call.getTelecomCall(), call);
+        callById.put(call.getId(), call);
+        callByTelecomCall.put(call.getTelecomCall(), call);
         updated = true;
       }
     } else if (!isCallDead(call)) {
-      mCallById.put(call.getId(), call);
-      mCallByTelecomCall.put(call.getTelecomCall(), call);
+      callById.put(call.getId(), call);
+      callByTelecomCall.put(call.getTelecomCall(), call);
       updated = true;
-    } else if (mCallById.containsKey(call.getId())) {
-      mCallById.remove(call.getId());
-      mCallByTelecomCall.remove(call.getTelecomCall());
+    } else if (callById.containsKey(call.getId())) {
+      callById.remove(call.getId());
+      callByTelecomCall.remove(call.getTelecomCall());
       updated = true;
     }
 
@@ -727,8 +727,8 @@
 
   /** Sets up a call for deletion and notifies listeners of change. */
   private void finishDisconnectedCall(DialerCall call) {
-    if (mPendingDisconnectCalls.contains(call)) {
-      mPendingDisconnectCalls.remove(call);
+    if (pendingDisconnectCalls.contains(call)) {
+      pendingDisconnectCalls.remove(call);
     }
     call.setState(DialerCall.State.IDLE);
     updateCallInMap(call);
@@ -741,17 +741,17 @@
    * @param rotation The new rotation angle (in degrees).
    */
   public void notifyCallsOfDeviceRotation(int rotation) {
-    for (DialerCall call : mCallById.values()) {
+    for (DialerCall call : callById.values()) {
       call.getVideoTech().setDeviceOrientation(rotation);
     }
   }
 
   public void onInCallUiShown(boolean forFullScreenIntent) {
-    for (DialerCall call : mCallById.values()) {
+    for (DialerCall call : callById.values()) {
       call.getLatencyReport().onInCallUiShown(forFullScreenIntent);
     }
-    if (mUiListeners != null) {
-      mUiListeners.onInCallUiShown();
+    if (uiListeners != null) {
+      uiListeners.onInCallUiShown();
     }
   }
 
@@ -813,25 +813,25 @@
 
   private class DialerCallListenerImpl implements DialerCallListener {
 
-    @NonNull private final DialerCall mCall;
+    @NonNull private final DialerCall call;
 
     DialerCallListenerImpl(@NonNull DialerCall call) {
-      mCall = Assert.isNotNull(call);
+      this.call = Assert.isNotNull(call);
     }
 
     @Override
     public void onDialerCallDisconnect() {
-      if (updateCallInMap(mCall)) {
-        LogUtil.i("DialerCallListenerImpl.onDialerCallDisconnect", String.valueOf(mCall));
+      if (updateCallInMap(call)) {
+        LogUtil.i("DialerCallListenerImpl.onDialerCallDisconnect", String.valueOf(call));
         // notify those listening for all disconnects
-        notifyListenersOfDisconnect(mCall);
+        notifyListenersOfDisconnect(call);
       }
     }
 
     @Override
     public void onDialerCallUpdate() {
       Trace.beginSection("CallList.onDialerCallUpdate");
-      onUpdateCall(mCall);
+      onUpdateCall(call);
       notifyGenericListeners();
       Trace.endSection();
     }
@@ -844,30 +844,30 @@
 
     @Override
     public void onDialerCallUpgradeToVideo() {
-      for (Listener listener : mListeners) {
-        listener.onUpgradeToVideo(mCall);
+      for (Listener listener : listeners) {
+        listener.onUpgradeToVideo(call);
       }
     }
 
     @Override
     public void onWiFiToLteHandover() {
-      for (Listener listener : mListeners) {
-        listener.onWiFiToLteHandover(mCall);
+      for (Listener listener : listeners) {
+        listener.onWiFiToLteHandover(call);
       }
     }
 
     @Override
     public void onHandoverToWifiFailure() {
-      for (Listener listener : mListeners) {
-        listener.onHandoverToWifiFailed(mCall);
+      for (Listener listener : listeners) {
+        listener.onHandoverToWifiFailed(call);
       }
     }
 
     @Override
     public void onInternationalCallOnWifi() {
       LogUtil.enterBlock("DialerCallListenerImpl.onInternationalCallOnWifi");
-      for (Listener listener : mListeners) {
-        listener.onInternationalCallOnWifi(mCall);
+      for (Listener listener : listeners) {
+        listener.onInternationalCallOnWifi(call);
       }
     }
 
@@ -876,8 +876,8 @@
 
     @Override
     public void onDialerCallSessionModificationStateChange() {
-      for (Listener listener : mListeners) {
-        listener.onSessionModificationStateChange(mCall);
+      for (Listener listener : listeners) {
+        listener.onSessionModificationStateChange(call);
       }
     }
   }
diff --git a/java/com/android/incallui/call/DialerCall.java b/java/com/android/incallui/call/DialerCall.java
index 94c79e9..543cc3f 100644
--- a/java/com/android/incallui/call/DialerCall.java
+++ b/java/com/android/incallui/call/DialerCall.java
@@ -102,14 +102,14 @@
   private static final String ID_PREFIX = "DialerCall_";
   private static final String CONFIG_EMERGENCY_CALLBACK_WINDOW_MILLIS =
       "emergency_callback_window_millis";
-  private static int sIdCounter = 0;
+  private static int idCounter = 0;
 
   /**
    * A counter used to append to restricted/private/hidden calls so that users can identify them in
    * a conversation. This value is reset in {@link CallList#onCallRemoved(Context, Call)} when there
    * are no live calls.
    */
-  private static int sHiddenCounter;
+  private static int hiddenCounter;
 
   /**
    * The unique call ID for every call. This will help us to identify each call and allow us the
@@ -117,34 +117,34 @@
    */
   private final String uniqueCallId = UUID.randomUUID().toString();
 
-  private final Call mTelecomCall;
-  private final LatencyReport mLatencyReport;
-  private final String mId;
-  private final int mHiddenId;
-  private final List<String> mChildCallIds = new ArrayList<>();
-  private final LogState mLogState = new LogState();
-  private final Context mContext;
-  private final DialerCallDelegate mDialerCallDelegate;
-  private final List<DialerCallListener> mListeners = new CopyOnWriteArrayList<>();
-  private final List<CannedTextResponsesLoadedListener> mCannedTextResponsesLoadedListeners =
+  private final Call telecomCall;
+  private final LatencyReport latencyReport;
+  private final String id;
+  private final int hiddenId;
+  private final List<String> childCallIds = new ArrayList<>();
+  private final LogState logState = new LogState();
+  private final Context context;
+  private final DialerCallDelegate dialerCallDelegate;
+  private final List<DialerCallListener> listeners = new CopyOnWriteArrayList<>();
+  private final List<CannedTextResponsesLoadedListener> cannedTextResponsesLoadedListeners =
       new CopyOnWriteArrayList<>();
-  private final VideoTechManager mVideoTechManager;
+  private final VideoTechManager videoTechManager;
 
-  private boolean mIsEmergencyCall;
-  private Uri mHandle;
-  private int mState = State.INVALID;
-  private DisconnectCause mDisconnectCause;
+  private boolean isEmergencyCall;
+  private Uri handle;
+  private int state = State.INVALID;
+  private DisconnectCause disconnectCause;
 
   private boolean hasShownWiFiToLteHandoverToast;
   private boolean doNotShowDialogForHandoffToWifiFailure;
 
-  private String mChildNumber;
-  private String mLastForwardedNumber;
-  private String mCallSubject;
-  private PhoneAccountHandle mPhoneAccountHandle;
-  @CallHistoryStatus private int mCallHistoryStatus = CALL_HISTORY_STATUS_UNKNOWN;
-  private boolean mIsSpam;
-  private boolean mIsBlocked;
+  private String childNumber;
+  private String lastForwardedNumber;
+  private String callSubject;
+  private PhoneAccountHandle phoneAccountHandle;
+  @CallHistoryStatus private int callHistoryStatus = CALL_HISTORY_STATUS_UNKNOWN;
+  private boolean isSpam;
+  private boolean isBlocked;
 
   @Nullable private Boolean isInUserSpamList;
 
@@ -154,9 +154,9 @@
   private boolean didShowCameraPermission;
   private String callProviderLabel;
   private String callbackNumber;
-  private int mCameraDirection = CameraDirection.CAMERA_DIRECTION_UNKNOWN;
-  private EnrichedCallCapabilities mEnrichedCallCapabilities;
-  private Session mEnrichedCallSession;
+  private int cameraDirection = CameraDirection.CAMERA_DIRECTION_UNKNOWN;
+  private EnrichedCallCapabilities enrichedCallCapabilities;
+  private Session enrichedCallSession;
 
   private int answerAndReleaseButtonDisplayedTimes = 0;
   private boolean releasedByAnsweringSecondCall = false;
@@ -188,9 +188,9 @@
    * Indicates whether the phone account associated with this call supports specifying a call
    * subject.
    */
-  private boolean mIsCallSubjectSupported;
+  private boolean isCallSubjectSupported;
 
-  private final Call.Callback mTelecomCallCallback =
+  private final Call.Callback telecomCallCallback =
       new Call.Callback() {
         @Override
         public void onStateChanged(Call call, int newState) {
@@ -222,7 +222,7 @@
           LogUtil.v(
               "TelecomCallCallback.onCannedTextResponsesLoaded",
               "call=" + call + " cannedTextResponses=" + cannedTextResponses);
-          for (CannedTextResponsesLoadedListener listener : mCannedTextResponsesLoadedListeners) {
+          for (CannedTextResponsesLoadedListener listener : cannedTextResponsesLoadedListeners) {
             listener.onCannedTextResponsesLoaded(DialerCall.this);
           }
         }
@@ -301,7 +301,7 @@
         }
       };
 
-  private long mTimeAddedMs;
+  private long timeAddedMs;
 
   public DialerCall(
       Context context,
@@ -310,27 +310,27 @@
       LatencyReport latencyReport,
       boolean registerCallback) {
     Assert.isNotNull(context);
-    mContext = context;
-    mDialerCallDelegate = dialerCallDelegate;
-    mTelecomCall = telecomCall;
-    mLatencyReport = latencyReport;
-    mId = ID_PREFIX + Integer.toString(sIdCounter++);
+    this.context = context;
+    this.dialerCallDelegate = dialerCallDelegate;
+    this.telecomCall = telecomCall;
+    this.latencyReport = latencyReport;
+    id = ID_PREFIX + Integer.toString(idCounter++);
 
     // Must be after assigning mTelecomCall
-    mVideoTechManager = new VideoTechManager(this);
+    videoTechManager = new VideoTechManager(this);
 
     updateFromTelecomCall();
     if (isHiddenNumber() && TextUtils.isEmpty(getNumber())) {
-      mHiddenId = ++sHiddenCounter;
+      hiddenId = ++hiddenCounter;
     } else {
-      mHiddenId = 0;
+      hiddenId = 0;
     }
 
     if (registerCallback) {
-      mTelecomCall.registerCallback(mTelecomCallCallback);
+      this.telecomCall.registerCallback(telecomCallCallback);
     }
 
-    mTimeAddedMs = System.currentTimeMillis();
+    timeAddedMs = System.currentTimeMillis();
     parseCallSpecificAppData();
 
     updateEnrichedCallSession();
@@ -339,13 +339,13 @@
   /** Test only constructor to avoid initializing dependencies. */
   @VisibleForTesting
   DialerCall(Context context) {
-    mContext = context;
-    mTelecomCall = null;
-    mLatencyReport = null;
-    mId = null;
-    mHiddenId = 0;
-    mDialerCallDelegate = null;
-    mVideoTechManager = null;
+    this.context = context;
+    telecomCall = null;
+    latencyReport = null;
+    id = null;
+    hiddenId = 0;
+    dialerCallDelegate = null;
+    videoTechManager = null;
   }
 
   private static int translateState(int state) {
@@ -398,68 +398,68 @@
 
   public void addListener(DialerCallListener listener) {
     Assert.isMainThread();
-    mListeners.add(listener);
+    listeners.add(listener);
   }
 
   public void removeListener(DialerCallListener listener) {
     Assert.isMainThread();
-    mListeners.remove(listener);
+    listeners.remove(listener);
   }
 
   public void addCannedTextResponsesLoadedListener(CannedTextResponsesLoadedListener listener) {
     Assert.isMainThread();
-    mCannedTextResponsesLoadedListeners.add(listener);
+    cannedTextResponsesLoadedListeners.add(listener);
   }
 
   public void removeCannedTextResponsesLoadedListener(CannedTextResponsesLoadedListener listener) {
     Assert.isMainThread();
-    mCannedTextResponsesLoadedListeners.remove(listener);
+    cannedTextResponsesLoadedListeners.remove(listener);
   }
 
   public void notifyWiFiToLteHandover() {
     LogUtil.i("DialerCall.notifyWiFiToLteHandover", "");
-    for (DialerCallListener listener : mListeners) {
+    for (DialerCallListener listener : listeners) {
       listener.onWiFiToLteHandover();
     }
   }
 
   public void notifyHandoverToWifiFailed() {
     LogUtil.i("DialerCall.notifyHandoverToWifiFailed", "");
-    for (DialerCallListener listener : mListeners) {
+    for (DialerCallListener listener : listeners) {
       listener.onHandoverToWifiFailure();
     }
   }
 
   public void notifyInternationalCallOnWifi() {
     LogUtil.enterBlock("DialerCall.notifyInternationalCallOnWifi");
-    for (DialerCallListener dialerCallListener : mListeners) {
+    for (DialerCallListener dialerCallListener : listeners) {
       dialerCallListener.onInternationalCallOnWifi();
     }
   }
 
   /* package-private */ Call getTelecomCall() {
-    return mTelecomCall;
+    return telecomCall;
   }
 
   public StatusHints getStatusHints() {
-    return mTelecomCall.getDetails().getStatusHints();
+    return telecomCall.getDetails().getStatusHints();
   }
 
   public int getCameraDir() {
-    return mCameraDirection;
+    return cameraDirection;
   }
 
   public void setCameraDir(int cameraDir) {
     if (cameraDir == CameraDirection.CAMERA_DIRECTION_FRONT_FACING
         || cameraDir == CameraDirection.CAMERA_DIRECTION_BACK_FACING) {
-      mCameraDirection = cameraDir;
+      cameraDirection = cameraDir;
     } else {
-      mCameraDirection = CameraDirection.CAMERA_DIRECTION_UNKNOWN;
+      cameraDirection = CameraDirection.CAMERA_DIRECTION_UNKNOWN;
     }
   }
 
   public boolean wasParentCall() {
-    return mLogState.conferencedCalls != 0;
+    return logState.conferencedCalls != 0;
   }
 
   public boolean isVoiceMailNumber() {
@@ -479,11 +479,11 @@
       isVoicemailNumber = true;
     }
 
-    if (!PermissionsUtil.hasPermission(mContext, permission.READ_PHONE_STATE)) {
+    if (!PermissionsUtil.hasPermission(context, permission.READ_PHONE_STATE)) {
       isVoicemailNumber = false;
     }
 
-    isVoicemailNumber = TelecomUtil.isVoicemailNumber(mContext, getAccountHandle(), getNumber());
+    isVoicemailNumber = TelecomUtil.isVoicemailNumber(context, getAccountHandle(), getNumber());
   }
 
   private void update() {
@@ -494,17 +494,17 @@
     // We want to potentially register a video call callback here.
     updateFromTelecomCall();
     if (oldState != getState() && getState() == DialerCall.State.DISCONNECTED) {
-      for (DialerCallListener listener : mListeners) {
+      for (DialerCallListener listener : listeners) {
         listener.onDialerCallDisconnect();
       }
-      EnrichedCallComponent.get(mContext)
+      EnrichedCallComponent.get(context)
           .getEnrichedCallManager()
           .unregisterCapabilitiesListener(this);
-      EnrichedCallComponent.get(mContext)
+      EnrichedCallComponent.get(context)
           .getEnrichedCallManager()
           .unregisterStateChangedListener(this);
     } else {
-      for (DialerCallListener listener : mListeners) {
+      for (DialerCallListener listener : listeners) {
         listener.onDialerCallUpdate();
       }
     }
@@ -514,58 +514,58 @@
   @SuppressWarnings("MissingPermission")
   private void updateFromTelecomCall() {
     Trace.beginSection("DialerCall.updateFromTelecomCall");
-    LogUtil.v("DialerCall.updateFromTelecomCall", mTelecomCall.toString());
+    LogUtil.v("DialerCall.updateFromTelecomCall", telecomCall.toString());
 
-    mVideoTechManager.dispatchCallStateChanged(mTelecomCall.getState());
+    videoTechManager.dispatchCallStateChanged(telecomCall.getState());
 
-    final int translatedState = translateState(mTelecomCall.getState());
-    if (mState != State.BLOCKED) {
+    final int translatedState = translateState(telecomCall.getState());
+    if (state != State.BLOCKED) {
       setState(translatedState);
-      setDisconnectCause(mTelecomCall.getDetails().getDisconnectCause());
+      setDisconnectCause(telecomCall.getDetails().getDisconnectCause());
     }
 
-    mChildCallIds.clear();
-    final int numChildCalls = mTelecomCall.getChildren().size();
+    childCallIds.clear();
+    final int numChildCalls = telecomCall.getChildren().size();
     for (int i = 0; i < numChildCalls; i++) {
-      mChildCallIds.add(
-          mDialerCallDelegate
-              .getDialerCallFromTelecomCall(mTelecomCall.getChildren().get(i))
+      childCallIds.add(
+          dialerCallDelegate
+              .getDialerCallFromTelecomCall(telecomCall.getChildren().get(i))
               .getId());
     }
 
     // The number of conferenced calls can change over the course of the call, so use the
     // maximum number of conferenced child calls as the metric for conference call usage.
-    mLogState.conferencedCalls = Math.max(numChildCalls, mLogState.conferencedCalls);
+    logState.conferencedCalls = Math.max(numChildCalls, logState.conferencedCalls);
 
-    updateFromCallExtras(mTelecomCall.getDetails().getExtras());
+    updateFromCallExtras(telecomCall.getDetails().getExtras());
 
     // If the handle of the call has changed, update state for the call determining if it is an
     // emergency call.
-    Uri newHandle = mTelecomCall.getDetails().getHandle();
-    if (!Objects.equals(mHandle, newHandle)) {
-      mHandle = newHandle;
+    Uri newHandle = telecomCall.getDetails().getHandle();
+    if (!Objects.equals(handle, newHandle)) {
+      handle = newHandle;
       updateEmergencyCallState();
     }
 
-    TelecomManager telecomManager = mContext.getSystemService(TelecomManager.class);
+    TelecomManager telecomManager = context.getSystemService(TelecomManager.class);
     // If the phone account handle of the call is set, cache capability bit indicating whether
     // the phone account supports call subjects.
-    PhoneAccountHandle newPhoneAccountHandle = mTelecomCall.getDetails().getAccountHandle();
-    if (!Objects.equals(mPhoneAccountHandle, newPhoneAccountHandle)) {
-      mPhoneAccountHandle = newPhoneAccountHandle;
+    PhoneAccountHandle newPhoneAccountHandle = telecomCall.getDetails().getAccountHandle();
+    if (!Objects.equals(phoneAccountHandle, newPhoneAccountHandle)) {
+      phoneAccountHandle = newPhoneAccountHandle;
 
-      if (mPhoneAccountHandle != null) {
-        PhoneAccount phoneAccount = telecomManager.getPhoneAccount(mPhoneAccountHandle);
+      if (phoneAccountHandle != null) {
+        PhoneAccount phoneAccount = telecomManager.getPhoneAccount(phoneAccountHandle);
         if (phoneAccount != null) {
-          mIsCallSubjectSupported =
+          isCallSubjectSupported =
               phoneAccount.hasCapabilities(PhoneAccount.CAPABILITY_CALL_SUBJECT);
         }
       }
     }
-    if (PermissionsUtil.hasPermission(mContext, permission.READ_PHONE_STATE)) {
+    if (PermissionsUtil.hasPermission(context, permission.READ_PHONE_STATE)) {
       updateIsVoiceMailNumber();
       callCapableAccounts = telecomManager.getCallCapablePhoneAccounts();
-      countryIso = GeoUtil.getCurrentCountryIso(mContext);
+      countryIso = GeoUtil.getCurrentCountryIso(context);
     }
     Trace.endSection();
   }
@@ -605,9 +605,9 @@
     // Check for a change in the child address and notify any listeners.
     if (callExtras.containsKey(Connection.EXTRA_CHILD_ADDRESS)) {
       String childNumber = callExtras.getString(Connection.EXTRA_CHILD_ADDRESS);
-      if (!Objects.equals(childNumber, mChildNumber)) {
-        mChildNumber = childNumber;
-        for (DialerCallListener listener : mListeners) {
+      if (!Objects.equals(childNumber, this.childNumber)) {
+        this.childNumber = childNumber;
+        for (DialerCallListener listener : listeners) {
           listener.onDialerCallChildNumberChange();
         }
       }
@@ -626,9 +626,9 @@
           lastForwardedNumber = lastForwardedNumbers.get(lastForwardedNumbers.size() - 1);
         }
 
-        if (!Objects.equals(lastForwardedNumber, mLastForwardedNumber)) {
-          mLastForwardedNumber = lastForwardedNumber;
-          for (DialerCallListener listener : mListeners) {
+        if (!Objects.equals(lastForwardedNumber, this.lastForwardedNumber)) {
+          this.lastForwardedNumber = lastForwardedNumber;
+          for (DialerCallListener listener : listeners) {
             listener.onDialerCallLastForwardedNumberChange();
           }
         }
@@ -639,14 +639,14 @@
     // notify any other listeners of this.
     if (callExtras.containsKey(Connection.EXTRA_CALL_SUBJECT)) {
       String callSubject = callExtras.getString(Connection.EXTRA_CALL_SUBJECT);
-      if (!Objects.equals(mCallSubject, callSubject)) {
-        mCallSubject = callSubject;
+      if (!Objects.equals(this.callSubject, callSubject)) {
+        this.callSubject = callSubject;
       }
     }
   }
 
   public String getId() {
-    return mId;
+    return id;
   }
 
   /**
@@ -655,14 +655,14 @@
    */
   @Nullable
   public String updateNameIfRestricted(@Nullable String name) {
-    if (name != null && isHiddenNumber() && mHiddenId != 0 && sHiddenCounter > 1) {
-      return mContext.getString(R.string.unknown_counter, name, mHiddenId);
+    if (name != null && isHiddenNumber() && hiddenId != 0 && hiddenCounter > 1) {
+      return context.getString(R.string.unknown_counter, name, hiddenId);
     }
     return name;
   }
 
   public static void clearRestrictedCount() {
-    sHiddenCounter = 0;
+    hiddenCounter = 0;
   }
 
   private boolean isHiddenNumber() {
@@ -687,26 +687,26 @@
   }
 
   public long getTimeAddedMs() {
-    return mTimeAddedMs;
+    return timeAddedMs;
   }
 
   @Nullable
   public String getNumber() {
-    return TelecomCallUtil.getNumber(mTelecomCall);
+    return TelecomCallUtil.getNumber(telecomCall);
   }
 
   public void blockCall() {
-    mTelecomCall.reject(false, null);
+    telecomCall.reject(false, null);
     setState(State.BLOCKED);
   }
 
   @Nullable
   public Uri getHandle() {
-    return mTelecomCall == null ? null : mTelecomCall.getDetails().getHandle();
+    return telecomCall == null ? null : telecomCall.getDetails().getHandle();
   }
 
   public boolean isEmergencyCall() {
-    return mIsEmergencyCall;
+    return isEmergencyCall;
   }
 
   public boolean isPotentialEmergencyCallback() {
@@ -731,78 +731,78 @@
 
   boolean isInEmergencyCallbackWindow(long timestampMillis) {
     long emergencyCallbackWindowMillis =
-        ConfigProviderBindings.get(mContext)
+        ConfigProviderBindings.get(context)
             .getLong(CONFIG_EMERGENCY_CALLBACK_WINDOW_MILLIS, TimeUnit.MINUTES.toMillis(5));
     return System.currentTimeMillis() - timestampMillis < emergencyCallbackWindowMillis;
   }
 
   public int getState() {
-    if (mTelecomCall != null && mTelecomCall.getParent() != null) {
+    if (telecomCall != null && telecomCall.getParent() != null) {
       return State.CONFERENCED;
     } else {
-      return mState;
+      return state;
     }
   }
 
   public int getNonConferenceState() {
-    return mState;
+    return state;
   }
 
   public void setState(int state) {
     if (state == State.INCOMING) {
-      mLogState.isIncoming = true;
+      logState.isIncoming = true;
     } else if (state == State.DISCONNECTED) {
       long newDuration =
           getConnectTimeMillis() == 0 ? 0 : System.currentTimeMillis() - getConnectTimeMillis();
-      if (mState != state) {
-        mLogState.duration = newDuration;
+      if (this.state != state) {
+        logState.duration = newDuration;
       } else {
         LogUtil.i(
             "DialerCall.setState",
             "ignoring state transition from DISCONNECTED to DISCONNECTED."
                 + " Duration would have changed from %s to %s",
-            mLogState.duration,
+            logState.duration,
             newDuration);
       }
     }
-    mState = state;
+    this.state = state;
   }
 
   public int getNumberPresentation() {
-    return mTelecomCall == null ? -1 : mTelecomCall.getDetails().getHandlePresentation();
+    return telecomCall == null ? -1 : telecomCall.getDetails().getHandlePresentation();
   }
 
   public int getCnapNamePresentation() {
-    return mTelecomCall == null ? -1 : mTelecomCall.getDetails().getCallerDisplayNamePresentation();
+    return telecomCall == null ? -1 : telecomCall.getDetails().getCallerDisplayNamePresentation();
   }
 
   @Nullable
   public String getCnapName() {
-    return mTelecomCall == null ? null : getTelecomCall().getDetails().getCallerDisplayName();
+    return telecomCall == null ? null : getTelecomCall().getDetails().getCallerDisplayName();
   }
 
   public Bundle getIntentExtras() {
-    return mTelecomCall.getDetails().getIntentExtras();
+    return telecomCall.getDetails().getIntentExtras();
   }
 
   @Nullable
   public Bundle getExtras() {
-    return mTelecomCall == null ? null : mTelecomCall.getDetails().getExtras();
+    return telecomCall == null ? null : telecomCall.getDetails().getExtras();
   }
 
   /** @return The child number for the call, or {@code null} if none specified. */
   public String getChildNumber() {
-    return mChildNumber;
+    return childNumber;
   }
 
   /** @return The last forwarded number for the call, or {@code null} if none specified. */
   public String getLastForwardedNumber() {
-    return mLastForwardedNumber;
+    return lastForwardedNumber;
   }
 
   /** @return The call subject, or {@code null} if none specified. */
   public String getCallSubject() {
-    return mCallSubject;
+    return callSubject;
   }
 
   /**
@@ -810,36 +810,36 @@
    *     otherwise.
    */
   public boolean isCallSubjectSupported() {
-    return mIsCallSubjectSupported;
+    return isCallSubjectSupported;
   }
 
   /** Returns call disconnect cause, defined by {@link DisconnectCause}. */
   public DisconnectCause getDisconnectCause() {
-    if (mState == State.DISCONNECTED || mState == State.IDLE) {
-      return mDisconnectCause;
+    if (state == State.DISCONNECTED || state == State.IDLE) {
+      return disconnectCause;
     }
 
     return new DisconnectCause(DisconnectCause.UNKNOWN);
   }
 
   public void setDisconnectCause(DisconnectCause disconnectCause) {
-    mDisconnectCause = disconnectCause;
-    mLogState.disconnectCause = mDisconnectCause;
+    this.disconnectCause = disconnectCause;
+    logState.disconnectCause = this.disconnectCause;
   }
 
   /** Returns the possible text message responses. */
   public List<String> getCannedSmsResponses() {
-    return mTelecomCall.getCannedTextResponses();
+    return telecomCall.getCannedTextResponses();
   }
 
   /** Checks if the call supports the given set of capabilities supplied as a bit mask. */
   public boolean can(int capabilities) {
-    int supportedCapabilities = mTelecomCall.getDetails().getCallCapabilities();
+    int supportedCapabilities = telecomCall.getDetails().getCallCapabilities();
 
     if ((capabilities & Call.Details.CAPABILITY_MERGE_CONFERENCE) != 0) {
       // We allow you to merge if the capabilities allow it or if it is a call with
       // conferenceable calls.
-      if (mTelecomCall.getConferenceableCalls().isEmpty()
+      if (telecomCall.getConferenceableCalls().isEmpty()
           && ((Call.Details.CAPABILITY_MERGE_CONFERENCE & supportedCapabilities) == 0)) {
         // Cannot merge calls if there are no calls to merge with.
         return false;
@@ -850,7 +850,7 @@
   }
 
   public boolean hasProperty(int property) {
-    return mTelecomCall.getDetails().hasProperty(property);
+    return telecomCall.getDetails().hasProperty(property);
   }
 
   @NonNull
@@ -860,7 +860,7 @@
 
   /** Gets the time when the call first became active. */
   public long getConnectTimeMillis() {
-    return mTelecomCall.getDetails().getConnectTimeMillis();
+    return telecomCall.getDetails().getConnectTimeMillis();
   }
 
   public boolean isConferenceCall() {
@@ -869,33 +869,33 @@
 
   @Nullable
   public GatewayInfo getGatewayInfo() {
-    return mTelecomCall == null ? null : mTelecomCall.getDetails().getGatewayInfo();
+    return telecomCall == null ? null : telecomCall.getDetails().getGatewayInfo();
   }
 
   @Nullable
   public PhoneAccountHandle getAccountHandle() {
-    return mTelecomCall == null ? null : mTelecomCall.getDetails().getAccountHandle();
+    return telecomCall == null ? null : telecomCall.getDetails().getAccountHandle();
   }
 
   /** @return The {@link VideoCall} instance associated with the {@link Call}. */
   public VideoCall getVideoCall() {
-    return mTelecomCall == null ? null : mTelecomCall.getVideoCall();
+    return telecomCall == null ? null : telecomCall.getVideoCall();
   }
 
   public List<String> getChildCallIds() {
-    return mChildCallIds;
+    return childCallIds;
   }
 
   public String getParentId() {
-    Call parentCall = mTelecomCall.getParent();
+    Call parentCall = telecomCall.getParent();
     if (parentCall != null) {
-      return mDialerCallDelegate.getDialerCallFromTelecomCall(parentCall).getId();
+      return dialerCallDelegate.getDialerCallFromTelecomCall(parentCall).getId();
     }
     return null;
   }
 
   public int getVideoState() {
-    return mTelecomCall.getDetails().getVideoState();
+    return telecomCall.getDetails().getVideoState();
   }
 
   public boolean isVideoCall() {
@@ -915,11 +915,11 @@
    * repeated calls to isEmergencyNumber.
    */
   private void updateEmergencyCallState() {
-    mIsEmergencyCall = TelecomCallUtil.isEmergencyCall(mTelecomCall);
+    isEmergencyCall = TelecomCallUtil.isEmergencyCall(telecomCall);
   }
 
   public LogState getLogState() {
-    return mLogState;
+    return logState;
   }
 
   /**
@@ -957,17 +957,17 @@
       return;
     }
 
-    mLogState.callSpecificAppData = CallIntentParser.getCallSpecificAppData(getIntentExtras());
-    if (mLogState.callSpecificAppData == null) {
+    logState.callSpecificAppData = CallIntentParser.getCallSpecificAppData(getIntentExtras());
+    if (logState.callSpecificAppData == null) {
 
-      mLogState.callSpecificAppData =
+      logState.callSpecificAppData =
           CallSpecificAppData.newBuilder()
               .setCallInitiationType(CallInitiationType.Type.EXTERNAL_INITIATION)
               .build();
     }
     if (getState() == State.INCOMING) {
-      mLogState.callSpecificAppData =
-          mLogState
+      logState.callSpecificAppData =
+          logState
               .callSpecificAppData
               .toBuilder()
               .setCallInitiationType(CallInitiationType.Type.INCOMING_INITIATION)
@@ -977,24 +977,24 @@
 
   @Override
   public String toString() {
-    if (mTelecomCall == null) {
+    if (telecomCall == null) {
       // This should happen only in testing since otherwise we would never have a null
       // Telecom call.
-      return String.valueOf(mId);
+      return String.valueOf(id);
     }
 
     return String.format(
         Locale.US,
         "[%s, %s, %s, %s, children:%s, parent:%s, "
             + "conferenceable:%s, videoState:%s, mSessionModificationState:%d, CameraDir:%s]",
-        mId,
+        id,
         State.toString(getState()),
-        Details.capabilitiesToString(mTelecomCall.getDetails().getCallCapabilities()),
-        Details.propertiesToString(mTelecomCall.getDetails().getCallProperties()),
-        mChildCallIds,
+        Details.capabilitiesToString(telecomCall.getDetails().getCallCapabilities()),
+        Details.propertiesToString(telecomCall.getDetails().getCallProperties()),
+        childCallIds,
         getParentId(),
-        this.mTelecomCall.getConferenceableCalls(),
-        VideoProfile.videoStateToString(mTelecomCall.getDetails().getVideoState()),
+        this.telecomCall.getConferenceableCalls(),
+        VideoProfile.videoStateToString(telecomCall.getDetails().getVideoState()),
         getVideoTech().getSessionModificationState(),
         getCameraDir());
   }
@@ -1005,11 +1005,11 @@
 
   @CallHistoryStatus
   public int getCallHistoryStatus() {
-    return mCallHistoryStatus;
+    return callHistoryStatus;
   }
 
   public void setCallHistoryStatus(@CallHistoryStatus int callHistoryStatus) {
-    mCallHistoryStatus = callHistoryStatus;
+    this.callHistoryStatus = callHistoryStatus;
   }
 
   public boolean didShowCameraPermission() {
@@ -1048,19 +1048,19 @@
   }
 
   public boolean isSpam() {
-    return mIsSpam;
+    return isSpam;
   }
 
   public void setSpam(boolean isSpam) {
-    mIsSpam = isSpam;
+    this.isSpam = isSpam;
   }
 
   public boolean isBlocked() {
-    return mIsBlocked;
+    return isBlocked;
   }
 
   public void setBlockedStatus(boolean isBlocked) {
-    mIsBlocked = isBlocked;
+    this.isBlocked = isBlocked;
   }
 
   public boolean isRemotelyHeld() {
@@ -1072,7 +1072,7 @@
   }
 
   public boolean isIncoming() {
-    return mLogState.isIncoming;
+    return logState.isIncoming;
   }
 
   /**
@@ -1122,7 +1122,7 @@
   }
 
   public LatencyReport getLatencyReport() {
-    return mLatencyReport;
+    return latencyReport;
   }
 
   public int getAnswerAndReleaseButtonDisplayedTimes() {
@@ -1151,25 +1151,25 @@
 
   @Nullable
   public EnrichedCallCapabilities getEnrichedCallCapabilities() {
-    return mEnrichedCallCapabilities;
+    return enrichedCallCapabilities;
   }
 
   public void setEnrichedCallCapabilities(
       @Nullable EnrichedCallCapabilities mEnrichedCallCapabilities) {
-    this.mEnrichedCallCapabilities = mEnrichedCallCapabilities;
+    this.enrichedCallCapabilities = mEnrichedCallCapabilities;
   }
 
   @Nullable
   public Session getEnrichedCallSession() {
-    return mEnrichedCallSession;
+    return enrichedCallSession;
   }
 
   public void setEnrichedCallSession(@Nullable Session mEnrichedCallSession) {
-    this.mEnrichedCallSession = mEnrichedCallSession;
+    this.enrichedCallSession = mEnrichedCallSession;
   }
 
   public void unregisterCallback() {
-    mTelecomCall.unregisterCallback(mTelecomCallCallback);
+    telecomCall.unregisterCallback(telecomCallCallback);
   }
 
   public void phoneAccountSelected(PhoneAccountHandle accountHandle, boolean setDefault) {
@@ -1178,45 +1178,45 @@
         "accountHandle: %s, setDefault: %b",
         accountHandle,
         setDefault);
-    mTelecomCall.phoneAccountSelected(accountHandle, setDefault);
+    telecomCall.phoneAccountSelected(accountHandle, setDefault);
   }
 
   public void disconnect() {
     LogUtil.i("DialerCall.disconnect", "");
     setState(DialerCall.State.DISCONNECTING);
-    for (DialerCallListener listener : mListeners) {
+    for (DialerCallListener listener : listeners) {
       listener.onDialerCallUpdate();
     }
-    mTelecomCall.disconnect();
+    telecomCall.disconnect();
   }
 
   public void hold() {
     LogUtil.i("DialerCall.hold", "");
-    mTelecomCall.hold();
+    telecomCall.hold();
   }
 
   public void unhold() {
     LogUtil.i("DialerCall.unhold", "");
-    mTelecomCall.unhold();
+    telecomCall.unhold();
   }
 
   public void splitFromConference() {
     LogUtil.i("DialerCall.splitFromConference", "");
-    mTelecomCall.splitFromConference();
+    telecomCall.splitFromConference();
   }
 
   public void answer(int videoState) {
     LogUtil.i("DialerCall.answer", "videoState: " + videoState);
-    mTelecomCall.answer(videoState);
+    telecomCall.answer(videoState);
   }
 
   public void answer() {
-    answer(mTelecomCall.getDetails().getVideoState());
+    answer(telecomCall.getDetails().getVideoState());
   }
 
   public void reject(boolean rejectWithMessage, String message) {
     LogUtil.i("DialerCall.reject", "");
-    mTelecomCall.reject(rejectWithMessage, message);
+    telecomCall.reject(rejectWithMessage, message);
   }
 
   /** Return the string label to represent the call provider */
@@ -1240,12 +1240,12 @@
     if (accountHandle == null) {
       return null;
     }
-    return mContext.getSystemService(TelecomManager.class).getPhoneAccount(accountHandle);
+    return context.getSystemService(TelecomManager.class).getPhoneAccount(accountHandle);
   }
 
   public VideoTech getVideoTech() {
     if (videoTech == null) {
-      videoTech = mVideoTechManager.getVideoTech();
+      videoTech = videoTechManager.getVideoTech();
 
       // Only store the first video tech type found to be available during the life of the call.
       if (selectedAvailableVideoTechType == com.android.dialer.logging.VideoTech.Type.NONE) {
@@ -1266,7 +1266,7 @@
 
       if (isEmergencyCall() || showCallbackNumber) {
         callbackNumber =
-            mContext.getSystemService(TelecomManager.class).getLine1Number(getAccountHandle());
+            context.getSystemService(TelecomManager.class).getLine1Number(getAccountHandle());
       }
 
       if (callbackNumber == null) {
@@ -1278,8 +1278,7 @@
 
   public String getSimCountryIso() {
     String simCountryIso =
-        TelephonyManagerCompat.getTelephonyManagerForPhoneAccountHandle(
-                mContext, getAccountHandle())
+        TelephonyManagerCompat.getTelephonyManagerForPhoneAccountHandle(context, getAccountHandle())
             .getSimCountryIso();
     if (!TextUtils.isEmpty(simCountryIso)) {
       simCountryIso = simCountryIso.toUpperCase(Locale.US);
@@ -1295,7 +1294,7 @@
   @Override
   public void onSessionModificationStateChanged() {
     Trace.beginSection("DialerCall.onSessionModificationStateChanged");
-    for (DialerCallListener listener : mListeners) {
+    for (DialerCallListener listener : listeners) {
       listener.onDialerCallSessionModificationStateChange();
     }
     Trace.endSection();
@@ -1315,13 +1314,13 @@
   public void onVideoUpgradeRequestReceived() {
     LogUtil.enterBlock("DialerCall.onVideoUpgradeRequestReceived");
 
-    for (DialerCallListener listener : mListeners) {
+    for (DialerCallListener listener : listeners) {
       listener.onDialerCallUpgradeToVideo();
     }
 
     update();
 
-    Logger.get(mContext)
+    Logger.get(context)
         .logCallImpression(
             DialerImpression.Type.VIDEO_CALL_REQUEST_RECEIVED, getUniqueCallId(), getTimeAddedMs());
   }
@@ -1356,7 +1355,7 @@
       return;
     }
     EnrichedCallCapabilities capabilities =
-        EnrichedCallComponent.get(mContext).getEnrichedCallManager().getCapabilities(getNumber());
+        EnrichedCallComponent.get(context).getEnrichedCallManager().getCapabilities(getNumber());
     if (capabilities != null) {
       setEnrichedCallCapabilities(capabilities);
       update();
@@ -1370,10 +1369,10 @@
 
   @Override
   public void onImpressionLoggingNeeded(DialerImpression.Type impressionType) {
-    Logger.get(mContext).logCallImpression(impressionType, getUniqueCallId(), getTimeAddedMs());
+    Logger.get(context).logCallImpression(impressionType, getUniqueCallId(), getTimeAddedMs());
     if (impressionType == DialerImpression.Type.LIGHTBRINGER_UPGRADE_REQUESTED) {
       if (getLogState().contactLookupResult == Type.NOT_FOUND) {
-        Logger.get(mContext)
+        Logger.get(context)
             .logCallImpression(
                 DialerImpression.Type.LIGHTBRINGER_NON_CONTACT_UPGRADE_REQUESTED,
                 getUniqueCallId(),
@@ -1394,7 +1393,7 @@
       return;
     }
 
-    EnrichedCallManager manager = EnrichedCallComponent.get(mContext).getEnrichedCallManager();
+    EnrichedCallManager manager = EnrichedCallComponent.get(context).getEnrichedCallManager();
 
     Filter filter =
         isIncoming()
@@ -1419,14 +1418,14 @@
   }
 
   private void dispatchOnEnrichedCallSessionUpdate() {
-    for (DialerCallListener listener : mListeners) {
+    for (DialerCallListener listener : listeners) {
       listener.onEnrichedCallSessionUpdate();
     }
   }
 
   void onRemovedFromCallList() {
     // Ensure we clean up when this call is removed.
-    mVideoTechManager.dispatchRemovedFromCallList();
+    videoTechManager.dispatchRemovedFromCallList();
   }
 
   public com.android.dialer.logging.VideoTech.Type getSelectedAvailableVideoTechType() {
@@ -1630,7 +1629,7 @@
     private VideoTech savedTech;
 
     VideoTechManager(DialerCall call) {
-      this.context = call.mContext;
+      this.context = call.context;
 
       String phoneNumber = call.getNumber();
       phoneNumber = phoneNumber != null ? phoneNumber : "";
@@ -1639,13 +1638,13 @@
       // Insert order here determines the priority of that video tech option
       videoTechs = new ArrayList<>();
 
-      videoTechs.add(new ImsVideoTech(Logger.get(call.mContext), call, call.mTelecomCall));
+      videoTechs.add(new ImsVideoTech(Logger.get(call.context), call, call.telecomCall));
 
       VideoTech rcsVideoTech =
-          EnrichedCallComponent.get(call.mContext)
+          EnrichedCallComponent.get(call.context)
               .getRcsVideoShareFactory()
               .newRcsVideoShare(
-                  EnrichedCallComponent.get(call.mContext).getEnrichedCallManager(),
+                  EnrichedCallComponent.get(call.context).getEnrichedCallManager(),
                   call,
                   phoneNumber);
       if (rcsVideoTech != null) {
@@ -1654,7 +1653,7 @@
 
       videoTechs.add(
           new DuoVideoTech(
-              DuoComponent.get(call.mContext).getDuo(), call, call.mTelecomCall, phoneNumber));
+              DuoComponent.get(call.context).getDuo(), call, call.telecomCall, phoneNumber));
     }
 
     VideoTech getVideoTech() {
diff --git a/java/com/android/incallui/call/ExternalCallList.java b/java/com/android/incallui/call/ExternalCallList.java
index f104dfe..603ebf7 100644
--- a/java/com/android/incallui/call/ExternalCallList.java
+++ b/java/com/android/incallui/call/ExternalCallList.java
@@ -35,11 +35,11 @@
  */
 public class ExternalCallList {
 
-  private final Set<Call> mExternalCalls = new ArraySet<>();
-  private final Set<ExternalCallListener> mExternalCallListeners =
+  private final Set<Call> externalCalls = new ArraySet<>();
+  private final Set<ExternalCallListener> externalCallListeners =
       Collections.newSetFromMap(new ConcurrentHashMap<ExternalCallListener, Boolean>(8, 0.9f, 1));
   /** Handles {@link android.telecom.Call.Callback} callbacks. */
-  private final Call.Callback mTelecomCallCallback =
+  private final Call.Callback telecomCallCallback =
       new Call.Callback() {
         @Override
         public void onDetailsChanged(Call call, Call.Details details) {
@@ -51,52 +51,52 @@
   public void onCallAdded(Call telecomCall) {
     Assert.checkArgument(
         telecomCall.getDetails().hasProperty(CallCompat.Details.PROPERTY_IS_EXTERNAL_CALL));
-    mExternalCalls.add(telecomCall);
-    telecomCall.registerCallback(mTelecomCallCallback, new Handler(Looper.getMainLooper()));
+    externalCalls.add(telecomCall);
+    telecomCall.registerCallback(telecomCallCallback, new Handler(Looper.getMainLooper()));
     notifyExternalCallAdded(telecomCall);
   }
 
   /** Stops tracking an external call and notifies listeners of the removal of the call. */
   public void onCallRemoved(Call telecomCall) {
-    if (!mExternalCalls.contains(telecomCall)) {
+    if (!externalCalls.contains(telecomCall)) {
       // This can happen on M for external calls from blocked numbers
       LogUtil.i("ExternalCallList.onCallRemoved", "attempted to remove unregistered call");
       return;
     }
-    mExternalCalls.remove(telecomCall);
-    telecomCall.unregisterCallback(mTelecomCallCallback);
+    externalCalls.remove(telecomCall);
+    telecomCall.unregisterCallback(telecomCallCallback);
     notifyExternalCallRemoved(telecomCall);
   }
 
   /** Adds a new listener to external call events. */
   public void addExternalCallListener(@NonNull ExternalCallListener listener) {
-    mExternalCallListeners.add(listener);
+    externalCallListeners.add(listener);
   }
 
   /** Removes a listener to external call events. */
   public void removeExternalCallListener(@NonNull ExternalCallListener listener) {
-    if (!mExternalCallListeners.contains(listener)) {
+    if (!externalCallListeners.contains(listener)) {
       LogUtil.i(
           "ExternalCallList.removeExternalCallListener",
           "attempt to remove unregistered listener.");
     }
-    mExternalCallListeners.remove(listener);
+    externalCallListeners.remove(listener);
   }
 
   public boolean isCallTracked(@NonNull android.telecom.Call telecomCall) {
-    return mExternalCalls.contains(telecomCall);
+    return externalCalls.contains(telecomCall);
   }
 
   /** Notifies listeners of the addition of a new external call. */
   private void notifyExternalCallAdded(Call call) {
-    for (ExternalCallListener listener : mExternalCallListeners) {
+    for (ExternalCallListener listener : externalCallListeners) {
       listener.onExternalCallAdded(call);
     }
   }
 
   /** Notifies listeners of the removal of an external call. */
   private void notifyExternalCallRemoved(Call call) {
-    for (ExternalCallListener listener : mExternalCallListeners) {
+    for (ExternalCallListener listener : externalCallListeners) {
       listener.onExternalCallRemoved(call);
     }
   }
@@ -109,11 +109,11 @@
       // change.
       onCallRemoved(call);
 
-      for (ExternalCallListener listener : mExternalCallListeners) {
+      for (ExternalCallListener listener : externalCallListeners) {
         listener.onExternalCallPulled(call);
       }
     } else {
-      for (ExternalCallListener listener : mExternalCallListeners) {
+      for (ExternalCallListener listener : externalCallListeners) {
         listener.onExternalCallUpdated(call);
       }
     }
diff --git a/java/com/android/incallui/call/InCallVideoCallCallbackNotifier.java b/java/com/android/incallui/call/InCallVideoCallCallbackNotifier.java
index ff94120..23a3dad 100644
--- a/java/com/android/incallui/call/InCallVideoCallCallbackNotifier.java
+++ b/java/com/android/incallui/call/InCallVideoCallCallbackNotifier.java
@@ -27,13 +27,13 @@
 public class InCallVideoCallCallbackNotifier {
 
   /** Singleton instance of this class. */
-  private static InCallVideoCallCallbackNotifier sInstance = new InCallVideoCallCallbackNotifier();
+  private static InCallVideoCallCallbackNotifier instance = new InCallVideoCallCallbackNotifier();
 
   /**
    * ConcurrentHashMap constructor params: 8 is initial table size, 0.9f is load factor before
    * resizing, 1 means we only expect a single thread to access the map so make only a single shard
    */
-  private final Set<SurfaceChangeListener> mSurfaceChangeListeners =
+  private final Set<SurfaceChangeListener> surfaceChangeListeners =
       Collections.newSetFromMap(new ConcurrentHashMap<SurfaceChangeListener, Boolean>(8, 0.9f, 1));
 
   /** Private constructor. Instance should only be acquired through getRunningInstance(). */
@@ -41,7 +41,7 @@
 
   /** Static singleton accessor method. */
   public static InCallVideoCallCallbackNotifier getInstance() {
-    return sInstance;
+    return instance;
   }
 
   /**
@@ -51,7 +51,7 @@
    */
   public void addSurfaceChangeListener(@NonNull SurfaceChangeListener listener) {
     Objects.requireNonNull(listener);
-    mSurfaceChangeListeners.add(listener);
+    surfaceChangeListeners.add(listener);
   }
 
   /**
@@ -61,7 +61,7 @@
    */
   public void removeSurfaceChangeListener(@Nullable SurfaceChangeListener listener) {
     if (listener != null) {
-      mSurfaceChangeListeners.remove(listener);
+      surfaceChangeListeners.remove(listener);
     }
   }
 
@@ -73,7 +73,7 @@
    * @param height New peer height.
    */
   public void peerDimensionsChanged(DialerCall call, int width, int height) {
-    for (SurfaceChangeListener listener : mSurfaceChangeListeners) {
+    for (SurfaceChangeListener listener : surfaceChangeListeners) {
       listener.onUpdatePeerDimensions(call, width, height);
     }
   }
@@ -86,7 +86,7 @@
    * @param height The new camera video height.
    */
   public void cameraDimensionsChanged(DialerCall call, int width, int height) {
-    for (SurfaceChangeListener listener : mSurfaceChangeListeners) {
+    for (SurfaceChangeListener listener : surfaceChangeListeners) {
       listener.onCameraDimensionsChange(call, width, height);
     }
   }
diff --git a/java/com/android/incallui/call/TelecomAdapter.java b/java/com/android/incallui/call/TelecomAdapter.java
index d48ab68..a7e10d3 100644
--- a/java/com/android/incallui/call/TelecomAdapter.java
+++ b/java/com/android/incallui/call/TelecomAdapter.java
@@ -32,8 +32,8 @@
 
   private static final String ADD_CALL_MODE_KEY = "add_call_mode";
 
-  private static TelecomAdapter sInstance;
-  private InCallService mInCallService;
+  private static TelecomAdapter instance;
+  private InCallService inCallService;
 
   private TelecomAdapter() {}
 
@@ -42,25 +42,25 @@
     if (!Looper.getMainLooper().isCurrentThread()) {
       throw new IllegalStateException();
     }
-    if (sInstance == null) {
-      sInstance = new TelecomAdapter();
+    if (instance == null) {
+      instance = new TelecomAdapter();
     }
-    return sInstance;
+    return instance;
   }
 
   @VisibleForTesting(otherwise = VisibleForTesting.NONE)
   public static void setInstanceForTesting(TelecomAdapter telecomAdapter) {
-    sInstance = telecomAdapter;
+    instance = telecomAdapter;
   }
 
   @Override
   public void setInCallService(InCallService inCallService) {
-    mInCallService = inCallService;
+    this.inCallService = inCallService;
   }
 
   @Override
   public void clearInCallService() {
-    mInCallService = null;
+    inCallService = null;
   }
 
   private android.telecom.Call getTelecomCallById(String callId) {
@@ -69,16 +69,16 @@
   }
 
   public void mute(boolean shouldMute) {
-    if (mInCallService != null) {
-      mInCallService.setMuted(shouldMute);
+    if (inCallService != null) {
+      inCallService.setMuted(shouldMute);
     } else {
       LogUtil.e("TelecomAdapter.mute", "mInCallService is null");
     }
   }
 
   public void setAudioRoute(int route) {
-    if (mInCallService != null) {
-      mInCallService.setAudioRoute(route);
+    if (inCallService != null) {
+      inCallService.setAudioRoute(route);
     } else {
       LogUtil.e("TelecomAdapter.setAudioRoute", "mInCallService is null");
     }
@@ -116,7 +116,7 @@
   }
 
   public void addCall() {
-    if (mInCallService != null) {
+    if (inCallService != null) {
       Intent intent = new Intent(Intent.ACTION_DIAL);
       intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 
@@ -126,7 +126,7 @@
       intent.putExtra(ADD_CALL_MODE_KEY, true);
       try {
         LogUtil.d("TelecomAdapter.addCall", "Sending the add DialerCall intent");
-        mInCallService.startActivity(intent);
+        inCallService.startActivity(intent);
       } catch (ActivityNotFoundException e) {
         // This is rather rare but possible.
         // Note: this method is used even when the phone is encrypted. At that moment
@@ -164,8 +164,8 @@
   }
 
   public boolean canAddCall() {
-    if (mInCallService != null) {
-      return mInCallService.canAddCall();
+    if (inCallService != null) {
+      return inCallService.canAddCall();
     }
     return false;
   }
@@ -177,16 +177,16 @@
    */
   public void startForegroundNotification(int id, Notification notification) {
     Assert.isNotNull(
-        mInCallService, "No inCallService available for starting foreground notification");
-    mInCallService.startForeground(id, notification);
+        inCallService, "No inCallService available for starting foreground notification");
+    inCallService.startForeground(id, notification);
   }
 
   /**
    * Stop a started foreground notification. This does not stop {@code mInCallService} from running.
    */
   public void stopForegroundNotification() {
-    if (mInCallService != null) {
-      mInCallService.stopForeground(true /*removeNotification*/);
+    if (inCallService != null) {
+      inCallService.stopForeground(true /*removeNotification*/);
     } else {
       LogUtil.e(
           "TelecomAdapter.stopForegroundNotification",
diff --git a/java/com/android/incallui/calllocation/impl/DownloadMapImageTask.java b/java/com/android/incallui/calllocation/impl/DownloadMapImageTask.java
index 035f5cd..c7249e0 100644
--- a/java/com/android/incallui/calllocation/impl/DownloadMapImageTask.java
+++ b/java/com/android/incallui/calllocation/impl/DownloadMapImageTask.java
@@ -31,15 +31,15 @@
 
   private static final String STATIC_MAP_SRC_NAME = "src";
 
-  private final WeakReference<LocationUi> mUiReference;
+  private final WeakReference<LocationUi> uiReference;
 
   public DownloadMapImageTask(WeakReference<LocationUi> uiReference) {
-    mUiReference = uiReference;
+    this.uiReference = uiReference;
   }
 
   @Override
   protected Drawable doInBackground(Location... locations) {
-    LocationUi ui = mUiReference.get();
+    LocationUi ui = uiReference.get();
     if (ui == null) {
       return null;
     }
@@ -64,7 +64,7 @@
 
   @Override
   protected void onPostExecute(Drawable mapImage) {
-    LocationUi ui = mUiReference.get();
+    LocationUi ui = uiReference.get();
     if (ui == null) {
       return;
     }
diff --git a/java/com/android/incallui/calllocation/impl/HttpFetcher.java b/java/com/android/incallui/calllocation/impl/HttpFetcher.java
index 10cc34d..c182fa1 100644
--- a/java/com/android/incallui/calllocation/impl/HttpFetcher.java
+++ b/java/com/android/incallui/calllocation/impl/HttpFetcher.java
@@ -222,8 +222,6 @@
   /**
    * Lookup up url re-write rules from gServices and apply to the given url.
    *
-
-   *
    * @return The new url.
    */
   private static URL reWriteUrl(Context context, String url) {
@@ -267,21 +265,21 @@
   /** Disconnect {@link HttpURLConnection} when InputStream is closed */
   private static class HttpInputStreamWrapper extends FilterInputStream {
 
-    final HttpURLConnection mHttpUrlConnection;
-    final long mStartMillis = SystemClock.uptimeMillis();
+    final HttpURLConnection httpUrlConnection;
+    final long startMillis = SystemClock.uptimeMillis();
 
     public HttpInputStreamWrapper(HttpURLConnection conn, InputStream in) {
       super(in);
-      mHttpUrlConnection = conn;
+      httpUrlConnection = conn;
     }
 
     @Override
     public void close() throws IOException {
       super.close();
-      mHttpUrlConnection.disconnect();
+      httpUrlConnection.disconnect();
       if (LogUtil.isDebugEnabled()) {
         long endMillis = SystemClock.uptimeMillis();
-        LogUtil.i("HttpFetcher.close", "fetch took " + (endMillis - mStartMillis) + " ms");
+        LogUtil.i("HttpFetcher.close", "fetch took " + (endMillis - startMillis) + " ms");
       }
     }
   }
diff --git a/java/com/android/incallui/calllocation/impl/LocationPresenter.java b/java/com/android/incallui/calllocation/impl/LocationPresenter.java
index 1199308..83195ba 100644
--- a/java/com/android/incallui/calllocation/impl/LocationPresenter.java
+++ b/java/com/android/incallui/calllocation/impl/LocationPresenter.java
@@ -37,9 +37,9 @@
 public class LocationPresenter extends Presenter<LocationPresenter.LocationUi>
     implements LocationListener {
 
-  private Location mLastLocation;
-  private AsyncTask mDownloadMapTask;
-  private AsyncTask mReverseGeocodeTask;
+  private Location lastLocation;
+  private AsyncTask downloadMapTask;
+  private AsyncTask reverseGeocodeTask;
 
   LocationPresenter() {}
 
@@ -47,7 +47,7 @@
   public void onUiReady(LocationUi ui) {
     LogUtil.i("LocationPresenter.onUiReady", "");
     super.onUiReady(ui);
-    updateLocation(mLastLocation, true);
+    updateLocation(lastLocation, true);
   }
 
   @Override
@@ -55,11 +55,11 @@
     LogUtil.i("LocationPresenter.onUiUnready", "");
     super.onUiUnready(ui);
 
-    if (mDownloadMapTask != null) {
-      mDownloadMapTask.cancel(true);
+    if (downloadMapTask != null) {
+      downloadMapTask.cancel(true);
     }
-    if (mReverseGeocodeTask != null) {
-      mReverseGeocodeTask.cancel(true);
+    if (reverseGeocodeTask != null) {
+      reverseGeocodeTask.cancel(true);
     }
   }
 
@@ -71,13 +71,13 @@
 
   private void updateLocation(Location location, boolean forceUpdate) {
     LogUtil.i("LocationPresenter.updateLocation", "location: " + location);
-    if (forceUpdate || !Objects.equals(mLastLocation, location)) {
-      mLastLocation = location;
+    if (forceUpdate || !Objects.equals(lastLocation, location)) {
+      lastLocation = location;
       int status = LocationHelper.checkLocation(location);
       LocationUi ui = getUi();
       if (status == LocationHelper.LOCATION_STATUS_OK) {
-        mDownloadMapTask = new DownloadMapImageTask(new WeakReference<>(ui)).execute(location);
-        mReverseGeocodeTask = new ReverseGeocodeTask(new WeakReference<>(ui)).execute(location);
+        downloadMapTask = new DownloadMapImageTask(new WeakReference<>(ui)).execute(location);
+        reverseGeocodeTask = new ReverseGeocodeTask(new WeakReference<>(ui)).execute(location);
         if (ui != null) {
           ui.setLocation(location);
         } else {
diff --git a/java/com/android/incallui/calllocation/impl/ReverseGeocodeTask.java b/java/com/android/incallui/calllocation/impl/ReverseGeocodeTask.java
index 060ec0b..f4592d4 100644
--- a/java/com/android/incallui/calllocation/impl/ReverseGeocodeTask.java
+++ b/java/com/android/incallui/calllocation/impl/ReverseGeocodeTask.java
@@ -39,15 +39,15 @@
   private static final String JSON_KEY_LONG_NAME = "long_name";
   private static final String JSON_KEY_SHORT_NAME = "short_name";
 
-  private WeakReference<LocationUi> mUiReference;
+  private WeakReference<LocationUi> uiReference;
 
   public ReverseGeocodeTask(WeakReference<LocationUi> uiReference) {
-    mUiReference = uiReference;
+    this.uiReference = uiReference;
   }
 
   @Override
   protected String doInBackground(Location... locations) {
-    LocationUi ui = mUiReference.get();
+    LocationUi ui = uiReference.get();
     if (ui == null) {
       return null;
     }
@@ -131,7 +131,7 @@
 
   @Override
   protected void onPostExecute(String address) {
-    LocationUi ui = mUiReference.get();
+    LocationUi ui = uiReference.get();
     if (ui == null) {
       return;
     }
diff --git a/java/com/android/incallui/latencyreport/LatencyReport.java b/java/com/android/incallui/latencyreport/LatencyReport.java
index 2e1fbd5..8ea66f9 100644
--- a/java/com/android/incallui/latencyreport/LatencyReport.java
+++ b/java/com/android/incallui/latencyreport/LatencyReport.java
@@ -30,111 +30,111 @@
       "android.telecom.extra.CALL_TELECOM_ROUTING_START_TIME_MILLIS";
   private static final String EXTRA_CALL_TELECOM_ROUTING_END_TIME_MILLIS =
       "android.telecom.extra.CALL_TELECOM_ROUTING_END_TIME_MILLIS";
-  private final boolean mWasIncoming;
+  private final boolean wasIncoming;
 
   // Time elapsed since boot when the call was created by the connection service.
-  private final long mCreatedTimeMillis;
+  private final long createdTimeMillis;
 
   // Time elapsed since boot when telecom began processing the call.
-  private final long mTelecomRoutingStartTimeMillis;
+  private final long telecomRoutingStartTimeMillis;
 
   // Time elapsed since boot when telecom finished processing the call. This includes things like
   // looking up contact info and call blocking but before showing any UI.
-  private final long mTelecomRoutingEndTimeMillis;
+  private final long telecomRoutingEndTimeMillis;
 
   // Time elapsed since boot when the call was added to the InCallUi.
-  private final long mCallAddedTimeMillis;
+  private final long callAddedTimeMillis;
 
   // Time elapsed since boot when the call was added and call blocking evaluation was completed.
-  private long mCallBlockingTimeMillis = INVALID_TIME;
+  private long callBlockingTimeMillis = INVALID_TIME;
 
   // Time elapsed since boot when the call notification was shown.
-  private long mCallNotificationTimeMillis = INVALID_TIME;
+  private long callNotificationTimeMillis = INVALID_TIME;
 
   // Time elapsed since boot when the InCallUI was shown.
-  private long mInCallUiShownTimeMillis = INVALID_TIME;
+  private long inCallUiShownTimeMillis = INVALID_TIME;
 
   // Whether the call was shown to the user as a heads up notification instead of a full screen
   // UI.
-  private boolean mDidDisplayHeadsUpNotification;
+  private boolean didDisplayHeadsUpNotification;
 
   public LatencyReport() {
-    mWasIncoming = false;
-    mCreatedTimeMillis = INVALID_TIME;
-    mTelecomRoutingStartTimeMillis = INVALID_TIME;
-    mTelecomRoutingEndTimeMillis = INVALID_TIME;
-    mCallAddedTimeMillis = SystemClock.elapsedRealtime();
+    wasIncoming = false;
+    createdTimeMillis = INVALID_TIME;
+    telecomRoutingStartTimeMillis = INVALID_TIME;
+    telecomRoutingEndTimeMillis = INVALID_TIME;
+    callAddedTimeMillis = SystemClock.elapsedRealtime();
   }
 
   public LatencyReport(android.telecom.Call telecomCall) {
-    mWasIncoming = telecomCall.getState() == android.telecom.Call.STATE_RINGING;
+    wasIncoming = telecomCall.getState() == android.telecom.Call.STATE_RINGING;
     Bundle extras = telecomCall.getDetails().getIntentExtras();
     if (extras == null) {
-      mCreatedTimeMillis = INVALID_TIME;
-      mTelecomRoutingStartTimeMillis = INVALID_TIME;
-      mTelecomRoutingEndTimeMillis = INVALID_TIME;
+      createdTimeMillis = INVALID_TIME;
+      telecomRoutingStartTimeMillis = INVALID_TIME;
+      telecomRoutingEndTimeMillis = INVALID_TIME;
     } else {
-      mCreatedTimeMillis = extras.getLong(EXTRA_CALL_CREATED_TIME_MILLIS, INVALID_TIME);
-      mTelecomRoutingStartTimeMillis =
+      createdTimeMillis = extras.getLong(EXTRA_CALL_CREATED_TIME_MILLIS, INVALID_TIME);
+      telecomRoutingStartTimeMillis =
           extras.getLong(EXTRA_CALL_TELECOM_ROUTING_START_TIME_MILLIS, INVALID_TIME);
-      mTelecomRoutingEndTimeMillis =
+      telecomRoutingEndTimeMillis =
           extras.getLong(EXTRA_CALL_TELECOM_ROUTING_END_TIME_MILLIS, INVALID_TIME);
     }
-    mCallAddedTimeMillis = SystemClock.elapsedRealtime();
+    callAddedTimeMillis = SystemClock.elapsedRealtime();
   }
 
   public boolean getWasIncoming() {
-    return mWasIncoming;
+    return wasIncoming;
   }
 
   public long getCreatedTimeMillis() {
-    return mCreatedTimeMillis;
+    return createdTimeMillis;
   }
 
   public long getTelecomRoutingStartTimeMillis() {
-    return mTelecomRoutingStartTimeMillis;
+    return telecomRoutingStartTimeMillis;
   }
 
   public long getTelecomRoutingEndTimeMillis() {
-    return mTelecomRoutingEndTimeMillis;
+    return telecomRoutingEndTimeMillis;
   }
 
   public long getCallAddedTimeMillis() {
-    return mCallAddedTimeMillis;
+    return callAddedTimeMillis;
   }
 
   public long getCallBlockingTimeMillis() {
-    return mCallBlockingTimeMillis;
+    return callBlockingTimeMillis;
   }
 
   public void onCallBlockingDone() {
-    if (mCallBlockingTimeMillis == INVALID_TIME) {
-      mCallBlockingTimeMillis = SystemClock.elapsedRealtime();
+    if (callBlockingTimeMillis == INVALID_TIME) {
+      callBlockingTimeMillis = SystemClock.elapsedRealtime();
     }
   }
 
   public long getCallNotificationTimeMillis() {
-    return mCallNotificationTimeMillis;
+    return callNotificationTimeMillis;
   }
 
   public void onNotificationShown() {
-    if (mCallNotificationTimeMillis == INVALID_TIME) {
-      mCallNotificationTimeMillis = SystemClock.elapsedRealtime();
+    if (callNotificationTimeMillis == INVALID_TIME) {
+      callNotificationTimeMillis = SystemClock.elapsedRealtime();
     }
   }
 
   public long getInCallUiShownTimeMillis() {
-    return mInCallUiShownTimeMillis;
+    return inCallUiShownTimeMillis;
   }
 
   public void onInCallUiShown(boolean forFullScreenIntent) {
-    if (mInCallUiShownTimeMillis == INVALID_TIME) {
-      mInCallUiShownTimeMillis = SystemClock.elapsedRealtime();
-      mDidDisplayHeadsUpNotification = mWasIncoming && !forFullScreenIntent;
+    if (inCallUiShownTimeMillis == INVALID_TIME) {
+      inCallUiShownTimeMillis = SystemClock.elapsedRealtime();
+      didDisplayHeadsUpNotification = wasIncoming && !forFullScreenIntent;
     }
   }
 
   public boolean getDidDisplayHeadsUpNotification() {
-    return mDidDisplayHeadsUpNotification;
+    return didDisplayHeadsUpNotification;
   }
 }
diff --git a/java/com/android/incallui/ringtone/DialerRingtoneManager.java b/java/com/android/incallui/ringtone/DialerRingtoneManager.java
index 5ebd933..49badf5 100644
--- a/java/com/android/incallui/ringtone/DialerRingtoneManager.java
+++ b/java/com/android/incallui/ringtone/DialerRingtoneManager.java
@@ -38,9 +38,9 @@
    * Once we're ready to enable Dialer Ringing, these flags should be removed.
    */
   private static final boolean IS_DIALER_RINGING_ENABLED = false;
-  private final InCallTonePlayer mInCallTonePlayer;
-  private final CallList mCallList;
-  private Boolean mIsDialerRingingEnabledForTesting;
+  private final InCallTonePlayer inCallTonePlayer;
+  private final CallList callList;
+  private Boolean isDialerRingingEnabledForTesting;
 
   /**
    * Creates the DialerRingtoneManager with the given {@link InCallTonePlayer}.
@@ -51,8 +51,8 @@
    */
   public DialerRingtoneManager(
       @NonNull InCallTonePlayer inCallTonePlayer, @NonNull CallList callList) {
-    mInCallTonePlayer = Objects.requireNonNull(inCallTonePlayer);
-    mCallList = Objects.requireNonNull(callList);
+    this.inCallTonePlayer = Objects.requireNonNull(inCallTonePlayer);
+    this.callList = Objects.requireNonNull(callList);
   }
 
   /**
@@ -88,13 +88,13 @@
     if (callState != State.INCOMING) {
       return callState;
     }
-    return mCallList.getActiveCall() == null ? State.INCOMING : State.CALL_WAITING;
+    return callList.getActiveCall() == null ? State.INCOMING : State.CALL_WAITING;
   }
 
   private boolean isDialerRingingEnabled() {
     boolean enabledFlag =
-        mIsDialerRingingEnabledForTesting != null
-            ? mIsDialerRingingEnabledForTesting
+        isDialerRingingEnabledForTesting != null
+            ? isDialerRingingEnabledForTesting
             : IS_DIALER_RINGING_ENABLED;
     return VERSION.SDK_INT >= VERSION_CODES.N && enabledFlag;
   }
@@ -109,7 +109,7 @@
   public boolean shouldPlayCallWaitingTone(int callState) {
     return isDialerRingingEnabled()
         && translateCallStateForCallWaiting(callState) == State.CALL_WAITING
-        && !mInCallTonePlayer.isPlayingTone();
+        && !inCallTonePlayer.isPlayingTone();
   }
 
   /** Plays the call waiting tone. */
@@ -117,7 +117,7 @@
     if (!isDialerRingingEnabled()) {
       return;
     }
-    mInCallTonePlayer.play(InCallTonePlayer.TONE_CALL_WAITING);
+    inCallTonePlayer.play(InCallTonePlayer.TONE_CALL_WAITING);
   }
 
   /** Stops playing the call waiting tone. */
@@ -125,10 +125,10 @@
     if (!isDialerRingingEnabled()) {
       return;
     }
-    mInCallTonePlayer.stop();
+    inCallTonePlayer.stop();
   }
 
   void setDialerRingingEnabledForTesting(boolean status) {
-    mIsDialerRingingEnabledForTesting = status;
+    isDialerRingingEnabledForTesting = status;
   }
 }
diff --git a/java/com/android/incallui/ringtone/InCallTonePlayer.java b/java/com/android/incallui/ringtone/InCallTonePlayer.java
index c76b41d..dac244d 100644
--- a/java/com/android/incallui/ringtone/InCallTonePlayer.java
+++ b/java/com/android/incallui/ringtone/InCallTonePlayer.java
@@ -36,9 +36,9 @@
 
   public static final int VOLUME_RELATIVE_HIGH_PRIORITY = 80;
 
-  @NonNull private final ToneGeneratorFactory mToneGeneratorFactory;
-  @NonNull private final PausableExecutor mExecutor;
-  private @Nullable CountDownLatch mNumPlayingTones;
+  @NonNull private final ToneGeneratorFactory toneGeneratorFactory;
+  @NonNull private final PausableExecutor executor;
+  private @Nullable CountDownLatch numPlayingTones;
 
   /**
    * Creates a new InCallTonePlayer.
@@ -51,13 +51,13 @@
    */
   public InCallTonePlayer(
       @NonNull ToneGeneratorFactory toneGeneratorFactory, @NonNull PausableExecutor executor) {
-    mToneGeneratorFactory = Objects.requireNonNull(toneGeneratorFactory);
-    mExecutor = Objects.requireNonNull(executor);
+    this.toneGeneratorFactory = Objects.requireNonNull(toneGeneratorFactory);
+    this.executor = Objects.requireNonNull(executor);
   }
 
   /** @return {@code true} if a tone is currently playing, {@code false} otherwise. */
   public boolean isPlayingTone() {
-    return mNumPlayingTones != null && mNumPlayingTones.getCount() > 0;
+    return numPlayingTones != null && numPlayingTones.getCount() > 0;
   }
 
   /**
@@ -72,8 +72,8 @@
       throw new IllegalStateException("Tone already playing");
     }
     final ToneGeneratorInfo info = getToneGeneratorInfo(tone);
-    mNumPlayingTones = new CountDownLatch(1);
-    mExecutor.execute(
+    numPlayingTones = new CountDownLatch(1);
+    executor.execute(
         new Runnable() {
           @Override
           public void run() {
@@ -106,17 +106,17 @@
     ToneGenerator toneGenerator = null;
     try {
       Log.v(this, "Starting tone " + info);
-      toneGenerator = mToneGeneratorFactory.newInCallToneGenerator(info.stream, info.volume);
+      toneGenerator = toneGeneratorFactory.newInCallToneGenerator(info.stream, info.volume);
       toneGenerator.startTone(info.tone);
       /*
        * During tests, this will block until the tests call mExecutor.ackMilestone. This call
        * allows for synchronization to the point where the tone has started playing.
        */
-      mExecutor.milestone();
-      if (mNumPlayingTones != null) {
-        mNumPlayingTones.await(info.toneLengthMillis, TimeUnit.MILLISECONDS);
+      executor.milestone();
+      if (numPlayingTones != null) {
+        numPlayingTones.await(info.toneLengthMillis, TimeUnit.MILLISECONDS);
         // Allows for synchronization to the point where the tone has completed playing.
-        mExecutor.milestone();
+        executor.milestone();
       }
     } catch (InterruptedException e) {
       Log.w(this, "Interrupted while playing in-call tone.");
@@ -124,18 +124,18 @@
       if (toneGenerator != null) {
         toneGenerator.release();
       }
-      if (mNumPlayingTones != null) {
-        mNumPlayingTones.countDown();
+      if (numPlayingTones != null) {
+        numPlayingTones.countDown();
       }
       // Allows for synchronization to the point where this background thread has cleaned up.
-      mExecutor.milestone();
+      executor.milestone();
     }
   }
 
   /** Stops playback of the current tone. */
   public void stop() {
-    if (mNumPlayingTones != null) {
-      mNumPlayingTones.countDown();
+    if (numPlayingTones != null) {
+      numPlayingTones.countDown();
     }
   }
 
diff --git a/java/com/android/newbubble/NewCheckableButton.java b/java/com/android/newbubble/NewCheckableButton.java
index 8e43335..15858d3 100644
--- a/java/com/android/newbubble/NewCheckableButton.java
+++ b/java/com/android/newbubble/NewCheckableButton.java
@@ -33,7 +33,7 @@
  */
 public class NewCheckableButton extends AppCompatButton implements Checkable {
 
-  private boolean mChecked;
+  private boolean checked;
 
   public NewCheckableButton(Context context) {
     this(context, null);
@@ -67,8 +67,8 @@
 
   @Override
   public void setChecked(boolean checked) {
-    if (mChecked != checked) {
-      mChecked = checked;
+    if (this.checked != checked) {
+      this.checked = checked;
       int newColor =
           checked
               ? getContext().getColor(R.color.bubble_button_color_blue)
@@ -80,11 +80,11 @@
 
   @Override
   public boolean isChecked() {
-    return mChecked;
+    return checked;
   }
 
   @Override
   public void toggle() {
-    setChecked(!mChecked);
+    setChecked(!checked);
   }
 }
diff --git a/java/com/android/newbubble/RoundedRectRevealOutlineProvider.java b/java/com/android/newbubble/RoundedRectRevealOutlineProvider.java
index d204e0f..2ade6cf 100644
--- a/java/com/android/newbubble/RoundedRectRevealOutlineProvider.java
+++ b/java/com/android/newbubble/RoundedRectRevealOutlineProvider.java
@@ -32,38 +32,38 @@
  * rounded rectangle.
  */
 public class RoundedRectRevealOutlineProvider extends ViewOutlineProvider {
-  private final float mStartRadius;
-  private final float mEndRadius;
+  private final float startRadius;
+  private final float endRadius;
 
-  private final Rect mStartRect;
-  private final Rect mEndRect;
+  private final Rect startRect;
+  private final Rect endRect;
 
-  private final Rect mOutline;
-  private float mOutlineRadius;
+  private final Rect outline;
+  private float outlineRadius;
 
   public RoundedRectRevealOutlineProvider(
       float startRadius, float endRadius, Rect startRect, Rect endRect) {
-    mStartRadius = startRadius;
-    mEndRadius = endRadius;
-    mStartRect = startRect;
-    mEndRect = endRect;
+    this.startRadius = startRadius;
+    this.endRadius = endRadius;
+    this.startRect = startRect;
+    this.endRect = endRect;
 
-    mOutline = new Rect();
+    outline = new Rect();
   }
 
   @Override
   public void getOutline(View v, Outline outline) {
-    outline.setRoundRect(mOutline, mOutlineRadius);
+    outline.setRoundRect(this.outline, outlineRadius);
   }
 
   /** Sets the progress, from 0 to 1, of the reveal animation. */
   public void setProgress(float progress) {
-    mOutlineRadius = (1 - progress) * mStartRadius + progress * mEndRadius;
+    outlineRadius = (1 - progress) * startRadius + progress * endRadius;
 
-    mOutline.left = (int) ((1 - progress) * mStartRect.left + progress * mEndRect.left);
-    mOutline.top = (int) ((1 - progress) * mStartRect.top + progress * mEndRect.top);
-    mOutline.right = (int) ((1 - progress) * mStartRect.right + progress * mEndRect.right);
-    mOutline.bottom = (int) ((1 - progress) * mStartRect.bottom + progress * mEndRect.bottom);
+    outline.left = (int) ((1 - progress) * startRect.left + progress * endRect.left);
+    outline.top = (int) ((1 - progress) * startRect.top + progress * endRect.top);
+    outline.right = (int) ((1 - progress) * startRect.right + progress * endRect.right);
+    outline.bottom = (int) ((1 - progress) * startRect.bottom + progress * endRect.bottom);
   }
 
   ValueAnimator createRevealAnimator(final View revealView, boolean isReversed) {
@@ -72,7 +72,7 @@
 
     valueAnimator.addListener(
         new AnimatorListenerAdapter() {
-          private boolean mWasCanceled = false;
+          private boolean wasCanceled = false;
 
           @Override
           public void onAnimationStart(Animator animation) {
@@ -82,12 +82,12 @@
 
           @Override
           public void onAnimationCancel(Animator animation) {
-            mWasCanceled = true;
+            wasCanceled = true;
           }
 
           @Override
           public void onAnimationEnd(Animator animation) {
-            if (!mWasCanceled) {
+            if (!wasCanceled) {
               revealView.setOutlineProvider(ViewOutlineProvider.BACKGROUND);
               revealView.setClipToOutline(false);
             }
diff --git a/java/com/android/voicemail/impl/ActivationTask.java b/java/com/android/voicemail/impl/ActivationTask.java
index 83f2fd8..3cdbee4 100644
--- a/java/com/android/voicemail/impl/ActivationTask.java
+++ b/java/com/android/voicemail/impl/ActivationTask.java
@@ -63,16 +63,16 @@
 
   @VisibleForTesting static final String EXTRA_MESSAGE_DATA_BUNDLE = "extra_message_data_bundle";
 
-  private final RetryPolicy mRetryPolicy;
+  private final RetryPolicy retryPolicy;
 
   @Nullable private OmtpVvmCarrierConfigHelper configForTest;
 
-  private Bundle mMessageData;
+  private Bundle messageData;
 
   public ActivationTask() {
     super(TASK_ACTIVATION);
-    mRetryPolicy = new RetryPolicy(RETRY_TIMES, RETRY_INTERVAL_MILLIS);
-    addPolicy(mRetryPolicy);
+    retryPolicy = new RetryPolicy(RETRY_TIMES, RETRY_INTERVAL_MILLIS);
+    addPolicy(retryPolicy);
   }
 
   /** Has the user gone through the setup wizard yet. */
@@ -108,7 +108,7 @@
   @Override
   public void onCreate(Context context, Bundle extras) {
     super.onCreate(context, extras);
-    mMessageData = extras.getParcelable(EXTRA_MESSAGE_DATA_BUNDLE);
+    messageData = extras.getParcelable(EXTRA_MESSAGE_DATA_BUNDLE);
   }
 
   @Override
@@ -168,7 +168,7 @@
     }
     VvmLog.i(TAG, "VVM content provider configured - " + helper.getVvmType());
 
-    if (mMessageData == null
+    if (messageData == null
         && VvmAccountManager.isAccountActivated(getContext(), phoneAccountHandle)) {
       VvmLog.i(TAG, "Account is already activated");
       // The activated state might come from restored data, the filter still needs to be set up.
@@ -191,15 +191,15 @@
     }
 
     helper.activateSmsFilter();
-    VoicemailStatus.Editor status = mRetryPolicy.getVoicemailStatusEditor();
+    VoicemailStatus.Editor status = retryPolicy.getVoicemailStatusEditor();
 
     VisualVoicemailProtocol protocol = helper.getProtocol();
 
     Bundle data;
-    if (mMessageData != null) {
+    if (messageData != null) {
       // The content of STATUS SMS is provided to launch this task, no need to request it
       // again.
-      data = mMessageData;
+      data = messageData;
     } else {
       try (StatusSmsFetcher fetcher = new StatusSmsFetcher(getContext(), phoneAccountHandle)) {
         protocol.startActivation(helper, fetcher.getSentIntent());
diff --git a/java/com/android/voicemail/impl/Assert.java b/java/com/android/voicemail/impl/Assert.java
index fe06372..0e9e4dc 100644
--- a/java/com/android/voicemail/impl/Assert.java
+++ b/java/com/android/voicemail/impl/Assert.java
@@ -21,7 +21,7 @@
 /** Assertions which will result in program termination. */
 public class Assert {
 
-  private static Boolean sIsMainThreadForTest;
+  private static Boolean isMainThreadForTest;
 
   public static void isTrue(boolean condition) {
     if (!condition) {
@@ -30,16 +30,16 @@
   }
 
   public static void isMainThread() {
-    if (sIsMainThreadForTest != null) {
-      isTrue(sIsMainThreadForTest);
+    if (isMainThreadForTest != null) {
+      isTrue(isMainThreadForTest);
       return;
     }
     isTrue(Looper.getMainLooper().equals(Looper.myLooper()));
   }
 
   public static void isNotMainThread() {
-    if (sIsMainThreadForTest != null) {
-      isTrue(!sIsMainThreadForTest);
+    if (isMainThreadForTest != null) {
+      isTrue(!isMainThreadForTest);
       return;
     }
     isTrue(!Looper.getMainLooper().equals(Looper.myLooper()));
@@ -52,6 +52,6 @@
   /** Override the main thread status for tests. Set to null to revert to normal behavior */
   @NeededForTesting
   public static void setIsMainThreadForTesting(Boolean isMainThread) {
-    sIsMainThreadForTest = isMainThread;
+    isMainThreadForTest = isMainThread;
   }
 }
diff --git a/java/com/android/voicemail/impl/OmtpEvents.java b/java/com/android/voicemail/impl/OmtpEvents.java
index 6807edc..ddca80f 100644
--- a/java/com/android/voicemail/impl/OmtpEvents.java
+++ b/java/com/android/voicemail/impl/OmtpEvents.java
@@ -123,30 +123,30 @@
     public static final int OTHER = 4;
   }
 
-  private final int mType;
-  private final boolean mIsSuccess;
+  private final int type;
+  private final boolean isSuccess;
 
   OmtpEvents(int type, boolean isSuccess) {
-    mType = type;
-    mIsSuccess = isSuccess;
+    this.type = type;
+    this.isSuccess = isSuccess;
   }
 
   OmtpEvents(int type) {
-    mType = type;
-    mIsSuccess = false;
+    this.type = type;
+    isSuccess = false;
   }
 
   OmtpEvents() {
-    mType = Type.OTHER;
-    mIsSuccess = false;
+    type = Type.OTHER;
+    isSuccess = false;
   }
 
   @Type.Values
   public int getType() {
-    return mType;
+    return type;
   }
 
   public boolean isSuccess() {
-    return mIsSuccess;
+    return isSuccess;
   }
 }
diff --git a/java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java b/java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java
index 0b63e86..d5cde72 100644
--- a/java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java
+++ b/java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java
@@ -88,86 +88,86 @@
 
   public static final String KEY_VVM_CLIENT_PREFIX_STRING = "vvm_client_prefix_string";
 
-  @Nullable private static PersistableBundle sOverrideConfigForTest;
+  @Nullable private static PersistableBundle overrideConfigForTest;
 
-  private final Context mContext;
-  private final PersistableBundle mCarrierConfig;
-  private final String mVvmType;
-  private final VisualVoicemailProtocol mProtocol;
-  private final PersistableBundle mTelephonyConfig;
+  private final Context context;
+  private final PersistableBundle carrierConfig;
+  private final String vvmType;
+  private final VisualVoicemailProtocol protocol;
+  private final PersistableBundle telephonyConfig;
 
-  @Nullable private final PersistableBundle mOverrideConfig;
+  @Nullable private final PersistableBundle overrideConfig;
 
-  private PhoneAccountHandle mPhoneAccountHandle;
+  private PhoneAccountHandle phoneAccountHandle;
 
   public OmtpVvmCarrierConfigHelper(Context context, @Nullable PhoneAccountHandle handle) {
-    mContext = context;
-    mPhoneAccountHandle = handle;
+    this.context = context;
+    phoneAccountHandle = handle;
     TelephonyManager telephonyManager =
         context
             .getSystemService(TelephonyManager.class)
-            .createForPhoneAccountHandle(mPhoneAccountHandle);
+            .createForPhoneAccountHandle(phoneAccountHandle);
     if (telephonyManager == null) {
       VvmLog.e(TAG, "PhoneAccountHandle is invalid");
-      mCarrierConfig = null;
-      mTelephonyConfig = null;
-      mOverrideConfig = null;
-      mVvmType = null;
-      mProtocol = null;
+      carrierConfig = null;
+      telephonyConfig = null;
+      overrideConfig = null;
+      vvmType = null;
+      protocol = null;
       return;
     }
 
-    if (sOverrideConfigForTest != null) {
-      mOverrideConfig = sOverrideConfigForTest;
-      mCarrierConfig = new PersistableBundle();
-      mTelephonyConfig = new PersistableBundle();
+    if (overrideConfigForTest != null) {
+      overrideConfig = overrideConfigForTest;
+      carrierConfig = new PersistableBundle();
+      telephonyConfig = new PersistableBundle();
     } else {
       if (ConfigOverrideFragment.isOverridden(context)) {
-        mOverrideConfig = ConfigOverrideFragment.getConfig(context);
-        VvmLog.w(TAG, "Config override is activated: " + mOverrideConfig);
+        overrideConfig = ConfigOverrideFragment.getConfig(context);
+        VvmLog.w(TAG, "Config override is activated: " + overrideConfig);
       } else {
-        mOverrideConfig = null;
+        overrideConfig = null;
       }
 
-      mCarrierConfig = getCarrierConfig(telephonyManager);
-      mTelephonyConfig =
+      carrierConfig = getCarrierConfig(telephonyManager);
+      telephonyConfig =
           new TelephonyVvmConfigManager(context).getConfig(telephonyManager.getSimOperator());
     }
 
-    mVvmType = getVvmType();
-    mProtocol = VisualVoicemailProtocolFactory.create(mContext.getResources(), mVvmType);
+    vvmType = getVvmType();
+    protocol = VisualVoicemailProtocolFactory.create(this.context.getResources(), vvmType);
   }
 
   @VisibleForTesting
   OmtpVvmCarrierConfigHelper(
       Context context, PersistableBundle carrierConfig, PersistableBundle telephonyConfig) {
-    mContext = context;
-    mCarrierConfig = carrierConfig;
-    mTelephonyConfig = telephonyConfig;
-    mOverrideConfig = null;
-    mVvmType = getVvmType();
-    mProtocol = VisualVoicemailProtocolFactory.create(mContext.getResources(), mVvmType);
+    this.context = context;
+    this.carrierConfig = carrierConfig;
+    this.telephonyConfig = telephonyConfig;
+    overrideConfig = null;
+    vvmType = getVvmType();
+    protocol = VisualVoicemailProtocolFactory.create(this.context.getResources(), vvmType);
   }
 
   public PersistableBundle getConfig() {
     PersistableBundle result = new PersistableBundle();
-    if (mTelephonyConfig != null) {
-      result.putAll(mTelephonyConfig);
+    if (telephonyConfig != null) {
+      result.putAll(telephonyConfig);
     }
-    if (mCarrierConfig != null) {
-      result.putAll(mCarrierConfig);
+    if (carrierConfig != null) {
+      result.putAll(carrierConfig);
     }
 
     return result;
   }
 
   public Context getContext() {
-    return mContext;
+    return context;
   }
 
   @Nullable
   public PhoneAccountHandle getPhoneAccountHandle() {
-    return mPhoneAccountHandle;
+    return phoneAccountHandle;
   }
 
   /**
@@ -175,7 +175,7 @@
    * known protocol.
    */
   public boolean isValid() {
-    if (mProtocol == null) {
+    if (protocol == null) {
       return false;
     }
     if (isCarrierAppPreloaded()) {
@@ -191,7 +191,7 @@
 
   @Nullable
   public VisualVoicemailProtocol getProtocol() {
-    return mProtocol;
+    return protocol;
   }
 
   /** @returns arbitrary String stored in the config file. Used for protocol specific values. */
@@ -209,15 +209,15 @@
 
   @Nullable
   private Set<String> getCarrierVvmPackageNamesWithoutValidation() {
-    Set<String> names = getCarrierVvmPackageNames(mOverrideConfig);
+    Set<String> names = getCarrierVvmPackageNames(overrideConfig);
     if (names != null) {
       return names;
     }
-    names = getCarrierVvmPackageNames(mCarrierConfig);
+    names = getCarrierVvmPackageNames(carrierConfig);
     if (names != null) {
       return names;
     }
-    return getCarrierVvmPackageNames(mTelephonyConfig);
+    return getCarrierVvmPackageNames(telephonyConfig);
   }
 
   private static Set<String> getCarrierVvmPackageNames(@Nullable PersistableBundle bundle) {
@@ -255,7 +255,7 @@
     }
     for (String packageName : carrierPackages) {
       try {
-        mContext.getPackageManager().getPackageInfo(packageName, 0);
+        context.getPackageManager().getPackageInfo(packageName, 0);
         return false;
       } catch (NameNotFoundException e) {
         // Do nothing.
@@ -305,15 +305,15 @@
   public Set<String> getDisabledCapabilities() {
     Assert.checkArgument(isValid());
     Set<String> disabledCapabilities;
-    disabledCapabilities = getDisabledCapabilities(mOverrideConfig);
+    disabledCapabilities = getDisabledCapabilities(overrideConfig);
     if (disabledCapabilities != null) {
       return disabledCapabilities;
     }
-    disabledCapabilities = getDisabledCapabilities(mCarrierConfig);
+    disabledCapabilities = getDisabledCapabilities(carrierConfig);
     if (disabledCapabilities != null) {
       return disabledCapabilities;
     }
-    return getDisabledCapabilities(mTelephonyConfig);
+    return getDisabledCapabilities(telephonyConfig);
   }
 
   @Nullable
@@ -367,7 +367,7 @@
       return;
     }
 
-    if (mVvmType == null || mVvmType.isEmpty()) {
+    if (vvmType == null || vvmType.isEmpty()) {
       // The VVM type is invalid; we should never have gotten here in the first place since
       // this is loaded initially in the constructor, and callers should check isValid()
       // before trying to start activation anyways.
@@ -375,15 +375,15 @@
       return;
     }
 
-    if (mProtocol != null) {
-      ActivationTask.start(mContext, mPhoneAccountHandle, null);
+    if (protocol != null) {
+      ActivationTask.start(context, this.phoneAccountHandle, null);
     }
   }
 
   public void activateSmsFilter() {
     Assert.checkArgument(isValid());
     TelephonyMangerCompat.setVisualVoicemailSmsFilterSettings(
-        mContext,
+        context,
         getPhoneAccountHandle(),
         new VisualVoicemailSmsFilterSettings.Builder().setClientPrefix(getClientPrefix()).build());
   }
@@ -394,18 +394,18 @@
     if (!isLegacyModeEnabled()) {
       // SMS should still be filtered in legacy mode
       TelephonyMangerCompat.setVisualVoicemailSmsFilterSettings(
-          mContext, getPhoneAccountHandle(), null);
+          context, getPhoneAccountHandle(), null);
       VvmLog.i(TAG, "filter disabled");
     }
-    if (mProtocol != null) {
-      mProtocol.startDeactivation(this);
+    if (protocol != null) {
+      protocol.startDeactivation(this);
     }
-    VvmAccountManager.removeAccount(mContext, getPhoneAccountHandle());
+    VvmAccountManager.removeAccount(context, getPhoneAccountHandle());
   }
 
   public boolean supportsProvisioning() {
     Assert.checkArgument(isValid());
-    return mProtocol.supportsProvisioning();
+    return protocol.supportsProvisioning();
   }
 
   public void startProvisioning(
@@ -415,18 +415,18 @@
       StatusMessage message,
       Bundle data) {
     Assert.checkArgument(isValid());
-    mProtocol.startProvisioning(task, phone, this, status, message, data);
+    protocol.startProvisioning(task, phone, this, status, message, data);
   }
 
   public void requestStatus(@Nullable PendingIntent sentIntent) {
     Assert.checkArgument(isValid());
-    mProtocol.requestStatus(this, sentIntent);
+    protocol.requestStatus(this, sentIntent);
   }
 
   public void handleEvent(VoicemailStatus.Editor status, OmtpEvents event) {
     Assert.checkArgument(isValid());
     VvmLog.i(TAG, "OmtpEvent:" + event);
-    mProtocol.handleEvent(mContext, this, status, event);
+    protocol.handleEvent(context, this, status, event);
   }
 
   @Override
@@ -434,11 +434,11 @@
     StringBuilder builder = new StringBuilder("OmtpVvmCarrierConfigHelper [");
     builder
         .append("phoneAccountHandle: ")
-        .append(mPhoneAccountHandle)
+        .append(phoneAccountHandle)
         .append(", carrierConfig: ")
-        .append(mCarrierConfig != null)
+        .append(carrierConfig != null)
         .append(", telephonyConfig: ")
-        .append(mTelephonyConfig != null)
+        .append(telephonyConfig != null)
         .append(", type: ")
         .append(getVvmType())
         .append(", destinationNumber: ")
@@ -462,7 +462,7 @@
   @Nullable
   private PersistableBundle getCarrierConfig(@NonNull TelephonyManager telephonyManager) {
     CarrierConfigManager carrierConfigManager =
-        (CarrierConfigManager) mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE);
+        (CarrierConfigManager) context.getSystemService(Context.CARRIER_CONFIG_SERVICE);
     if (carrierConfigManager == null) {
       VvmLog.w(TAG, "No carrier config service found.");
       return null;
@@ -484,21 +484,21 @@
   @Nullable
   private Object getValue(String key, Object defaultValue) {
     Object result;
-    if (mOverrideConfig != null) {
-      result = mOverrideConfig.get(key);
+    if (overrideConfig != null) {
+      result = overrideConfig.get(key);
       if (result != null) {
         return result;
       }
     }
 
-    if (mCarrierConfig != null) {
-      result = mCarrierConfig.get(key);
+    if (carrierConfig != null) {
+      result = carrierConfig.get(key);
       if (result != null) {
         return result;
       }
     }
-    if (mTelephonyConfig != null) {
-      result = mTelephonyConfig.get(key);
+    if (telephonyConfig != null) {
+      result = telephonyConfig.get(key);
       if (result != null) {
         return result;
       }
@@ -508,7 +508,7 @@
 
   @VisibleForTesting
   public static void setOverrideConfigForTest(PersistableBundle config) {
-    sOverrideConfigForTest = config;
+    overrideConfigForTest = config;
   }
 
   private boolean isCarrierAppPreloaded() {
diff --git a/java/com/android/voicemail/impl/TelephonyVvmConfigManager.java b/java/com/android/voicemail/impl/TelephonyVvmConfigManager.java
index 046113c..ecf4e6f 100644
--- a/java/com/android/voicemail/impl/TelephonyVvmConfigManager.java
+++ b/java/com/android/voicemail/impl/TelephonyVvmConfigManager.java
@@ -43,28 +43,28 @@
 
   private static final String KEY_FEATURE_FLAG_NAME = "feature_flag_name";
 
-  private static Map<String, PersistableBundle> sCachedConfigs;
+  private static Map<String, PersistableBundle> cachedConfigs;
 
-  private final Map<String, PersistableBundle> mConfigs;
+  private final Map<String, PersistableBundle> configs;
 
   public TelephonyVvmConfigManager(Context context) {
-    if (sCachedConfigs == null) {
-      sCachedConfigs = loadConfigs(context, context.getResources().getXml(R.xml.vvm_config));
+    if (cachedConfigs == null) {
+      cachedConfigs = loadConfigs(context, context.getResources().getXml(R.xml.vvm_config));
     }
-    mConfigs = sCachedConfigs;
+    configs = cachedConfigs;
   }
 
   @VisibleForTesting
   TelephonyVvmConfigManager(Context context, XmlPullParser parser) {
-    mConfigs = loadConfigs(context, parser);
+    configs = loadConfigs(context, parser);
   }
 
   @Nullable
   public PersistableBundle getConfig(String mccMnc) {
     if (USE_DEBUG_CONFIG) {
-      return mConfigs.get("TEST");
+      return configs.get("TEST");
     }
-    return mConfigs.get(mccMnc);
+    return configs.get(mccMnc);
   }
 
   private static Map<String, PersistableBundle> loadConfigs(Context context, XmlPullParser parser) {
diff --git a/java/com/android/voicemail/impl/Voicemail.java b/java/com/android/voicemail/impl/Voicemail.java
index f98d56f..a2282a9 100644
--- a/java/com/android/voicemail/impl/Voicemail.java
+++ b/java/com/android/voicemail/impl/Voicemail.java
@@ -25,17 +25,17 @@
 /** Represents a single voicemail stored in the voicemail content provider. */
 public class Voicemail implements Parcelable {
 
-  private final Long mTimestamp;
-  private final String mNumber;
-  private final PhoneAccountHandle mPhoneAccount;
-  private final Long mId;
-  private final Long mDuration;
-  private final String mSource;
-  private final String mProviderData;
-  private final Uri mUri;
-  private final Boolean mIsRead;
-  private final Boolean mHasContent;
-  private final String mTranscription;
+  private final Long timestamp;
+  private final String number;
+  private final PhoneAccountHandle phoneAccount;
+  private final Long id;
+  private final Long duration;
+  private final String source;
+  private final String providerData;
+  private final Uri uri;
+  private final Boolean isRead;
+  private final Boolean hasContent;
+  private final String transcription;
 
   private Voicemail(
       Long timestamp,
@@ -49,17 +49,17 @@
       Boolean isRead,
       Boolean hasContent,
       String transcription) {
-    mTimestamp = timestamp;
-    mNumber = number;
-    mPhoneAccount = phoneAccountHandle;
-    mId = id;
-    mDuration = duration;
-    mSource = source;
-    mProviderData = providerData;
-    mUri = uri;
-    mIsRead = isRead;
-    mHasContent = hasContent;
-    mTranscription = transcription;
+    this.timestamp = timestamp;
+    this.number = number;
+    phoneAccount = phoneAccountHandle;
+    this.id = id;
+    this.duration = duration;
+    this.source = source;
+    this.providerData = providerData;
+    this.uri = uri;
+    this.isRead = isRead;
+    this.hasContent = hasContent;
+    this.transcription = transcription;
   }
 
   /**
@@ -89,93 +89,93 @@
    */
   public static class Builder {
 
-    private Long mBuilderTimestamp;
-    private String mBuilderNumber;
-    private PhoneAccountHandle mBuilderPhoneAccount;
-    private Long mBuilderId;
-    private Long mBuilderDuration;
-    private String mBuilderSourcePackage;
-    private String mBuilderSourceData;
-    private Uri mBuilderUri;
-    private Boolean mBuilderIsRead;
-    private boolean mBuilderHasContent;
-    private String mBuilderTranscription;
+    private Long builderTimestamp;
+    private String builderNumber;
+    private PhoneAccountHandle builderPhoneAccount;
+    private Long builderId;
+    private Long builderDuration;
+    private String builderSourcePackage;
+    private String builderSourceData;
+    private Uri builderUri;
+    private Boolean builderIsRead;
+    private boolean builderHasContent;
+    private String builderTranscription;
 
     /** You should use the correct factory method to construct a builder. */
     private Builder() {}
 
     public Builder setNumber(String number) {
-      mBuilderNumber = number;
+      builderNumber = number;
       return this;
     }
 
     public Builder setTimestamp(long timestamp) {
-      mBuilderTimestamp = timestamp;
+      builderTimestamp = timestamp;
       return this;
     }
 
     public Builder setPhoneAccount(PhoneAccountHandle phoneAccount) {
-      mBuilderPhoneAccount = phoneAccount;
+      builderPhoneAccount = phoneAccount;
       return this;
     }
 
     public Builder setId(long id) {
-      mBuilderId = id;
+      builderId = id;
       return this;
     }
 
     public Builder setDuration(long duration) {
-      mBuilderDuration = duration;
+      builderDuration = duration;
       return this;
     }
 
     public Builder setSourcePackage(String sourcePackage) {
-      mBuilderSourcePackage = sourcePackage;
+      builderSourcePackage = sourcePackage;
       return this;
     }
 
     public Builder setSourceData(String sourceData) {
-      mBuilderSourceData = sourceData;
+      builderSourceData = sourceData;
       return this;
     }
 
     public Builder setUri(Uri uri) {
-      mBuilderUri = uri;
+      builderUri = uri;
       return this;
     }
 
     public Builder setIsRead(boolean isRead) {
-      mBuilderIsRead = isRead;
+      builderIsRead = isRead;
       return this;
     }
 
     public Builder setHasContent(boolean hasContent) {
-      mBuilderHasContent = hasContent;
+      builderHasContent = hasContent;
       return this;
     }
 
     public Builder setTranscription(String transcription) {
-      mBuilderTranscription = transcription;
+      builderTranscription = transcription;
       return this;
     }
 
     public Voicemail build() {
-      mBuilderId = mBuilderId == null ? -1 : mBuilderId;
-      mBuilderTimestamp = mBuilderTimestamp == null ? 0 : mBuilderTimestamp;
-      mBuilderDuration = mBuilderDuration == null ? 0 : mBuilderDuration;
-      mBuilderIsRead = mBuilderIsRead == null ? false : mBuilderIsRead;
+      builderId = builderId == null ? -1 : builderId;
+      builderTimestamp = builderTimestamp == null ? 0 : builderTimestamp;
+      builderDuration = builderDuration == null ? 0 : builderDuration;
+      builderIsRead = builderIsRead == null ? false : builderIsRead;
       return new Voicemail(
-          mBuilderTimestamp,
-          mBuilderNumber,
-          mBuilderPhoneAccount,
-          mBuilderId,
-          mBuilderDuration,
-          mBuilderSourcePackage,
-          mBuilderSourceData,
-          mBuilderUri,
-          mBuilderIsRead,
-          mBuilderHasContent,
-          mBuilderTranscription);
+          builderTimestamp,
+          builderNumber,
+          builderPhoneAccount,
+          builderId,
+          builderDuration,
+          builderSourcePackage,
+          builderSourceData,
+          builderUri,
+          builderIsRead,
+          builderHasContent,
+          builderTranscription);
     }
   }
 
@@ -187,27 +187,27 @@
    * none is specified, we return -1.
    */
   public long getId() {
-    return mId;
+    return id;
   }
 
   /** The number of the person leaving the voicemail, empty string if unknown, null if not set. */
   public String getNumber() {
-    return mNumber;
+    return number;
   }
 
   /** The phone account associated with the voicemail, null if not set. */
   public PhoneAccountHandle getPhoneAccount() {
-    return mPhoneAccount;
+    return phoneAccount;
   }
 
   /** The timestamp the voicemail was received, in millis since the epoch, zero if not set. */
   public long getTimestampMillis() {
-    return mTimestamp;
+    return timestamp;
   }
 
   /** Gets the duration of the voicemail in millis, or zero if the field is not set. */
   public long getDuration() {
-    return mDuration;
+    return duration;
   }
 
   /**
@@ -215,7 +215,7 @@
    * set.
    */
   public String getSourcePackage() {
-    return mSource;
+    return source;
   }
 
   /**
@@ -227,7 +227,7 @@
    * server-generated identifying string.
    */
   public String getSourceData() {
-    return mProviderData;
+    return providerData;
   }
 
   /**
@@ -236,7 +236,7 @@
    * <p>Returns null if we don't know the Uri.
    */
   public Uri getUri() {
-    return mUri;
+    return uri;
   }
 
   /**
@@ -245,17 +245,17 @@
    * <p>Always returns false if this field has not been set, i.e. if hasRead() returns false.
    */
   public boolean isRead() {
-    return mIsRead;
+    return isRead;
   }
 
   /** Tells us if there is content stored at the Uri. */
   public boolean hasContent() {
-    return mHasContent;
+    return hasContent;
   }
 
   /** Returns the text transcription of this voicemail, or null if this field is not set. */
   public String getTranscription() {
-    return mTranscription;
+    return transcription;
   }
 
   @Override
@@ -265,35 +265,35 @@
 
   @Override
   public void writeToParcel(Parcel dest, int flags) {
-    dest.writeLong(mTimestamp);
-    writeCharSequence(dest, mNumber);
-    if (mPhoneAccount == null) {
+    dest.writeLong(timestamp);
+    writeCharSequence(dest, number);
+    if (phoneAccount == null) {
       dest.writeInt(0);
     } else {
       dest.writeInt(1);
-      mPhoneAccount.writeToParcel(dest, flags);
+      phoneAccount.writeToParcel(dest, flags);
     }
-    dest.writeLong(mId);
-    dest.writeLong(mDuration);
-    writeCharSequence(dest, mSource);
-    writeCharSequence(dest, mProviderData);
-    if (mUri == null) {
+    dest.writeLong(id);
+    dest.writeLong(duration);
+    writeCharSequence(dest, source);
+    writeCharSequence(dest, providerData);
+    if (uri == null) {
       dest.writeInt(0);
     } else {
       dest.writeInt(1);
-      mUri.writeToParcel(dest, flags);
+      uri.writeToParcel(dest, flags);
     }
-    if (mIsRead) {
+    if (isRead) {
       dest.writeInt(1);
     } else {
       dest.writeInt(0);
     }
-    if (mHasContent) {
+    if (hasContent) {
       dest.writeInt(1);
     } else {
       dest.writeInt(0);
     }
-    writeCharSequence(dest, mTranscription);
+    writeCharSequence(dest, transcription);
   }
 
   public static final Creator<Voicemail> CREATOR =
@@ -310,25 +310,25 @@
       };
 
   private Voicemail(Parcel in) {
-    mTimestamp = in.readLong();
-    mNumber = (String) readCharSequence(in);
+    timestamp = in.readLong();
+    number = (String) readCharSequence(in);
     if (in.readInt() > 0) {
-      mPhoneAccount = PhoneAccountHandle.CREATOR.createFromParcel(in);
+      phoneAccount = PhoneAccountHandle.CREATOR.createFromParcel(in);
     } else {
-      mPhoneAccount = null;
+      phoneAccount = null;
     }
-    mId = in.readLong();
-    mDuration = in.readLong();
-    mSource = (String) readCharSequence(in);
-    mProviderData = (String) readCharSequence(in);
+    id = in.readLong();
+    duration = in.readLong();
+    source = (String) readCharSequence(in);
+    providerData = (String) readCharSequence(in);
     if (in.readInt() > 0) {
-      mUri = Uri.CREATOR.createFromParcel(in);
+      uri = Uri.CREATOR.createFromParcel(in);
     } else {
-      mUri = null;
+      uri = null;
     }
-    mIsRead = in.readInt() > 0 ? true : false;
-    mHasContent = in.readInt() > 0 ? true : false;
-    mTranscription = (String) readCharSequence(in);
+    isRead = in.readInt() > 0 ? true : false;
+    hasContent = in.readInt() > 0 ? true : false;
+    transcription = (String) readCharSequence(in);
   }
 
   private static CharSequence readCharSequence(Parcel in) {
diff --git a/java/com/android/voicemail/impl/VoicemailStatus.java b/java/com/android/voicemail/impl/VoicemailStatus.java
index a24bad4..2ebc49b 100644
--- a/java/com/android/voicemail/impl/VoicemailStatus.java
+++ b/java/com/android/voicemail/impl/VoicemailStatus.java
@@ -32,15 +32,15 @@
 
   public static class Editor {
 
-    private final Context mContext;
-    @Nullable private final PhoneAccountHandle mPhoneAccountHandle;
+    private final Context context;
+    @Nullable private final PhoneAccountHandle phoneAccountHandle;
 
-    private ContentValues mValues = new ContentValues();
+    private ContentValues values = new ContentValues();
 
     private Editor(Context context, PhoneAccountHandle phoneAccountHandle) {
-      mContext = context;
-      mPhoneAccountHandle = phoneAccountHandle;
-      if (mPhoneAccountHandle == null) {
+      this.context = context;
+      this.phoneAccountHandle = phoneAccountHandle;
+      if (this.phoneAccountHandle == null) {
         VvmLog.w(
             TAG,
             "VoicemailStatus.Editor created with null phone account, status will"
@@ -50,26 +50,26 @@
 
     @Nullable
     public PhoneAccountHandle getPhoneAccountHandle() {
-      return mPhoneAccountHandle;
+      return phoneAccountHandle;
     }
 
     public Editor setType(String type) {
-      mValues.put(Status.SOURCE_TYPE, type);
+      values.put(Status.SOURCE_TYPE, type);
       return this;
     }
 
     public Editor setConfigurationState(int configurationState) {
-      mValues.put(Status.CONFIGURATION_STATE, configurationState);
+      values.put(Status.CONFIGURATION_STATE, configurationState);
       return this;
     }
 
     public Editor setDataChannelState(int dataChannelState) {
-      mValues.put(Status.DATA_CHANNEL_STATE, dataChannelState);
+      values.put(Status.DATA_CHANNEL_STATE, dataChannelState);
       return this;
     }
 
     public Editor setNotificationChannelState(int notificationChannelState) {
-      mValues.put(Status.NOTIFICATION_CHANNEL_STATE, notificationChannelState);
+      values.put(Status.NOTIFICATION_CHANNEL_STATE, notificationChannelState);
       return this;
     }
 
@@ -79,8 +79,8 @@
         return this;
       }
 
-      mValues.put(Status.QUOTA_OCCUPIED, occupied);
-      mValues.put(Status.QUOTA_TOTAL, total);
+      values.put(Status.QUOTA_OCCUPIED, occupied);
+      values.put(Status.QUOTA_TOTAL, total);
       return this;
     }
 
@@ -90,28 +90,28 @@
      * @return {@code true} if the changes were successfully applied, {@code false} otherwise.
      */
     public boolean apply() {
-      if (mPhoneAccountHandle == null) {
+      if (phoneAccountHandle == null) {
         return false;
       }
-      mValues.put(
+      values.put(
           Status.PHONE_ACCOUNT_COMPONENT_NAME,
-          mPhoneAccountHandle.getComponentName().flattenToString());
-      mValues.put(Status.PHONE_ACCOUNT_ID, mPhoneAccountHandle.getId());
-      ContentResolver contentResolver = mContext.getContentResolver();
-      Uri statusUri = VoicemailContract.Status.buildSourceUri(mContext.getPackageName());
+          phoneAccountHandle.getComponentName().flattenToString());
+      values.put(Status.PHONE_ACCOUNT_ID, phoneAccountHandle.getId());
+      ContentResolver contentResolver = context.getContentResolver();
+      Uri statusUri = VoicemailContract.Status.buildSourceUri(context.getPackageName());
       try {
-        StrictModeUtils.bypass(() -> contentResolver.insert(statusUri, mValues));
+        StrictModeUtils.bypass(() -> contentResolver.insert(statusUri, values));
       } catch (IllegalArgumentException iae) {
         VvmLog.e(TAG, "apply :: failed to insert content resolver ", iae);
-        mValues.clear();
+        values.clear();
         return false;
       }
-      mValues.clear();
+      values.clear();
       return true;
     }
 
     public ContentValues getValues() {
-      return mValues;
+      return values;
     }
   }
 
diff --git a/java/com/android/voicemail/impl/VvmLog.java b/java/com/android/voicemail/impl/VvmLog.java
index 6dc4fa6..7d47904 100644
--- a/java/com/android/voicemail/impl/VvmLog.java
+++ b/java/com/android/voicemail/impl/VvmLog.java
@@ -30,7 +30,7 @@
 
   private static final int MAX_OMTP_VVM_LOGS = 100;
 
-  private static final LocalLog sLocalLog = new LocalLog(MAX_OMTP_VVM_LOGS);
+  private static final LocalLog localLog = new LocalLog(MAX_OMTP_VVM_LOGS);
 
   public static void log(String tag, String log) {
     PersistentLogger.logText(tag, log);
@@ -39,7 +39,7 @@
   public static void dump(FileDescriptor fd, PrintWriter printwriter, String[] args) {
     IndentingPrintWriter indentingPrintWriter = new IndentingPrintWriter(printwriter, "  ");
     indentingPrintWriter.increaseIndent();
-    sLocalLog.dump(fd, indentingPrintWriter, args);
+    localLog.dump(fd, indentingPrintWriter, args);
     indentingPrintWriter.decreaseIndent();
   }
 
@@ -116,16 +116,16 @@
 
   public static class LocalLog {
 
-    private final Deque<String> mLog;
-    private final int mMaxLines;
+    private final Deque<String> log;
+    private final int maxLines;
 
     public LocalLog(int maxLines) {
-      mMaxLines = Math.max(0, maxLines);
-      mLog = new ArrayDeque<>(mMaxLines);
+      this.maxLines = Math.max(0, maxLines);
+      log = new ArrayDeque<>(this.maxLines);
     }
 
     public void log(String msg) {
-      if (mMaxLines <= 0) {
+      if (maxLines <= 0) {
         return;
       }
       Calendar c = Calendar.getInstance();
@@ -134,21 +134,21 @@
     }
 
     private synchronized void append(String logLine) {
-      while (mLog.size() >= mMaxLines) {
-        mLog.remove();
+      while (log.size() >= maxLines) {
+        log.remove();
       }
-      mLog.add(logLine);
+      log.add(logLine);
     }
 
     public synchronized void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
-      Iterator<String> itr = mLog.iterator();
+      Iterator<String> itr = log.iterator();
       while (itr.hasNext()) {
         pw.println(itr.next());
       }
     }
 
     public synchronized void reverseDump(FileDescriptor fd, PrintWriter pw, String[] args) {
-      Iterator<String> itr = mLog.descendingIterator();
+      Iterator<String> itr = log.descendingIterator();
       while (itr.hasNext()) {
         pw.println(itr.next());
       }
@@ -156,18 +156,18 @@
 
     public static class ReadOnlyLocalLog {
 
-      private final LocalLog mLog;
+      private final LocalLog log;
 
       ReadOnlyLocalLog(LocalLog log) {
-        mLog = log;
+        this.log = log;
       }
 
       public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
-        mLog.dump(fd, pw, args);
+        log.dump(fd, pw, args);
       }
 
       public void reverseDump(FileDescriptor fd, PrintWriter pw, String[] args) {
-        mLog.reverseDump(fd, pw, args);
+        log.reverseDump(fd, pw, args);
       }
     }
 
diff --git a/java/com/android/voicemail/impl/VvmPhoneStateListener.java b/java/com/android/voicemail/impl/VvmPhoneStateListener.java
index 914120b..a9082e8 100644
--- a/java/com/android/voicemail/impl/VvmPhoneStateListener.java
+++ b/java/com/android/voicemail/impl/VvmPhoneStateListener.java
@@ -31,73 +31,73 @@
 
   private static final String TAG = "VvmPhoneStateListener";
 
-  private PhoneAccountHandle mPhoneAccount;
-  private Context mContext;
-  private int mPreviousState = -1;
+  private PhoneAccountHandle phoneAccount;
+  private Context context;
+  private int previousState = -1;
 
   public VvmPhoneStateListener(Context context, PhoneAccountHandle accountHandle) {
     // TODO(twyen): a bug too much trouble to call super constructor through reflection,
     // just use non-phoneAccountHandle version for now.
     super();
-    mContext = context;
-    mPhoneAccount = accountHandle;
+    this.context = context;
+    phoneAccount = accountHandle;
   }
 
   @Override
   public void onServiceStateChanged(ServiceState serviceState) {
-    if (mPhoneAccount == null) {
+    if (phoneAccount == null) {
       VvmLog.e(
           TAG,
           "onServiceStateChanged on phoneAccount "
-              + mPhoneAccount
+              + phoneAccount
               + " with invalid phoneAccountHandle, ignoring");
       return;
     }
 
     int state = serviceState.getState();
-    if (state == mPreviousState
+    if (state == previousState
         || (state != ServiceState.STATE_IN_SERVICE
-            && mPreviousState != ServiceState.STATE_IN_SERVICE)) {
+            && previousState != ServiceState.STATE_IN_SERVICE)) {
       // Only interested in state changes or transitioning into or out of "in service".
       // Otherwise just quit.
-      mPreviousState = state;
+      previousState = state;
       return;
     }
 
-    OmtpVvmCarrierConfigHelper helper = new OmtpVvmCarrierConfigHelper(mContext, mPhoneAccount);
+    OmtpVvmCarrierConfigHelper helper = new OmtpVvmCarrierConfigHelper(context, phoneAccount);
 
     if (state == ServiceState.STATE_IN_SERVICE) {
       VoicemailStatusQueryHelper voicemailStatusQueryHelper =
-          new VoicemailStatusQueryHelper(mContext);
-      if (voicemailStatusQueryHelper.isVoicemailSourceConfigured(mPhoneAccount)) {
-        if (!voicemailStatusQueryHelper.isNotificationsChannelActive(mPhoneAccount)) {
-          VvmLog.v(TAG, "Notifications channel is active for " + mPhoneAccount);
+          new VoicemailStatusQueryHelper(context);
+      if (voicemailStatusQueryHelper.isVoicemailSourceConfigured(phoneAccount)) {
+        if (!voicemailStatusQueryHelper.isNotificationsChannelActive(phoneAccount)) {
+          VvmLog.v(TAG, "Notifications channel is active for " + phoneAccount);
           helper.handleEvent(
-              VoicemailStatus.edit(mContext, mPhoneAccount), OmtpEvents.NOTIFICATION_IN_SERVICE);
+              VoicemailStatus.edit(context, phoneAccount), OmtpEvents.NOTIFICATION_IN_SERVICE);
         }
       }
 
-      if (VvmAccountManager.isAccountActivated(mContext, mPhoneAccount)) {
-        VvmLog.v(TAG, "Signal returned: requesting resync for " + mPhoneAccount);
+      if (VvmAccountManager.isAccountActivated(context, phoneAccount)) {
+        VvmLog.v(TAG, "Signal returned: requesting resync for " + phoneAccount);
         // If the source is already registered, run a full sync in case something was missed
         // while signal was down.
-        SyncTask.start(mContext, mPhoneAccount);
+        SyncTask.start(context, phoneAccount);
       } else {
-        VvmLog.v(TAG, "Signal returned: reattempting activation for " + mPhoneAccount);
+        VvmLog.v(TAG, "Signal returned: reattempting activation for " + phoneAccount);
         // Otherwise initiate an activation because this means that an OMTP source was
         // recognized but either the activation text was not successfully sent or a response
         // was not received.
         helper.startActivation();
       }
     } else {
-      VvmLog.v(TAG, "Notifications channel is inactive for " + mPhoneAccount);
+      VvmLog.v(TAG, "Notifications channel is inactive for " + phoneAccount);
 
-      if (!VvmAccountManager.isAccountActivated(mContext, mPhoneAccount)) {
+      if (!VvmAccountManager.isAccountActivated(context, phoneAccount)) {
         return;
       }
       helper.handleEvent(
-          VoicemailStatus.edit(mContext, mPhoneAccount), OmtpEvents.NOTIFICATION_SERVICE_LOST);
+          VoicemailStatus.edit(context, phoneAccount), OmtpEvents.NOTIFICATION_SERVICE_LOST);
     }
-    mPreviousState = state;
+    previousState = state;
   }
 }
diff --git a/java/com/android/voicemail/impl/fetch/FetchVoicemailReceiver.java b/java/com/android/voicemail/impl/fetch/FetchVoicemailReceiver.java
index 0348a60..9fda373 100644
--- a/java/com/android/voicemail/impl/fetch/FetchVoicemailReceiver.java
+++ b/java/com/android/voicemail/impl/fetch/FetchVoicemailReceiver.java
@@ -64,13 +64,13 @@
   // Number of retries
   private static final int NETWORK_RETRY_COUNT = 3;
 
-  private ContentResolver mContentResolver;
-  private Uri mUri;
-  private VvmNetworkRequestCallback mNetworkCallback;
-  private Context mContext;
-  private String mUid;
-  private PhoneAccountHandle mPhoneAccount;
-  private int mRetryCount = NETWORK_RETRY_COUNT;
+  private ContentResolver contentResolver;
+  private Uri uri;
+  private VvmNetworkRequestCallback networkCallback;
+  private Context context;
+  private String uid;
+  private PhoneAccountHandle phoneAccount;
+  private int retryCount = NETWORK_RETRY_COUNT;
 
   @Override
   public void onReceive(final Context context, Intent intent) {
@@ -79,31 +79,31 @@
     }
     if (VoicemailContract.ACTION_FETCH_VOICEMAIL.equals(intent.getAction())) {
       VvmLog.i(TAG, "ACTION_FETCH_VOICEMAIL received");
-      mContext = context;
-      mContentResolver = context.getContentResolver();
-      mUri = intent.getData();
+      this.context = context;
+      contentResolver = context.getContentResolver();
+      uri = intent.getData();
 
-      if (mUri == null) {
+      if (uri == null) {
         VvmLog.w(TAG, VoicemailContract.ACTION_FETCH_VOICEMAIL + " intent sent with no data");
         return;
       }
 
       if (!context
           .getPackageName()
-          .equals(mUri.getQueryParameter(VoicemailContract.PARAM_KEY_SOURCE_PACKAGE))) {
+          .equals(uri.getQueryParameter(VoicemailContract.PARAM_KEY_SOURCE_PACKAGE))) {
         // Ignore if the fetch request is for a voicemail not from this package.
         VvmLog.e(TAG, "ACTION_FETCH_VOICEMAIL from foreign pacakge " + context.getPackageName());
         return;
       }
 
-      Cursor cursor = mContentResolver.query(mUri, PROJECTION, null, null, null);
+      Cursor cursor = contentResolver.query(uri, PROJECTION, null, null, null);
       if (cursor == null) {
         VvmLog.i(TAG, "ACTION_FETCH_VOICEMAIL query returned null");
         return;
       }
       try {
         if (cursor.moveToFirst()) {
-          mUid = cursor.getString(SOURCE_DATA);
+          uid = cursor.getString(SOURCE_DATA);
           String accountId = cursor.getString(PHONE_ACCOUNT_ID);
           if (TextUtils.isEmpty(accountId)) {
             TelephonyManager telephonyManager =
@@ -116,31 +116,31 @@
             }
           }
 
-          mPhoneAccount =
+          phoneAccount =
               new PhoneAccountHandle(
                   ComponentName.unflattenFromString(cursor.getString(PHONE_ACCOUNT_COMPONENT_NAME)),
                   cursor.getString(PHONE_ACCOUNT_ID));
           TelephonyManager telephonyManager =
               context
                   .getSystemService(TelephonyManager.class)
-                  .createForPhoneAccountHandle(mPhoneAccount);
+                  .createForPhoneAccountHandle(phoneAccount);
           if (telephonyManager == null) {
             // can happen when trying to fetch voicemails from a SIM that is no longer on the
             // device
             VvmLog.e(TAG, "account no longer valid, cannot retrieve message");
             return;
           }
-          if (!VvmAccountManager.isAccountActivated(context, mPhoneAccount)) {
-            mPhoneAccount = getAccountFromMarshmallowAccount(context, mPhoneAccount);
-            if (mPhoneAccount == null) {
+          if (!VvmAccountManager.isAccountActivated(context, phoneAccount)) {
+            phoneAccount = getAccountFromMarshmallowAccount(context, phoneAccount);
+            if (phoneAccount == null) {
               VvmLog.w(TAG, "Account not registered - cannot retrieve message.");
               return;
             }
             VvmLog.i(TAG, "Fetching voicemail with Marshmallow PhoneAccountHandle");
           }
           VvmLog.i(TAG, "Requesting network to fetch voicemail");
-          mNetworkCallback = new fetchVoicemailNetworkRequestCallback(context, mPhoneAccount);
-          mNetworkCallback.requestNetwork();
+          networkCallback = new fetchVoicemailNetworkRequestCallback(context, phoneAccount);
+          networkCallback.requestNetwork();
         }
       } finally {
         cursor.close();
@@ -203,16 +203,16 @@
           @Override
           public void run() {
             try {
-              while (mRetryCount > 0) {
-                VvmLog.i(TAG, "fetching voicemail, retry count=" + mRetryCount);
+              while (retryCount > 0) {
+                VvmLog.i(TAG, "fetching voicemail, retry count=" + retryCount);
                 try (ImapHelper imapHelper =
-                    new ImapHelper(mContext, mPhoneAccount, network, status)) {
+                    new ImapHelper(context, phoneAccount, network, status)) {
                   boolean success =
                       imapHelper.fetchVoicemailPayload(
-                          new VoicemailFetchedCallback(mContext, mUri, mPhoneAccount), mUid);
-                  if (!success && mRetryCount > 0) {
+                          new VoicemailFetchedCallback(context, uri, phoneAccount), uid);
+                  if (!success && retryCount > 0) {
                     VvmLog.i(TAG, "fetch voicemail failed, retrying");
-                    mRetryCount--;
+                    retryCount--;
                   } else {
                     return;
                   }
@@ -222,8 +222,8 @@
                 }
               }
             } finally {
-              if (mNetworkCallback != null) {
-                mNetworkCallback.releaseNetwork();
+              if (networkCallback != null) {
+                networkCallback.releaseNetwork();
               }
             }
           }
diff --git a/java/com/android/voicemail/impl/fetch/VoicemailFetchedCallback.java b/java/com/android/voicemail/impl/fetch/VoicemailFetchedCallback.java
index e8e14be..78dbdc0 100644
--- a/java/com/android/voicemail/impl/fetch/VoicemailFetchedCallback.java
+++ b/java/com/android/voicemail/impl/fetch/VoicemailFetchedCallback.java
@@ -40,16 +40,16 @@
 public class VoicemailFetchedCallback {
   private static final String TAG = "VoicemailFetchedCallback";
 
-  private final Context mContext;
-  private final ContentResolver mContentResolver;
-  private final Uri mUri;
-  private final PhoneAccountHandle mPhoneAccountHandle;
+  private final Context context;
+  private final ContentResolver contentResolver;
+  private final Uri uri;
+  private final PhoneAccountHandle phoneAccountHandle;
 
   public VoicemailFetchedCallback(Context context, Uri uri, PhoneAccountHandle phoneAccountHandle) {
-    mContext = context;
-    mContentResolver = context.getContentResolver();
-    mUri = uri;
-    mPhoneAccountHandle = phoneAccountHandle;
+    this.context = context;
+    contentResolver = context.getContentResolver();
+    this.uri = uri;
+    this.phoneAccountHandle = phoneAccountHandle;
   }
 
   /**
@@ -65,26 +65,26 @@
       ContentValues values = new ContentValues();
       values.put(
           Voicemails.TRANSCRIPTION,
-          mContext.getString(
+          context.getString(
               R.string.vvm_unsupported_message_format,
-              mContext
+              context
                   .getSystemService(TelecomManager.class)
-                  .getVoiceMailNumber(mPhoneAccountHandle)));
+                  .getVoiceMailNumber(phoneAccountHandle)));
       updateVoicemail(values);
       return;
     }
 
-    VvmLog.d(TAG, String.format("Writing new voicemail content: %s", mUri));
+    VvmLog.d(TAG, String.format("Writing new voicemail content: %s", uri));
     OutputStream outputStream = null;
 
     try {
-      outputStream = mContentResolver.openOutputStream(mUri);
+      outputStream = contentResolver.openOutputStream(uri);
       byte[] inputBytes = voicemailPayload.getBytes();
       if (inputBytes != null) {
         outputStream.write(inputBytes);
       }
     } catch (IOException e) {
-      VvmLog.w(TAG, String.format("File not found for %s", mUri));
+      VvmLog.w(TAG, String.format("File not found for %s", uri));
       return;
     } finally {
       IOUtils.closeQuietly(outputStream);
@@ -98,15 +98,15 @@
       ThreadUtil.postOnUiThread(
           () -> {
             if (!TranscriptionService.scheduleNewVoicemailTranscriptionJob(
-                mContext, mUri, mPhoneAccountHandle, true)) {
-              VvmLog.w(TAG, String.format("Failed to schedule transcription for %s", mUri));
+                context, uri, phoneAccountHandle, true)) {
+              VvmLog.w(TAG, String.format("Failed to schedule transcription for %s", uri));
             }
           });
     }
   }
 
   private boolean updateVoicemail(ContentValues values) {
-    int updatedCount = mContentResolver.update(mUri, values, null, null);
+    int updatedCount = contentResolver.update(uri, values, null, null);
     if (updatedCount != 1) {
       VvmLog.e(TAG, "Updating voicemail should have updated 1 row, was: " + updatedCount);
       return false;
diff --git a/java/com/android/voicemail/impl/imap/ImapHelper.java b/java/com/android/voicemail/impl/imap/ImapHelper.java
index a0e86dc..1f04edb 100644
--- a/java/com/android/voicemail/impl/imap/ImapHelper.java
+++ b/java/com/android/voicemail/impl/imap/ImapHelper.java
@@ -66,17 +66,17 @@
 
   private static final String TAG = "ImapHelper";
 
-  private ImapFolder mFolder;
-  private ImapStore mImapStore;
+  private ImapFolder folder;
+  private ImapStore imapStore;
 
-  private final Context mContext;
-  private final PhoneAccountHandle mPhoneAccount;
-  private final Network mNetwork;
-  private final Editor mStatus;
+  private final Context context;
+  private final PhoneAccountHandle phoneAccount;
+  private final Network network;
+  private final Editor status;
 
-  VisualVoicemailPreferences mPrefs;
+  VisualVoicemailPreferences prefs;
 
-  private final OmtpVvmCarrierConfigHelper mConfig;
+  private final OmtpVvmCarrierConfigHelper config;
 
   /** InitializingException */
   public static class InitializingException extends Exception {
@@ -104,30 +104,29 @@
       Network network,
       Editor status)
       throws InitializingException {
-    mContext = context;
-    mPhoneAccount = phoneAccount;
-    mNetwork = network;
-    mStatus = status;
-    mConfig = config;
-    mPrefs = new VisualVoicemailPreferences(context, phoneAccount);
+    this.context = context;
+    this.phoneAccount = phoneAccount;
+    this.network = network;
+    this.status = status;
+    this.config = config;
+    prefs = new VisualVoicemailPreferences(context, phoneAccount);
 
     try {
       TempDirectory.setTempDirectory(context);
 
-      String username = mPrefs.getString(OmtpConstants.IMAP_USER_NAME, null);
-      String password = mPrefs.getString(OmtpConstants.IMAP_PASSWORD, null);
-      String serverName = mPrefs.getString(OmtpConstants.SERVER_ADDRESS, null);
-      int port = Integer.parseInt(mPrefs.getString(OmtpConstants.IMAP_PORT, null));
+      String username = prefs.getString(OmtpConstants.IMAP_USER_NAME, null);
+      String password = prefs.getString(OmtpConstants.IMAP_PASSWORD, null);
+      String serverName = prefs.getString(OmtpConstants.SERVER_ADDRESS, null);
+      int port = Integer.parseInt(prefs.getString(OmtpConstants.IMAP_PORT, null));
       int auth = ImapStore.FLAG_NONE;
 
-      int sslPort = mConfig.getSslPort();
+      int sslPort = this.config.getSslPort();
       if (sslPort != 0) {
         port = sslPort;
         auth = ImapStore.FLAG_SSL;
       }
 
-      mImapStore =
-          new ImapStore(context, this, username, password, port, serverName, auth, network);
+      imapStore = new ImapStore(context, this, username, password, port, serverName, auth, network);
     } catch (NumberFormatException e) {
       handleEvent(OmtpEvents.DATA_INVALID_PORT);
       LogUtils.w(TAG, "Could not parse port number");
@@ -137,13 +136,13 @@
 
   @Override
   public void close() {
-    mImapStore.closeConnection();
+    imapStore.closeConnection();
   }
 
   public boolean isRoaming() {
     ConnectivityManager connectivityManager =
-        (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
-    NetworkInfo info = connectivityManager.getNetworkInfo(mNetwork);
+        (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
+    NetworkInfo info = connectivityManager.getNetworkInfo(network);
     if (info == null) {
       return false;
     }
@@ -151,11 +150,11 @@
   }
 
   public OmtpVvmCarrierConfigHelper getConfig() {
-    return mConfig;
+    return config;
   }
 
   public ImapConnection connect() {
-    return mImapStore.getConnection();
+    return imapStore.getConnection();
   }
 
   /** The caller thread will block until the method returns. */
@@ -169,7 +168,7 @@
   }
 
   public void handleEvent(OmtpEvents event) {
-    mConfig.handleEvent(mStatus, event);
+    config.handleEvent(status, event);
   }
 
   /**
@@ -184,9 +183,9 @@
       return false;
     }
     try {
-      mFolder = openImapFolder(ImapFolder.MODE_READ_WRITE);
-      if (mFolder != null) {
-        mFolder.setFlags(convertToImapMessages(voicemails), flags, true);
+      folder = openImapFolder(ImapFolder.MODE_READ_WRITE);
+      if (folder != null) {
+        folder.setFlags(convertToImapMessages(voicemails), flags, true);
         return true;
       }
       return false;
@@ -207,14 +206,14 @@
     List<Voicemail> result = new ArrayList<Voicemail>();
     Message[] messages;
     try {
-      mFolder = openImapFolder(ImapFolder.MODE_READ_WRITE);
-      if (mFolder == null) {
+      folder = openImapFolder(ImapFolder.MODE_READ_WRITE);
+      if (folder == null) {
         // This means we were unable to successfully open the folder.
         return null;
       }
 
       // This method retrieves lightweight messages containing only the uid of the message.
-      messages = mFolder.getMessages(null);
+      messages = folder.getMessages(null);
 
       for (Message message : messages) {
         // Get the voicemail details (message structure).
@@ -245,7 +244,7 @@
       FetchProfile fetchProfile = new FetchProfile();
       fetchProfile.add(messageStructureWrapper.transcriptionBodyPart);
 
-      mFolder.fetch(new Message[] {messageDetails}, fetchProfile, listener);
+      folder.fetch(new Message[] {messageDetails}, fetchProfile, listener);
     }
 
     // Found an audio attachment, this is a valid voicemail.
@@ -255,8 +254,8 @@
     Long duration = messageDetails.getDuration();
     Voicemail.Builder builder =
         Voicemail.createForInsertion(time, number)
-            .setPhoneAccount(mPhoneAccount)
-            .setSourcePackage(mContext.getPackageName())
+            .setPhoneAccount(phoneAccount)
+            .setSourcePackage(context.getPackageName())
             .setSourceData(messageDetails.getUid())
             .setIsRead(isRead)
             .setTranscription(listener.getVoicemailTranscription());
@@ -307,18 +306,18 @@
 
     // The IMAP folder fetch method will call "messageRetrieved" on the listener when the
     // message is successfully retrieved.
-    mFolder.fetch(new Message[] {message}, fetchProfile, listener);
+    folder.fetch(new Message[] {message}, fetchProfile, listener);
     return listener.getMessageStructure();
   }
 
   public boolean fetchVoicemailPayload(VoicemailFetchedCallback callback, final String uid) {
     try {
-      mFolder = openImapFolder(ImapFolder.MODE_READ_WRITE);
-      if (mFolder == null) {
+      folder = openImapFolder(ImapFolder.MODE_READ_WRITE);
+      if (folder == null) {
         // This means we were unable to successfully open the folder.
         return false;
       }
-      Message message = mFolder.getMessage(uid);
+      Message message = folder.getMessage(uid);
       if (message == null) {
         return false;
       }
@@ -345,19 +344,19 @@
     FetchProfile fetchProfile = new FetchProfile();
     fetchProfile.add(FetchProfile.Item.BODY);
 
-    mFolder.fetch(new Message[] {message}, fetchProfile, listener);
+    folder.fetch(new Message[] {message}, fetchProfile, listener);
     return listener.getVoicemailPayload();
   }
 
   public boolean fetchTranscription(TranscriptionFetchedCallback callback, String uid) {
     try {
-      mFolder = openImapFolder(ImapFolder.MODE_READ_WRITE);
-      if (mFolder == null) {
+      folder = openImapFolder(ImapFolder.MODE_READ_WRITE);
+      if (folder == null) {
         // This means we were unable to successfully open the folder.
         return false;
       }
 
-      Message message = mFolder.getMessage(uid);
+      Message message = folder.getMessage(uid);
       if (message == null) {
         return false;
       }
@@ -371,7 +370,7 @@
 
           // This method is called synchronously so the transcription will be populated
           // in the listener once the next method is called.
-          mFolder.fetch(new Message[] {message}, fetchProfile, listener);
+          folder.fetch(new Message[] {message}, fetchProfile, listener);
           callback.setVoicemailTranscription(listener.getVoicemailTranscription());
         }
       }
@@ -386,7 +385,7 @@
 
   @ChangePinResult
   public int changePin(String oldPin, String newPin) throws MessagingException {
-    ImapConnection connection = mImapStore.getConnection();
+    ImapConnection connection = imapStore.getConnection();
     try {
       String command =
           getConfig().getProtocol().getCommand(OmtpConstants.IMAP_CHANGE_TUI_PWD_FORMAT);
@@ -401,7 +400,7 @@
   }
 
   public void changeVoicemailTuiLanguage(String languageCode) throws MessagingException {
-    ImapConnection connection = mImapStore.getConnection();
+    ImapConnection connection = imapStore.getConnection();
     try {
       String command =
           getConfig().getProtocol().getCommand(OmtpConstants.IMAP_CHANGE_VM_LANG_FORMAT);
@@ -414,7 +413,7 @@
   }
 
   public void closeNewUserTutorial() throws MessagingException {
-    ImapConnection connection = mImapStore.getConnection();
+    ImapConnection connection = imapStore.getConnection();
     try {
       String command = getConfig().getProtocol().getCommand(OmtpConstants.IMAP_CLOSE_NUT);
       connection.executeSimpleCommand(command, false);
@@ -457,12 +456,12 @@
 
   public void updateQuota() {
     try {
-      mFolder = openImapFolder(ImapFolder.MODE_READ_WRITE);
-      if (mFolder == null) {
+      folder = openImapFolder(ImapFolder.MODE_READ_WRITE);
+      if (folder == null) {
         // This means we were unable to successfully open the folder.
         return;
       }
-      updateQuota(mFolder);
+      updateQuota(folder);
     } catch (MessagingException e) {
       LogUtils.e(TAG, e, "Messaging Exception");
     } finally {
@@ -473,13 +472,13 @@
   @Nullable
   public Quota getQuota() {
     try {
-      mFolder = openImapFolder(ImapFolder.MODE_READ_ONLY);
-      if (mFolder == null) {
+      folder = openImapFolder(ImapFolder.MODE_READ_ONLY);
+      if (folder == null) {
         // This means we were unable to successfully open the folder.
         LogUtils.e(TAG, "Unable to open folder");
         return null;
       }
-      return mFolder.getQuota();
+      return folder.getQuota();
     } catch (MessagingException e) {
       LogUtils.e(TAG, e, "Messaging Exception");
       return null;
@@ -505,7 +504,7 @@
             + quota.occupied
             + " new quota total:"
             + quota.total);
-    VoicemailStatus.edit(mContext, mPhoneAccount).setQuota(quota.occupied, quota.total).apply();
+    VoicemailStatus.edit(context, phoneAccount).setQuota(quota.occupied, quota.total).apply();
     LogUtils.i(TAG, "Updated quota occupied and total");
   }
 
@@ -525,12 +524,12 @@
   private final class MessageStructureFetchedListener
       implements ImapFolder.MessageRetrievalListener {
 
-    private MessageStructureWrapper mMessageStructure;
+    private MessageStructureWrapper messageStructure;
 
     public MessageStructureFetchedListener() {}
 
     public MessageStructureWrapper getMessageStructure() {
-      return mMessageStructure;
+      return messageStructure;
     }
 
     @Override
@@ -538,8 +537,8 @@
       LogUtils.d(TAG, "Fetched message structure for " + message.getUid());
       LogUtils.d(TAG, "Message retrieved: " + message);
       try {
-        mMessageStructure = getMessageOrNull(message);
-        if (mMessageStructure == null) {
+        messageStructure = getMessageOrNull(message);
+        if (messageStructure == null) {
           LogUtils.d(TAG, "This voicemail does not have an attachment...");
           return;
         }
@@ -591,11 +590,11 @@
   /** Listener for the message body being fetched. */
   private final class MessageBodyFetchedListener implements ImapFolder.MessageRetrievalListener {
 
-    private VoicemailPayload mVoicemailPayload;
+    private VoicemailPayload voicemailPayload;
 
     /** Returns the fetch voicemail payload. */
     public VoicemailPayload getVoicemailPayload() {
-      return mVoicemailPayload;
+      return voicemailPayload;
     }
 
     @Override
@@ -603,7 +602,7 @@
       LogUtils.d(TAG, "Fetched message body for " + message.getUid());
       LogUtils.d(TAG, "Message retrieved: " + message);
       try {
-        mVoicemailPayload = getVoicemailPayloadFromMessage(message);
+        voicemailPayload = getVoicemailPayloadFromMessage(message);
       } catch (MessagingException e) {
         LogUtils.e(TAG, "Messaging Exception:", e);
       } catch (IOException e) {
@@ -633,18 +632,18 @@
   /** Listener for the transcription being fetched. */
   private final class TranscriptionFetchedListener implements ImapFolder.MessageRetrievalListener {
 
-    private String mVoicemailTranscription;
+    private String voicemailTranscription;
 
     /** Returns the fetched voicemail transcription. */
     public String getVoicemailTranscription() {
-      return mVoicemailTranscription;
+      return voicemailTranscription;
     }
 
     @Override
     public void messageRetrieved(Message message) {
       LogUtils.d(TAG, "Fetched transcription for " + message.getUid());
       try {
-        mVoicemailTranscription = new String(getDataFromBody(message.getBody()));
+        voicemailTranscription = new String(getDataFromBody(message.getBody()));
       } catch (MessagingException e) {
         LogUtils.e(TAG, "Messaging Exception:", e);
       } catch (IOException e) {
@@ -655,10 +654,10 @@
 
   private ImapFolder openImapFolder(String modeReadWrite) {
     try {
-      if (mImapStore == null) {
+      if (imapStore == null) {
         return null;
       }
-      ImapFolder folder = new ImapFolder(mImapStore, ImapConstants.INBOX);
+      ImapFolder folder = new ImapFolder(imapStore, ImapConstants.INBOX);
       folder.open(modeReadWrite);
       return folder;
     } catch (MessagingException e) {
@@ -677,8 +676,8 @@
   }
 
   private void closeImapFolder() {
-    if (mFolder != null) {
-      mFolder.close(true);
+    if (folder != null) {
+      folder.close(true);
     }
   }
 
diff --git a/java/com/android/voicemail/impl/imap/VoicemailPayload.java b/java/com/android/voicemail/impl/imap/VoicemailPayload.java
index 69befb4..e917264 100644
--- a/java/com/android/voicemail/impl/imap/VoicemailPayload.java
+++ b/java/com/android/voicemail/impl/imap/VoicemailPayload.java
@@ -18,19 +18,19 @@
 
 /** The payload for a voicemail, usually audio data. */
 public class VoicemailPayload {
-  private final String mMimeType;
-  private final byte[] mBytes;
+  private final String mimeType;
+  private final byte[] bytes;
 
   public VoicemailPayload(String mimeType, byte[] bytes) {
-    mMimeType = mimeType;
-    mBytes = bytes;
+    this.mimeType = mimeType;
+    this.bytes = bytes;
   }
 
   public byte[] getBytes() {
-    return mBytes;
+    return bytes;
   }
 
   public String getMimeType() {
-    return mMimeType;
+    return mimeType;
   }
 }
diff --git a/java/com/android/voicemail/impl/mail/Address.java b/java/com/android/voicemail/impl/mail/Address.java
index ac8e8a2..7556e4d 100644
--- a/java/com/android/voicemail/impl/mail/Address.java
+++ b/java/com/android/voicemail/impl/mail/Address.java
@@ -39,19 +39,19 @@
 public class Address implements Parcelable {
   public static final String ADDRESS_DELIMETER = ",";
   /** Address part, in the form local_part@domain_part. No surrounding angle brackets. */
-  private String mAddress;
+  private String address;
 
   /**
    * Name part. No surrounding double quote, and no MIME/base64 encoding. This must be null if
    * Address has no name part.
    */
-  private String mPersonal;
+  private String personal;
 
   /**
    * When personal is set, it will return the first token of the personal string. Otherwise, it will
    * return the e-mail address up to the '@' sign.
    */
-  private String mSimplifiedName;
+  private String simplifiedName;
 
   // Regex that matches address surrounded by '<>' optionally. '^<?([^>]+)>?$'
   private static final Pattern REMOVE_OPTIONAL_BRACKET = Pattern.compile("^<?([^>]+)>?$");
@@ -96,26 +96,26 @@
    * first token of that name. Otherwise, it will return the e-mail address up to the '@' sign.
    */
   public String getSimplifiedName() {
-    if (mSimplifiedName == null) {
-      if (TextUtils.isEmpty(mPersonal) && !TextUtils.isEmpty(mAddress)) {
-        int atSign = mAddress.indexOf('@');
-        mSimplifiedName = (atSign != -1) ? mAddress.substring(0, atSign) : "";
-      } else if (!TextUtils.isEmpty(mPersonal)) {
+    if (simplifiedName == null) {
+      if (TextUtils.isEmpty(personal) && !TextUtils.isEmpty(address)) {
+        int atSign = address.indexOf('@');
+        simplifiedName = (atSign != -1) ? address.substring(0, atSign) : "";
+      } else if (!TextUtils.isEmpty(personal)) {
 
         // TODO: use Contacts' NameSplitter for more reliable first-name extraction
 
-        int end = mPersonal.indexOf(' ');
-        while (end > 0 && mPersonal.charAt(end - 1) == ',') {
+        int end = personal.indexOf(' ');
+        while (end > 0 && personal.charAt(end - 1) == ',') {
           end--;
         }
-        mSimplifiedName = (end < 1) ? mPersonal : mPersonal.substring(0, end);
+        simplifiedName = (end < 1) ? personal : personal.substring(0, end);
 
       } else {
         LogUtils.w(LOG_TAG, "Unable to get a simplified name");
-        mSimplifiedName = "";
+        simplifiedName = "";
       }
     }
-    return mSimplifiedName;
+    return simplifiedName;
   }
 
   public static synchronized Address getEmailAddress(String rawAddress) {
@@ -137,11 +137,11 @@
   }
 
   public String getAddress() {
-    return mAddress;
+    return address;
   }
 
   public void setAddress(String address) {
-    mAddress = REMOVE_OPTIONAL_BRACKET.matcher(address).replaceAll("$1");
+    this.address = REMOVE_OPTIONAL_BRACKET.matcher(address).replaceAll("$1");
   }
 
   /**
@@ -150,7 +150,7 @@
    * @return Name part of email address. Returns null if it is omitted.
    */
   public String getPersonal() {
-    return mPersonal;
+    return personal;
   }
 
   /**
@@ -160,7 +160,7 @@
    * @param personal name part of email address as UTF-16 string. Null is acceptable.
    */
   public void setPersonal(String personal) {
-    mPersonal = decodeAddressPersonal(personal);
+    this.personal = decodeAddressPersonal(personal);
   }
 
   /**
@@ -265,14 +265,14 @@
    */
   @Override
   public String toString() {
-    if (mPersonal != null && !mPersonal.equals(mAddress)) {
-      if (mPersonal.matches(".*[\\(\\)<>@,;:\\\\\".\\[\\]].*")) {
-        return ensureQuotedString(mPersonal) + " <" + mAddress + ">";
+    if (personal != null && !personal.equals(address)) {
+      if (personal.matches(".*[\\(\\)<>@,;:\\\\\".\\[\\]].*")) {
+        return ensureQuotedString(personal) + " <" + address + ">";
       } else {
-        return mPersonal + " <" + mAddress + ">";
+        return personal + " <" + address + ">";
       }
     } else {
-      return mAddress;
+      return address;
     }
   }
 
@@ -336,10 +336,10 @@
    *     and MIME/base64 encoded if necessary.
    */
   public String toHeader() {
-    if (mPersonal != null) {
-      return EncoderUtil.encodeAddressDisplayName(mPersonal) + " <" + mAddress + ">";
+    if (personal != null) {
+      return EncoderUtil.encodeAddressDisplayName(personal) + " <" + address + ">";
     } else {
-      return mAddress;
+      return address;
     }
   }
 
@@ -374,10 +374,10 @@
    */
   @VisibleForTesting
   public String toFriendly() {
-    if (mPersonal != null && mPersonal.length() > 0) {
-      return mPersonal;
+    if (personal != null && personal.length() > 0) {
+      return personal;
     } else {
-      return mAddress;
+      return address;
     }
   }
 
@@ -516,7 +516,7 @@
 
   @Override
   public void writeToParcel(Parcel out, int flags) {
-    out.writeString(mPersonal);
-    out.writeString(mAddress);
+    out.writeString(personal);
+    out.writeString(address);
   }
 }
diff --git a/java/com/android/voicemail/impl/mail/Base64Body.java b/java/com/android/voicemail/impl/mail/Base64Body.java
index def94db..5c14296 100644
--- a/java/com/android/voicemail/impl/mail/Base64Body.java
+++ b/java/com/android/voicemail/impl/mail/Base64Body.java
@@ -23,17 +23,17 @@
 import org.apache.commons.io.IOUtils;
 
 public class Base64Body implements Body {
-  private final InputStream mSource;
+  private final InputStream source;
   // Because we consume the input stream, we can only write out once
-  private boolean mAlreadyWritten;
+  private boolean alreadyWritten;
 
   public Base64Body(InputStream source) {
-    mSource = source;
+    this.source = source;
   }
 
   @Override
   public InputStream getInputStream() throws MessagingException {
-    return mSource;
+    return source;
   }
 
   /**
@@ -47,15 +47,15 @@
   @Override
   public void writeTo(OutputStream out)
       throws IllegalStateException, IOException, MessagingException {
-    if (mAlreadyWritten) {
+    if (alreadyWritten) {
       throw new IllegalStateException("Base64Body can only be written once");
     }
-    mAlreadyWritten = true;
+    alreadyWritten = true;
     try {
       final Base64OutputStream b64out = new Base64OutputStream(out, Base64.DEFAULT);
-      IOUtils.copyLarge(mSource, b64out);
+      IOUtils.copyLarge(source, b64out);
     } finally {
-      mSource.close();
+      source.close();
     }
   }
 }
diff --git a/java/com/android/voicemail/impl/mail/BodyPart.java b/java/com/android/voicemail/impl/mail/BodyPart.java
index 3d15d4b..669b088 100644
--- a/java/com/android/voicemail/impl/mail/BodyPart.java
+++ b/java/com/android/voicemail/impl/mail/BodyPart.java
@@ -16,9 +16,9 @@
 package com.android.voicemail.impl.mail;
 
 public abstract class BodyPart implements Part {
-  protected Multipart mParent;
+  protected Multipart parent;
 
   public Multipart getParent() {
-    return mParent;
+    return parent;
   }
 }
diff --git a/java/com/android/voicemail/impl/mail/FixedLengthInputStream.java b/java/com/android/voicemail/impl/mail/FixedLengthInputStream.java
index bd3c164..473281e 100644
--- a/java/com/android/voicemail/impl/mail/FixedLengthInputStream.java
+++ b/java/com/android/voicemail/impl/mail/FixedLengthInputStream.java
@@ -24,25 +24,25 @@
  * where the protocol handler intended the client to read.
  */
 public class FixedLengthInputStream extends InputStream {
-  private final InputStream mIn;
-  private final int mLength;
-  private int mCount;
+  private final InputStream in;
+  private final int length;
+  private int count;
 
   public FixedLengthInputStream(InputStream in, int length) {
-    this.mIn = in;
-    this.mLength = length;
+    this.in = in;
+    this.length = length;
   }
 
   @Override
   public int available() throws IOException {
-    return mLength - mCount;
+    return length - count;
   }
 
   @Override
   public int read() throws IOException {
-    if (mCount < mLength) {
-      mCount++;
-      return mIn.read();
+    if (count < length) {
+      count++;
+      return in.read();
     } else {
       return -1;
     }
@@ -50,12 +50,12 @@
 
   @Override
   public int read(byte[] b, int offset, int length) throws IOException {
-    if (mCount < mLength) {
-      int d = mIn.read(b, offset, Math.min(mLength - mCount, length));
+    if (count < this.length) {
+      int d = in.read(b, offset, Math.min(this.length - count, length));
       if (d == -1) {
         return -1;
       } else {
-        mCount += d;
+        count += d;
         return d;
       }
     } else {
@@ -69,11 +69,11 @@
   }
 
   public int getLength() {
-    return mLength;
+    return length;
   }
 
   @Override
   public String toString() {
-    return String.format("FixedLengthInputStream(in=%s, length=%d)", mIn.toString(), mLength);
+    return String.format("FixedLengthInputStream(in=%s, length=%d)", in.toString(), length);
   }
 }
diff --git a/java/com/android/voicemail/impl/mail/MailTransport.java b/java/com/android/voicemail/impl/mail/MailTransport.java
index c35e414..a2a6a69 100644
--- a/java/com/android/voicemail/impl/mail/MailTransport.java
+++ b/java/com/android/voicemail/impl/mail/MailTransport.java
@@ -52,17 +52,17 @@
   private static final HostnameVerifier HOSTNAME_VERIFIER =
       HttpsURLConnection.getDefaultHostnameVerifier();
 
-  private final Context mContext;
-  private final ImapHelper mImapHelper;
-  private final Network mNetwork;
-  private final String mHost;
-  private final int mPort;
-  private Socket mSocket;
-  private BufferedInputStream mIn;
-  private BufferedOutputStream mOut;
-  private final int mFlags;
-  private SocketCreator mSocketCreator;
-  private InetSocketAddress mAddress;
+  private final Context context;
+  private final ImapHelper imapHelper;
+  private final Network network;
+  private final String host;
+  private final int port;
+  private Socket socket;
+  private BufferedInputStream in;
+  private BufferedOutputStream out;
+  private final int flags;
+  private SocketCreator socketCreator;
+  private InetSocketAddress address;
 
   public MailTransport(
       Context context,
@@ -71,12 +71,12 @@
       String address,
       int port,
       int flags) {
-    mContext = context;
-    mImapHelper = imapHelper;
-    mNetwork = network;
-    mHost = address;
-    mPort = port;
-    mFlags = flags;
+    this.context = context;
+    this.imapHelper = imapHelper;
+    this.network = network;
+    host = address;
+    this.port = port;
+    this.flags = flags;
   }
 
   /**
@@ -85,15 +85,15 @@
    */
   @Override
   public MailTransport clone() {
-    return new MailTransport(mContext, mImapHelper, mNetwork, mHost, mPort, mFlags);
+    return new MailTransport(context, imapHelper, network, host, port, flags);
   }
 
   public boolean canTrySslSecurity() {
-    return (mFlags & ImapStore.FLAG_SSL) != 0;
+    return (flags & ImapStore.FLAG_SSL) != 0;
   }
 
   public boolean canTrustAllCertificates() {
-    return (mFlags & ImapStore.FLAG_TRUST_ALL) != 0;
+    return (flags & ImapStore.FLAG_TRUST_ALL) != 0;
   }
 
   /**
@@ -101,36 +101,36 @@
    * SSL connection if indicated.
    */
   public void open() throws MessagingException {
-    LogUtils.d(TAG, "*** IMAP open " + mHost + ":" + String.valueOf(mPort));
+    LogUtils.d(TAG, "*** IMAP open " + host + ":" + String.valueOf(port));
 
     List<InetSocketAddress> socketAddresses = new ArrayList<InetSocketAddress>();
 
-    if (mNetwork == null) {
-      socketAddresses.add(new InetSocketAddress(mHost, mPort));
+    if (network == null) {
+      socketAddresses.add(new InetSocketAddress(host, port));
     } else {
       try {
-        InetAddress[] inetAddresses = mNetwork.getAllByName(mHost);
+        InetAddress[] inetAddresses = network.getAllByName(host);
         if (inetAddresses.length == 0) {
           throw new MessagingException(
               MessagingException.IOERROR,
-              "Host name " + mHost + "cannot be resolved on designated network");
+              "Host name " + host + "cannot be resolved on designated network");
         }
         for (int i = 0; i < inetAddresses.length; i++) {
-          socketAddresses.add(new InetSocketAddress(inetAddresses[i], mPort));
+          socketAddresses.add(new InetSocketAddress(inetAddresses[i], port));
         }
       } catch (IOException ioe) {
         LogUtils.d(TAG, ioe.toString());
-        mImapHelper.handleEvent(OmtpEvents.DATA_CANNOT_RESOLVE_HOST_ON_NETWORK);
+        imapHelper.handleEvent(OmtpEvents.DATA_CANNOT_RESOLVE_HOST_ON_NETWORK);
         throw new MessagingException(MessagingException.IOERROR, ioe.toString());
       }
     }
 
     boolean success = false;
     while (socketAddresses.size() > 0) {
-      mSocket = createSocket();
+      socket = createSocket();
       try {
-        mAddress = socketAddresses.remove(0);
-        mSocket.connect(mAddress, SOCKET_CONNECT_TIMEOUT);
+        address = socketAddresses.remove(0);
+        socket.connect(address, SOCKET_CONNECT_TIMEOUT);
 
         if (canTrySslSecurity()) {
           /*
@@ -140,9 +140,9 @@
            */
           reopenTls();
         } else {
-          mIn = new BufferedInputStream(mSocket.getInputStream(), 1024);
-          mOut = new BufferedOutputStream(mSocket.getOutputStream(), 512);
-          mSocket.setSoTimeout(SOCKET_READ_TIMEOUT);
+          in = new BufferedInputStream(socket.getInputStream(), 1024);
+          out = new BufferedOutputStream(socket.getOutputStream(), 512);
+          socket.setSoTimeout(SOCKET_READ_TIMEOUT);
         }
         success = true;
         return;
@@ -150,14 +150,14 @@
         LogUtils.d(TAG, ioe.toString());
         if (socketAddresses.size() == 0) {
           // Only throw an error when there are no more sockets to try.
-          mImapHelper.handleEvent(OmtpEvents.DATA_ALL_SOCKET_CONNECTION_FAILED);
+          imapHelper.handleEvent(OmtpEvents.DATA_ALL_SOCKET_CONNECTION_FAILED);
           throw new MessagingException(MessagingException.IOERROR, ioe.toString());
         }
       } finally {
         if (!success) {
           try {
-            mSocket.close();
-            mSocket = null;
+            socket.close();
+            socket = null;
           } catch (IOException ioe) {
             throw new MessagingException(MessagingException.IOERROR, ioe.toString());
           }
@@ -175,15 +175,15 @@
 
   @VisibleForTesting
   void setSocketCreator(SocketCreator creator) {
-    mSocketCreator = creator;
+    socketCreator = creator;
   }
 
   protected Socket createSocket() throws MessagingException {
-    if (mSocketCreator != null) {
-      return mSocketCreator.createSocket();
+    if (socketCreator != null) {
+      return socketCreator.createSocket();
     }
 
-    if (mNetwork == null) {
+    if (network == null) {
       LogUtils.v(TAG, "createSocket: network not specified");
       return new Socket();
     }
@@ -191,7 +191,7 @@
     try {
       LogUtils.v(TAG, "createSocket: network specified");
       TrafficStats.setThreadStatsTag(TrafficStatsTags.VISUAL_VOICEMAIL_TAG);
-      return mNetwork.getSocketFactory().createSocket();
+      return network.getSocketFactory().createSocket();
     } catch (IOException ioe) {
       LogUtils.d(TAG, ioe.toString());
       throw new MessagingException(MessagingException.IOERROR, ioe.toString());
@@ -204,17 +204,17 @@
   public void reopenTls() throws MessagingException {
     try {
       LogUtils.d(TAG, "open: converting to TLS socket");
-      mSocket =
+      socket =
           HttpsURLConnection.getDefaultSSLSocketFactory()
-              .createSocket(mSocket, mAddress.getHostName(), mAddress.getPort(), true);
+              .createSocket(socket, address.getHostName(), address.getPort(), true);
       // After the socket connects to an SSL server, confirm that the hostname is as
       // expected
       if (!canTrustAllCertificates()) {
-        verifyHostname(mSocket, mHost);
+        verifyHostname(socket, host);
       }
-      mSocket.setSoTimeout(SOCKET_READ_TIMEOUT);
-      mIn = new BufferedInputStream(mSocket.getInputStream(), 1024);
-      mOut = new BufferedOutputStream(mSocket.getOutputStream(), 512);
+      socket.setSoTimeout(SOCKET_READ_TIMEOUT);
+      in = new BufferedInputStream(socket.getInputStream(), 1024);
+      out = new BufferedOutputStream(socket.getOutputStream(), 512);
 
     } catch (SSLException e) {
       LogUtils.d(TAG, e.toString());
@@ -248,7 +248,7 @@
 
     SSLSession session = ssl.getSession();
     if (session == null) {
-      mImapHelper.handleEvent(OmtpEvents.DATA_CANNOT_ESTABLISH_SSL_SESSION);
+      imapHelper.handleEvent(OmtpEvents.DATA_CANNOT_ESTABLISH_SSL_SESSION);
       throw new SSLException("Cannot verify SSL socket without session");
     }
     // TODO: Instead of reporting the name of the server we think we're connecting to,
@@ -256,52 +256,52 @@
     // in the verifier code and is not available in the verifier API, and extracting the
     // CN & alts is beyond the scope of this patch.
     if (!HOSTNAME_VERIFIER.verify(hostname, session)) {
-      mImapHelper.handleEvent(OmtpEvents.DATA_SSL_INVALID_HOST_NAME);
+      imapHelper.handleEvent(OmtpEvents.DATA_SSL_INVALID_HOST_NAME);
       throw new SSLPeerUnverifiedException(
           "Certificate hostname not useable for server: " + session.getPeerPrincipal());
     }
   }
 
   public boolean isOpen() {
-    return (mIn != null
-        && mOut != null
-        && mSocket != null
-        && mSocket.isConnected()
-        && !mSocket.isClosed());
+    return (in != null
+        && out != null
+        && socket != null
+        && socket.isConnected()
+        && !socket.isClosed());
   }
 
   /** Close the connection. MUST NOT return any exceptions - must be "best effort" and safe. */
   public void close() {
     try {
-      mIn.close();
+      in.close();
     } catch (Exception e) {
       // May fail if the connection is already closed.
     }
     try {
-      mOut.close();
+      out.close();
     } catch (Exception e) {
       // May fail if the connection is already closed.
     }
     try {
-      mSocket.close();
+      socket.close();
     } catch (Exception e) {
       // May fail if the connection is already closed.
     }
-    mIn = null;
-    mOut = null;
-    mSocket = null;
+    in = null;
+    out = null;
+    socket = null;
   }
 
   public String getHost() {
-    return mHost;
+    return host;
   }
 
   public InputStream getInputStream() {
-    return mIn;
+    return in;
   }
 
   public OutputStream getOutputStream() {
-    return mOut;
+    return out;
   }
 
   /** Writes a single line to the server using \r\n termination. */
diff --git a/java/com/android/voicemail/impl/mail/Message.java b/java/com/android/voicemail/impl/mail/Message.java
index ca65d3d..4e2c642 100644
--- a/java/com/android/voicemail/impl/mail/Message.java
+++ b/java/com/android/voicemail/impl/mail/Message.java
@@ -33,18 +33,18 @@
     BCC,
   }
 
-  protected String mUid;
+  protected String uid;
 
-  private HashSet<String> mFlags = null;
+  private HashSet<String> flags = null;
 
-  protected Date mInternalDate;
+  protected Date internalDate;
 
   public String getUid() {
-    return mUid;
+    return uid;
   }
 
   public void setUid(String uid) {
-    this.mUid = uid;
+    this.uid = uid;
   }
 
   public abstract String getSubject() throws MessagingException;
@@ -52,11 +52,11 @@
   public abstract void setSubject(String subject) throws MessagingException;
 
   public Date getInternalDate() {
-    return mInternalDate;
+    return internalDate;
   }
 
   public void setInternalDate(Date internalDate) {
-    this.mInternalDate = internalDate;
+    this.internalDate = internalDate;
   }
 
   public abstract Date getReceivedDate() throws MessagingException;
@@ -95,10 +95,10 @@
   }
 
   private HashSet<String> getFlagSet() {
-    if (mFlags == null) {
-      mFlags = new HashSet<String>();
+    if (flags == null) {
+      flags = new HashSet<String>();
     }
-    return mFlags;
+    return flags;
   }
 
   /*
@@ -145,6 +145,6 @@
 
   @Override
   public String toString() {
-    return getClass().getSimpleName() + ':' + mUid;
+    return getClass().getSimpleName() + ':' + uid;
   }
 }
diff --git a/java/com/android/voicemail/impl/mail/MessagingException.java b/java/com/android/voicemail/impl/mail/MessagingException.java
index c1e3051..fda5fbc 100644
--- a/java/com/android/voicemail/impl/mail/MessagingException.java
+++ b/java/com/android/voicemail/impl/mail/MessagingException.java
@@ -70,9 +70,9 @@
   /** The server indicates it experienced an internal error */
   public static final int SERVER_ERROR = 19;
 
-  protected int mExceptionType;
+  protected int exceptionType;
   // Exception type-specific data
-  protected Object mExceptionData;
+  protected Object exceptionData;
 
   public MessagingException(String message, Throwable throwable) {
     this(UNSPECIFIED_EXCEPTION, message, throwable);
@@ -80,8 +80,8 @@
 
   public MessagingException(int exceptionType, String message, Throwable throwable) {
     super(message, throwable);
-    mExceptionType = exceptionType;
-    mExceptionData = null;
+    this.exceptionType = exceptionType;
+    exceptionData = null;
   }
 
   /**
@@ -120,8 +120,8 @@
    */
   public MessagingException(int exceptionType, String message, Object data) {
     super(message);
-    mExceptionType = exceptionType;
-    mExceptionData = data;
+    this.exceptionType = exceptionType;
+    exceptionData = data;
   }
 
   /**
@@ -130,7 +130,7 @@
    * @return Returns the exception type.
    */
   public int getExceptionType() {
-    return mExceptionType;
+    return exceptionType;
   }
   /**
    * Return the exception data. Will be null if not explicitly set.
@@ -138,6 +138,6 @@
    * @return Returns the exception data.
    */
   public Object getExceptionData() {
-    return mExceptionData;
+    return exceptionData;
   }
 }
diff --git a/java/com/android/voicemail/impl/mail/Multipart.java b/java/com/android/voicemail/impl/mail/Multipart.java
index e8d5046..c226ca5 100644
--- a/java/com/android/voicemail/impl/mail/Multipart.java
+++ b/java/com/android/voicemail/impl/mail/Multipart.java
@@ -18,45 +18,45 @@
 import java.util.ArrayList;
 
 public abstract class Multipart implements Body {
-  protected Part mParent;
+  protected Part parent;
 
-  protected ArrayList<BodyPart> mParts = new ArrayList<BodyPart>();
+  protected ArrayList<BodyPart> parts = new ArrayList<BodyPart>();
 
-  protected String mContentType;
+  protected String contentType;
 
   public void addBodyPart(BodyPart part) throws MessagingException {
-    mParts.add(part);
+    parts.add(part);
   }
 
   public void addBodyPart(BodyPart part, int index) throws MessagingException {
-    mParts.add(index, part);
+    parts.add(index, part);
   }
 
   public BodyPart getBodyPart(int index) throws MessagingException {
-    return mParts.get(index);
+    return parts.get(index);
   }
 
   public String getContentType() throws MessagingException {
-    return mContentType;
+    return contentType;
   }
 
   public int getCount() throws MessagingException {
-    return mParts.size();
+    return parts.size();
   }
 
   public boolean removeBodyPart(BodyPart part) throws MessagingException {
-    return mParts.remove(part);
+    return parts.remove(part);
   }
 
   public void removeBodyPart(int index) throws MessagingException {
-    mParts.remove(index);
+    parts.remove(index);
   }
 
   public Part getParent() throws MessagingException {
-    return mParent;
+    return parent;
   }
 
   public void setParent(Part parent) throws MessagingException {
-    this.mParent = parent;
+    this.parent = parent;
   }
 }
diff --git a/java/com/android/voicemail/impl/mail/PackedString.java b/java/com/android/voicemail/impl/mail/PackedString.java
index 701dab6..de04b6b 100644
--- a/java/com/android/voicemail/impl/mail/PackedString.java
+++ b/java/com/android/voicemail/impl/mail/PackedString.java
@@ -36,8 +36,8 @@
 
   private static final char DELIMITER_TAG = '\2';
 
-  private String mString;
-  private ArrayMap<String, String> mExploded;
+  private String string;
+  private ArrayMap<String, String> exploded;
   private static final ArrayMap<String, String> EMPTY_MAP = new ArrayMap<String, String>();
 
   /**
@@ -46,8 +46,8 @@
    * @param string packed string
    */
   public PackedString(String string) {
-    mString = string;
-    mExploded = null;
+    this.string = string;
+    exploded = null;
   }
 
   /**
@@ -57,10 +57,10 @@
    * @return returns value, or null if no string is found
    */
   public String get(String tag) {
-    if (mExploded == null) {
-      mExploded = explode(mString);
+    if (exploded == null) {
+      exploded = explode(string);
     }
-    return mExploded.get(tag);
+    return exploded.get(tag);
   }
 
   /**
@@ -70,10 +70,10 @@
    * @return a map of the values in the packed string
    */
   public Map<String, String> unpack() {
-    if (mExploded == null) {
-      mExploded = explode(mString);
+    if (exploded == null) {
+      exploded = explode(string);
     }
-    return new ArrayMap<String, String>(mExploded);
+    return new ArrayMap<String, String>(exploded);
   }
 
   /** Read out all values into a map. */
@@ -118,16 +118,16 @@
    * PackedString representations.
    */
   public static class Builder {
-    ArrayMap<String, String> mMap;
+    ArrayMap<String, String> map;
 
     /** Create a builder that's empty (for filling) */
     public Builder() {
-      mMap = new ArrayMap<String, String>();
+      map = new ArrayMap<String, String>();
     }
 
     /** Create a builder using the values of an existing PackedString (for editing). */
     public Builder(String packed) {
-      mMap = explode(packed);
+      map = explode(packed);
     }
 
     /**
@@ -138,9 +138,9 @@
      */
     public void put(String tag, String value) {
       if (value == null) {
-        mMap.remove(tag);
+        map.remove(tag);
       } else {
-        mMap.put(tag, value);
+        map.put(tag, value);
       }
     }
 
@@ -151,14 +151,14 @@
      * @return returns value, or null if no string is found
      */
     public String get(String tag) {
-      return mMap.get(tag);
+      return map.get(tag);
     }
 
     /** Pack the values and return a single, encoded string */
     @Override
     public String toString() {
       StringBuilder sb = new StringBuilder();
-      for (Map.Entry<String, String> entry : mMap.entrySet()) {
+      for (Map.Entry<String, String> entry : map.entrySet()) {
         if (sb.length() > 0) {
           sb.append(DELIMITER_ELEMENT);
         }
diff --git a/java/com/android/voicemail/impl/mail/PeekableInputStream.java b/java/com/android/voicemail/impl/mail/PeekableInputStream.java
index 08f867f..cc362e8 100644
--- a/java/com/android/voicemail/impl/mail/PeekableInputStream.java
+++ b/java/com/android/voicemail/impl/mail/PeekableInputStream.java
@@ -25,40 +25,40 @@
  * will still return the peeked byte.
  */
 public class PeekableInputStream extends InputStream {
-  private final InputStream mIn;
-  private boolean mPeeked;
-  private int mPeekedByte;
+  private final InputStream in;
+  private boolean peeked;
+  private int peekedByte;
 
   public PeekableInputStream(InputStream in) {
-    this.mIn = in;
+    this.in = in;
   }
 
   @Override
   public int read() throws IOException {
-    if (!mPeeked) {
-      return mIn.read();
+    if (!peeked) {
+      return in.read();
     } else {
-      mPeeked = false;
-      return mPeekedByte;
+      peeked = false;
+      return peekedByte;
     }
   }
 
   public int peek() throws IOException {
-    if (!mPeeked) {
-      mPeekedByte = read();
-      mPeeked = true;
+    if (!peeked) {
+      peekedByte = read();
+      peeked = true;
     }
-    return mPeekedByte;
+    return peekedByte;
   }
 
   @Override
   public int read(byte[] b, int offset, int length) throws IOException {
-    if (!mPeeked) {
-      return mIn.read(b, offset, length);
+    if (!peeked) {
+      return in.read(b, offset, length);
     } else {
-      b[0] = (byte) mPeekedByte;
-      mPeeked = false;
-      int r = mIn.read(b, offset + 1, length - 1);
+      b[0] = (byte) peekedByte;
+      peeked = false;
+      int r = in.read(b, offset + 1, length - 1);
       if (r == -1) {
         return 1;
       } else {
@@ -75,7 +75,6 @@
   @Override
   public String toString() {
     return String.format(
-        "PeekableInputStream(in=%s, peeked=%b, peekedByte=%d)",
-        mIn.toString(), mPeeked, mPeekedByte);
+        "PeekableInputStream(in=%s, peeked=%b, peekedByte=%d)", in.toString(), peeked, peekedByte);
   }
 }
diff --git a/java/com/android/voicemail/impl/mail/TempDirectory.java b/java/com/android/voicemail/impl/mail/TempDirectory.java
index 42adbeb..f12e45b 100644
--- a/java/com/android/voicemail/impl/mail/TempDirectory.java
+++ b/java/com/android/voicemail/impl/mail/TempDirectory.java
@@ -23,18 +23,18 @@
  * initialization.
  */
 public class TempDirectory {
-  private static File sTempDirectory = null;
+  private static File tempDirectory = null;
 
   public static void setTempDirectory(Context context) {
-    sTempDirectory = context.getCacheDir();
+    tempDirectory = context.getCacheDir();
   }
 
   public static File getTempDirectory() {
-    if (sTempDirectory == null) {
+    if (tempDirectory == null) {
       throw new RuntimeException(
           "TempDirectory not set.  "
               + "If in a unit test, call Email.setTempDirectory(context) in setUp().");
     }
-    return sTempDirectory;
+    return tempDirectory;
   }
 }
diff --git a/java/com/android/voicemail/impl/mail/internet/BinaryTempFileBody.java b/java/com/android/voicemail/impl/mail/internet/BinaryTempFileBody.java
index 753b70f..d1521bd 100644
--- a/java/com/android/voicemail/impl/mail/internet/BinaryTempFileBody.java
+++ b/java/com/android/voicemail/impl/mail/internet/BinaryTempFileBody.java
@@ -36,7 +36,7 @@
  * closed the file is deleted and the Body should be considered disposed of.
  */
 public class BinaryTempFileBody implements Body {
-  private File mFile;
+  private File file;
 
   /**
    * An alternate way to put data into a BinaryTempFileBody is to simply supply an already- created
@@ -45,19 +45,19 @@
    * @param filePath The file containing the data to be stored on disk temporarily
    */
   public void setFile(String filePath) {
-    mFile = new File(filePath);
+    file = new File(filePath);
   }
 
   public OutputStream getOutputStream() throws IOException {
-    mFile = File.createTempFile("body", null, TempDirectory.getTempDirectory());
-    mFile.deleteOnExit();
-    return new FileOutputStream(mFile);
+    file = File.createTempFile("body", null, TempDirectory.getTempDirectory());
+    file.deleteOnExit();
+    return new FileOutputStream(file);
   }
 
   @Override
   public InputStream getInputStream() throws MessagingException {
     try {
-      return new BinaryTempFileBodyInputStream(new FileInputStream(mFile));
+      return new BinaryTempFileBodyInputStream(new FileInputStream(file));
     } catch (IOException ioe) {
       throw new MessagingException("Unable to open body", ioe);
     }
@@ -69,7 +69,7 @@
     Base64OutputStream base64Out = new Base64OutputStream(out, Base64.CRLF | Base64.NO_CLOSE);
     IOUtils.copy(in, base64Out);
     base64Out.close();
-    mFile.delete();
+    file.delete();
     in.close();
   }
 
@@ -81,7 +81,7 @@
     @Override
     public void close() throws IOException {
       super.close();
-      mFile.delete();
+      file.delete();
     }
   }
 }
diff --git a/java/com/android/voicemail/impl/mail/internet/MimeBodyPart.java b/java/com/android/voicemail/impl/mail/internet/MimeBodyPart.java
index 2add76c..12a2b0b 100644
--- a/java/com/android/voicemail/impl/mail/internet/MimeBodyPart.java
+++ b/java/com/android/voicemail/impl/mail/internet/MimeBodyPart.java
@@ -27,10 +27,10 @@
 
 /** TODO this is a close approximation of Message, need to update along with Message. */
 public class MimeBodyPart extends BodyPart {
-  protected MimeHeader mHeader = new MimeHeader();
-  protected MimeHeader mExtendedHeader;
-  protected Body mBody;
-  protected int mSize;
+  protected MimeHeader header = new MimeHeader();
+  protected MimeHeader extendedHeader;
+  protected Body body;
+  protected int size;
 
   // regex that matches content id surrounded by "<>" optionally.
   private static final Pattern REMOVE_OPTIONAL_BRACKETS = Pattern.compile("^<?([^>]+)>?$");
@@ -53,37 +53,37 @@
   }
 
   protected String getFirstHeader(String name) throws MessagingException {
-    return mHeader.getFirstHeader(name);
+    return header.getFirstHeader(name);
   }
 
   @Override
   public void addHeader(String name, String value) throws MessagingException {
-    mHeader.addHeader(name, value);
+    header.addHeader(name, value);
   }
 
   @Override
   public void setHeader(String name, String value) throws MessagingException {
-    mHeader.setHeader(name, value);
+    header.setHeader(name, value);
   }
 
   @Override
   public String[] getHeader(String name) throws MessagingException {
-    return mHeader.getHeader(name);
+    return header.getHeader(name);
   }
 
   @Override
   public void removeHeader(String name) throws MessagingException {
-    mHeader.removeHeader(name);
+    header.removeHeader(name);
   }
 
   @Override
   public Body getBody() throws MessagingException {
-    return mBody;
+    return body;
   }
 
   @Override
   public void setBody(Body body) throws MessagingException {
-    this.mBody = body;
+    this.body = body;
     if (body instanceof Multipart) {
       Multipart multipart =
           ((Multipart) body);
@@ -142,12 +142,12 @@
   }
 
   public void setSize(int size) {
-    this.mSize = size;
+    this.size = size;
   }
 
   @Override
   public int getSize() throws MessagingException {
-    return mSize;
+    return size;
   }
 
   /**
@@ -160,15 +160,15 @@
   @Override
   public void setExtendedHeader(String name, String value) throws MessagingException {
     if (value == null) {
-      if (mExtendedHeader != null) {
-        mExtendedHeader.removeHeader(name);
+      if (extendedHeader != null) {
+        extendedHeader.removeHeader(name);
       }
       return;
     }
-    if (mExtendedHeader == null) {
-      mExtendedHeader = new MimeHeader();
+    if (extendedHeader == null) {
+      extendedHeader = new MimeHeader();
     }
-    mExtendedHeader.setHeader(name, END_OF_LINE.matcher(value).replaceAll(""));
+    extendedHeader.setHeader(name, END_OF_LINE.matcher(value).replaceAll(""));
   }
 
   /**
@@ -180,21 +180,21 @@
    */
   @Override
   public String getExtendedHeader(String name) throws MessagingException {
-    if (mExtendedHeader == null) {
+    if (extendedHeader == null) {
       return null;
     }
-    return mExtendedHeader.getFirstHeader(name);
+    return extendedHeader.getFirstHeader(name);
   }
 
   /** Write the MimeMessage out in MIME format. */
   @Override
   public void writeTo(OutputStream out) throws IOException, MessagingException {
     BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out), 1024);
-    mHeader.writeTo(out);
+    header.writeTo(out);
     writer.write("\r\n");
     writer.flush();
-    if (mBody != null) {
-      mBody.writeTo(out);
+    if (body != null) {
+      body.writeTo(out);
     }
   }
 }
diff --git a/java/com/android/voicemail/impl/mail/internet/MimeHeader.java b/java/com/android/voicemail/impl/mail/internet/MimeHeader.java
index 8f08176..00a9ecc 100644
--- a/java/com/android/voicemail/impl/mail/internet/MimeHeader.java
+++ b/java/com/android/voicemail/impl/mail/internet/MimeHeader.java
@@ -45,10 +45,10 @@
     HEADER_ANDROID_ATTACHMENT_STORE_DATA
   };
 
-  protected final ArrayList<Field> mFields = new ArrayList<Field>();
+  protected final ArrayList<Field> fields = new ArrayList<Field>();
 
   public void clear() {
-    mFields.clear();
+    fields.clear();
   }
 
   public String getFirstHeader(String name) throws MessagingException {
@@ -60,7 +60,7 @@
   }
 
   public void addHeader(String name, String value) throws MessagingException {
-    mFields.add(new Field(name, value));
+    fields.add(new Field(name, value));
   }
 
   public void setHeader(String name, String value) throws MessagingException {
@@ -73,7 +73,7 @@
 
   public String[] getHeader(String name) throws MessagingException {
     ArrayList<String> values = new ArrayList<String>();
-    for (Field field : mFields) {
+    for (Field field : fields) {
       if (field.name.equalsIgnoreCase(name)) {
         values.add(field.value);
       }
@@ -86,12 +86,12 @@
 
   public void removeHeader(String name) throws MessagingException {
     ArrayList<Field> removeFields = new ArrayList<Field>();
-    for (Field field : mFields) {
+    for (Field field : fields) {
       if (field.name.equalsIgnoreCase(name)) {
         removeFields.add(field);
       }
     }
-    mFields.removeAll(removeFields);
+    fields.removeAll(removeFields);
   }
 
   /**
@@ -101,11 +101,11 @@
    *     empty
    */
   public String writeToString() {
-    if (mFields.size() == 0) {
+    if (fields.size() == 0) {
       return null;
     }
     StringBuilder builder = new StringBuilder();
-    for (Field field : mFields) {
+    for (Field field : fields) {
       if (!arrayContains(WRITE_OMIT_FIELDS, field.name)) {
         builder.append(field.name + ": " + field.value + "\r\n");
       }
@@ -115,7 +115,7 @@
 
   public void writeTo(OutputStream out) throws IOException, MessagingException {
     BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out), 1024);
-    for (Field field : mFields) {
+    for (Field field : fields) {
       if (!arrayContains(WRITE_OMIT_FIELDS, field.name)) {
         writer.write(field.name + ": " + field.value + "\r\n");
       }
@@ -140,7 +140,7 @@
 
   @Override
   public String toString() {
-    return (mFields == null) ? null : mFields.toString();
+    return (fields == null) ? null : fields.toString();
   }
 
   public static final boolean arrayContains(Object[] a, Object o) {
diff --git a/java/com/android/voicemail/impl/mail/internet/MimeMessage.java b/java/com/android/voicemail/impl/mail/internet/MimeMessage.java
index 39378a0..2997ad8 100644
--- a/java/com/android/voicemail/impl/mail/internet/MimeMessage.java
+++ b/java/com/android/voicemail/impl/mail/internet/MimeMessage.java
@@ -53,24 +53,24 @@
  * It would be better to simply do it explicitly on local creation of new outgoing messages.
  */
 public class MimeMessage extends Message {
-  private MimeHeader mHeader;
-  private MimeHeader mExtendedHeader;
+  private MimeHeader header;
+  private MimeHeader extendedHeader;
 
   // NOTE:  The fields here are transcribed out of headers, and values stored here will supersede
   // the values found in the headers.  Use caution to prevent any out-of-phase errors.  In
   // particular, any adds/changes/deletes here must be echoed by changes in the parse() function.
-  private Address[] mFrom;
-  private Address[] mTo;
-  private Address[] mCc;
-  private Address[] mBcc;
-  private Address[] mReplyTo;
-  private Date mSentDate;
-  private Body mBody;
-  protected int mSize;
-  private boolean mInhibitLocalMessageId = false;
+  private Address[] from;
+  private Address[] to;
+  private Address[] cc;
+  private Address[] bcc;
+  private Address[] replyTo;
+  private Date sentDate;
+  private Body body;
+  protected int size;
+  private boolean inhibitLocalMessageId = false;
 
   // Shared random source for generating local message-id values
-  private static final java.util.Random sRandom = new java.util.Random();
+  private static final java.util.Random random = new java.util.Random();
 
   // In MIME, en_US-like date format should be used. In other words "MMM" should be encoded to
   // "Jan", not the other localized format like "Ene" (meaning January in locale es).
@@ -86,7 +86,7 @@
   private static final Pattern END_OF_LINE = Pattern.compile("\r?\n");
 
   public MimeMessage() {
-    mHeader = null;
+    header = null;
   }
 
   /**
@@ -100,7 +100,7 @@
     sb.append("<");
     for (int i = 0; i < 24; i++) {
       // We'll use a 5-bit range (0..31)
-      final int value = sRandom.nextInt() & 31;
+      final int value = random.nextInt() & 31;
       final char c = "0123456789abcdefghijklmnopqrstuv".charAt(value);
       sb.append(c);
     }
@@ -125,14 +125,14 @@
     // Before parsing the input stream, clear all local fields that may be superceded by
     // the new incoming message.
     getMimeHeaders().clear();
-    mInhibitLocalMessageId = true;
-    mFrom = null;
-    mTo = null;
-    mCc = null;
-    mBcc = null;
-    mReplyTo = null;
-    mSentDate = null;
-    mBody = null;
+    inhibitLocalMessageId = true;
+    from = null;
+    to = null;
+    cc = null;
+    bcc = null;
+    replyTo = null;
+    sentDate = null;
+    body = null;
 
     final MimeStreamParser parser = new MimeStreamParser();
     parser.setContentHandler(new MimeMessageBuilder());
@@ -149,10 +149,10 @@
    * not creating the headers until needed.
    */
   private MimeHeader getMimeHeaders() {
-    if (mHeader == null) {
-      mHeader = new MimeHeader();
+    if (header == null) {
+      header = new MimeHeader();
     }
-    return mHeader;
+    return header;
   }
 
   @Override
@@ -162,40 +162,40 @@
 
   @Override
   public Date getSentDate() throws MessagingException {
-    if (mSentDate == null) {
+    if (sentDate == null) {
       try {
         DateTimeField field =
             (DateTimeField)
                 DefaultFieldParser.parse(
                     "Date: " + MimeUtility.unfoldAndDecode(getFirstHeader("Date")));
-        mSentDate = field.getDate();
+        sentDate = field.getDate();
         // TODO: We should make it more clear what exceptions can be thrown here,
         // and whether they reflect a normal or error condition.
       } catch (Exception e) {
         LogUtils.v(LogUtils.TAG, "Message missing Date header");
       }
     }
-    if (mSentDate == null) {
+    if (sentDate == null) {
       // If we still don't have a date, fall back to "Delivery-date"
       try {
         DateTimeField field =
             (DateTimeField)
                 DefaultFieldParser.parse(
                     "Date: " + MimeUtility.unfoldAndDecode(getFirstHeader("Delivery-date")));
-        mSentDate = field.getDate();
+        sentDate = field.getDate();
         // TODO: We should make it more clear what exceptions can be thrown here,
         // and whether they reflect a normal or error condition.
       } catch (Exception e) {
         LogUtils.v(LogUtils.TAG, "Message also missing Delivery-Date header");
       }
     }
-    return mSentDate;
+    return sentDate;
   }
 
   @Override
   public void setSentDate(Date sentDate) throws MessagingException {
     setHeader("Date", DATE_FORMAT.format(sentDate));
-    this.mSentDate = sentDate;
+    this.sentDate = sentDate;
   }
 
   @Override
@@ -253,7 +253,7 @@
 
   @Override
   public int getSize() throws MessagingException {
-    return mSize;
+    return size;
   }
 
   /**
@@ -263,20 +263,20 @@
   @Override
   public Address[] getRecipients(String type) throws MessagingException {
     if (type == RECIPIENT_TYPE_TO) {
-      if (mTo == null) {
-        mTo = Address.parse(MimeUtility.unfold(getFirstHeader("To")));
+      if (to == null) {
+        to = Address.parse(MimeUtility.unfold(getFirstHeader("To")));
       }
-      return mTo;
+      return to;
     } else if (type == RECIPIENT_TYPE_CC) {
-      if (mCc == null) {
-        mCc = Address.parse(MimeUtility.unfold(getFirstHeader("CC")));
+      if (cc == null) {
+        cc = Address.parse(MimeUtility.unfold(getFirstHeader("CC")));
       }
-      return mCc;
+      return cc;
     } else if (type == RECIPIENT_TYPE_BCC) {
-      if (mBcc == null) {
-        mBcc = Address.parse(MimeUtility.unfold(getFirstHeader("BCC")));
+      if (bcc == null) {
+        bcc = Address.parse(MimeUtility.unfold(getFirstHeader("BCC")));
       }
-      return mBcc;
+      return bcc;
     } else {
       throw new MessagingException("Unrecognized recipient type.");
     }
@@ -290,26 +290,26 @@
     if (type == RECIPIENT_TYPE_TO) {
       if (addresses == null || addresses.length == 0) {
         removeHeader("To");
-        this.mTo = null;
+        this.to = null;
       } else {
         setHeader("To", MimeUtility.fold(Address.toHeader(addresses), toLength));
-        this.mTo = addresses;
+        this.to = addresses;
       }
     } else if (type == RECIPIENT_TYPE_CC) {
       if (addresses == null || addresses.length == 0) {
         removeHeader("CC");
-        this.mCc = null;
+        this.cc = null;
       } else {
         setHeader("CC", MimeUtility.fold(Address.toHeader(addresses), ccLength));
-        this.mCc = addresses;
+        this.cc = addresses;
       }
     } else if (type == RECIPIENT_TYPE_BCC) {
       if (addresses == null || addresses.length == 0) {
         removeHeader("BCC");
-        this.mBcc = null;
+        this.bcc = null;
       } else {
         setHeader("BCC", MimeUtility.fold(Address.toHeader(addresses), bccLength));
-        this.mBcc = addresses;
+        this.bcc = addresses;
       }
     } else {
       throw new MessagingException("Unrecognized recipient type.");
@@ -330,14 +330,14 @@
 
   @Override
   public Address[] getFrom() throws MessagingException {
-    if (mFrom == null) {
+    if (from == null) {
       String list = MimeUtility.unfold(getFirstHeader("From"));
       if (list == null || list.length() == 0) {
         list = MimeUtility.unfold(getFirstHeader("Sender"));
       }
-      mFrom = Address.parse(list);
+      from = Address.parse(list);
     }
-    return mFrom;
+    return from;
   }
 
   @Override
@@ -345,18 +345,18 @@
     final int fromLength = 6; // "From: "
     if (from != null) {
       setHeader("From", MimeUtility.fold(from.toHeader(), fromLength));
-      this.mFrom = new Address[] {from};
+      this.from = new Address[] {from};
     } else {
-      this.mFrom = null;
+      this.from = null;
     }
   }
 
   @Override
   public Address[] getReplyTo() throws MessagingException {
-    if (mReplyTo == null) {
-      mReplyTo = Address.parse(MimeUtility.unfold(getFirstHeader("Reply-to")));
+    if (replyTo == null) {
+      replyTo = Address.parse(MimeUtility.unfold(getFirstHeader("Reply-to")));
     }
-    return mReplyTo;
+    return replyTo;
   }
 
   @Override
@@ -364,10 +364,10 @@
     final int replyToLength = 10; // "Reply-to: "
     if (replyTo == null || replyTo.length == 0) {
       removeHeader("Reply-to");
-      mReplyTo = null;
+      this.replyTo = null;
     } else {
       setHeader("Reply-to", MimeUtility.fold(Address.toHeader(replyTo), replyToLength));
-      mReplyTo = replyTo;
+      this.replyTo = replyTo;
     }
   }
 
@@ -392,7 +392,7 @@
   @Override
   public String getMessageId() throws MessagingException {
     String messageId = getFirstHeader("Message-ID");
-    if (messageId == null && !mInhibitLocalMessageId) {
+    if (messageId == null && !inhibitLocalMessageId) {
       messageId = generateMessageId();
       setMessageId(messageId);
     }
@@ -406,12 +406,12 @@
 
   @Override
   public Body getBody() throws MessagingException {
-    return mBody;
+    return body;
   }
 
   @Override
   public void setBody(Body body) throws MessagingException {
-    this.mBody = body;
+    this.body = body;
     if (body instanceof Multipart) {
       final Multipart multipart = ((Multipart) body);
       multipart.setParent(this);
@@ -447,7 +447,7 @@
   public void removeHeader(String name) throws MessagingException {
     getMimeHeaders().removeHeader(name);
     if ("Message-ID".equalsIgnoreCase(name)) {
-      mInhibitLocalMessageId = true;
+      inhibitLocalMessageId = true;
     }
   }
 
@@ -461,15 +461,15 @@
   @Override
   public void setExtendedHeader(String name, String value) throws MessagingException {
     if (value == null) {
-      if (mExtendedHeader != null) {
-        mExtendedHeader.removeHeader(name);
+      if (extendedHeader != null) {
+        extendedHeader.removeHeader(name);
       }
       return;
     }
-    if (mExtendedHeader == null) {
-      mExtendedHeader = new MimeHeader();
+    if (extendedHeader == null) {
+      extendedHeader = new MimeHeader();
     }
-    mExtendedHeader.setHeader(name, END_OF_LINE.matcher(value).replaceAll(""));
+    extendedHeader.setHeader(name, END_OF_LINE.matcher(value).replaceAll(""));
   }
 
   /**
@@ -481,10 +481,10 @@
    */
   @Override
   public String getExtendedHeader(String name) throws MessagingException {
-    if (mExtendedHeader == null) {
+    if (extendedHeader == null) {
       return null;
     }
-    return mExtendedHeader.getFirstHeader(name);
+    return extendedHeader.getFirstHeader(name);
   }
 
   /**
@@ -496,15 +496,15 @@
    */
   public void setExtendedHeaders(String headers) throws MessagingException {
     if (TextUtils.isEmpty(headers)) {
-      mExtendedHeader = null;
+      extendedHeader = null;
     } else {
-      mExtendedHeader = new MimeHeader();
+      extendedHeader = new MimeHeader();
       for (final String header : END_OF_LINE.split(headers)) {
         final String[] tokens = header.split(":", 2);
         if (tokens.length != 2) {
           throw new MessagingException("Illegal extended headers: " + headers);
         }
-        mExtendedHeader.setHeader(tokens[0].trim(), tokens[1].trim());
+        extendedHeader.setHeader(tokens[0].trim(), tokens[1].trim());
       }
     }
   }
@@ -515,8 +515,8 @@
    * @return "CR-NL-separated extended headers - null if extended header does not exist
    */
   public String getExtendedHeaders() {
-    if (mExtendedHeader != null) {
-      return mExtendedHeader.writeToString();
+    if (extendedHeader != null) {
+      return extendedHeader.writeToString();
     }
     return null;
   }
@@ -536,8 +536,8 @@
     // because it is intended to internal use.
     writer.write("\r\n");
     writer.flush();
-    if (mBody != null) {
-      mBody.writeTo(out);
+    if (body != null) {
+      body.writeTo(out);
     }
   }
 
diff --git a/java/com/android/voicemail/impl/mail/internet/MimeMultipart.java b/java/com/android/voicemail/impl/mail/internet/MimeMultipart.java
index 87b88b5..6cb2c27 100644
--- a/java/com/android/voicemail/impl/mail/internet/MimeMultipart.java
+++ b/java/com/android/voicemail/impl/mail/internet/MimeMultipart.java
@@ -25,25 +25,25 @@
 import java.io.OutputStreamWriter;
 
 public class MimeMultipart extends Multipart {
-  protected String mPreamble;
+  protected String preamble;
 
-  protected String mContentType;
+  protected String contentType;
 
-  protected String mBoundary;
+  protected String boundary;
 
-  protected String mSubType;
+  protected String subType;
 
   public MimeMultipart() throws MessagingException {
-    mBoundary = generateBoundary();
+    boundary = generateBoundary();
     setSubType("mixed");
   }
 
   public MimeMultipart(String contentType) throws MessagingException {
-    this.mContentType = contentType;
+    this.contentType = contentType;
     try {
-      mSubType = MimeUtility.getHeaderParameter(contentType, null).split("/")[1];
-      mBoundary = MimeUtility.getHeaderParameter(contentType, "boundary");
-      if (mBoundary == null) {
+      subType = MimeUtility.getHeaderParameter(contentType, null).split("/")[1];
+      boundary = MimeUtility.getHeaderParameter(contentType, "boundary");
+      if (boundary == null) {
         throw new MessagingException("MultiPart does not contain boundary: " + contentType);
       }
     } catch (Exception e) {
@@ -65,40 +65,40 @@
   }
 
   public String getPreamble() throws MessagingException {
-    return mPreamble;
+    return preamble;
   }
 
   public void setPreamble(String preamble) throws MessagingException {
-    this.mPreamble = preamble;
+    this.preamble = preamble;
   }
 
   @Override
   public String getContentType() throws MessagingException {
-    return mContentType;
+    return contentType;
   }
 
   public void setSubType(String subType) throws MessagingException {
-    this.mSubType = subType;
-    mContentType = String.format("multipart/%s; boundary=\"%s\"", subType, mBoundary);
+    this.subType = subType;
+    contentType = String.format("multipart/%s; boundary=\"%s\"", subType, boundary);
   }
 
   @Override
   public void writeTo(OutputStream out) throws IOException, MessagingException {
     BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out), 1024);
 
-    if (mPreamble != null) {
-      writer.write(mPreamble + "\r\n");
+    if (preamble != null) {
+      writer.write(preamble + "\r\n");
     }
 
-    for (int i = 0, count = mParts.size(); i < count; i++) {
-      BodyPart bodyPart = mParts.get(i);
-      writer.write("--" + mBoundary + "\r\n");
+    for (int i = 0, count = parts.size(); i < count; i++) {
+      BodyPart bodyPart = parts.get(i);
+      writer.write("--" + boundary + "\r\n");
       writer.flush();
       bodyPart.writeTo(out);
       writer.write("\r\n");
     }
 
-    writer.write("--" + mBoundary + "--\r\n");
+    writer.write("--" + boundary + "--\r\n");
     writer.flush();
   }
 
@@ -108,6 +108,6 @@
   }
 
   public String getSubTypeForTest() {
-    return mSubType;
+    return subType;
   }
 }
diff --git a/java/com/android/voicemail/impl/mail/internet/TextBody.java b/java/com/android/voicemail/impl/mail/internet/TextBody.java
index dae5625..506e1f5 100644
--- a/java/com/android/voicemail/impl/mail/internet/TextBody.java
+++ b/java/com/android/voicemail/impl/mail/internet/TextBody.java
@@ -25,15 +25,15 @@
 import java.io.UnsupportedEncodingException;
 
 public class TextBody implements Body {
-  String mBody;
+  String body;
 
   public TextBody(String body) {
-    this.mBody = body;
+    this.body = body;
   }
 
   @Override
   public void writeTo(OutputStream out) throws IOException, MessagingException {
-    byte[] bytes = mBody.getBytes("UTF-8");
+    byte[] bytes = body.getBytes("UTF-8");
     out.write(Base64.encode(bytes, Base64.CRLF));
   }
 
@@ -43,14 +43,14 @@
    * @return
    */
   public String getText() {
-    return mBody;
+    return body;
   }
 
   /** Returns an InputStream that reads this body's text in UTF-8 format. */
   @Override
   public InputStream getInputStream() throws MessagingException {
     try {
-      byte[] b = mBody.getBytes("UTF-8");
+      byte[] b = body.getBytes("UTF-8");
       return new ByteArrayInputStream(b);
     } catch (UnsupportedEncodingException usee) {
       return null;
diff --git a/java/com/android/voicemail/impl/mail/store/ImapConnection.java b/java/com/android/voicemail/impl/mail/store/ImapConnection.java
index 0a48dfc..ac43f8d 100644
--- a/java/com/android/voicemail/impl/mail/store/ImapConnection.java
+++ b/java/com/android/voicemail/impl/mail/store/ImapConnection.java
@@ -42,11 +42,11 @@
 public class ImapConnection {
   private final String TAG = "ImapConnection";
 
-  private String mLoginPhrase;
-  private ImapStore mImapStore;
-  private MailTransport mTransport;
-  private ImapResponseParser mParser;
-  private Set<String> mCapabilities = new ArraySet<>();
+  private String loginPhrase;
+  private ImapStore imapStore;
+  private MailTransport transport;
+  private ImapResponseParser parser;
+  private Set<String> capabilities = new ArraySet<>();
 
   static final String IMAP_REDACTED_LOG = "[IMAP command redacted]";
 
@@ -55,7 +55,7 @@
    * counter to make tests simpler. (Some of the tests involve multiple connections but only have a
    * single counter to track the tag.)
    */
-  private final AtomicInteger mNextCommandTag = new AtomicInteger(0);
+  private final AtomicInteger nextCommandTag = new AtomicInteger(0);
 
   ImapConnection(ImapStore store) {
     setStore(store);
@@ -65,8 +65,8 @@
     // TODO: maybe we should throw an exception if the connection is not closed here,
     // if it's not currently closed, then we won't reopen it, so if the credentials have
     // changed, the connection will not be reestablished.
-    mImapStore = store;
-    mLoginPhrase = null;
+    imapStore = store;
+    loginPhrase = null;
   }
 
   /**
@@ -76,42 +76,42 @@
    * @return the login command string to sent to the IMAP server
    */
   String getLoginPhrase() {
-    if (mLoginPhrase == null) {
-      if (mImapStore.getUsername() != null && mImapStore.getPassword() != null) {
+    if (loginPhrase == null) {
+      if (imapStore.getUsername() != null && imapStore.getPassword() != null) {
         // build the LOGIN string once (instead of over-and-over again.)
         // apply the quoting here around the built-up password
-        mLoginPhrase =
+        loginPhrase =
             ImapConstants.LOGIN
                 + " "
-                + mImapStore.getUsername()
+                + imapStore.getUsername()
                 + " "
-                + ImapUtility.imapQuoted(mImapStore.getPassword());
+                + ImapUtility.imapQuoted(imapStore.getPassword());
       }
     }
-    return mLoginPhrase;
+    return loginPhrase;
   }
 
   public void open() throws IOException, MessagingException {
-    if (mTransport != null && mTransport.isOpen()) {
+    if (transport != null && transport.isOpen()) {
       return;
     }
 
     try {
       // copy configuration into a clean transport, if necessary
-      if (mTransport == null) {
-        mTransport = mImapStore.cloneTransport();
+      if (transport == null) {
+        transport = imapStore.cloneTransport();
       }
 
-      mTransport.open();
+      transport.open();
 
       createParser();
 
       // The server should greet us with something like
       // * OK IMAP4rev1 Server
       // consume the response before doing anything else.
-      ImapResponse response = mParser.readResponse(false);
+      ImapResponse response = parser.readResponse(false);
       if (!response.isOk()) {
-        mImapStore.getImapHelper().handleEvent(OmtpEvents.DATA_INVALID_INITIAL_SERVER_RESPONSE);
+        imapStore.getImapHelper().handleEvent(OmtpEvents.DATA_INVALID_INITIAL_SERVER_RESPONSE);
         throw new MessagingException(
             MessagingException.AUTHENTICATION_FAILED_OR_SERVER_ERROR,
             "Invalid server initial response");
@@ -125,11 +125,11 @@
       doLogin();
     } catch (SSLException e) {
       LogUtils.d(TAG, "SSLException ", e);
-      mImapStore.getImapHelper().handleEvent(OmtpEvents.DATA_SSL_EXCEPTION);
+      imapStore.getImapHelper().handleEvent(OmtpEvents.DATA_SSL_EXCEPTION);
       throw new CertificateValidationException(e.getMessage(), e);
     } catch (IOException ioe) {
       LogUtils.d(TAG, "IOException", ioe);
-      mImapStore.getImapHelper().handleEvent(OmtpEvents.DATA_IOE_ON_OPEN);
+      imapStore.getImapHelper().handleEvent(OmtpEvents.DATA_IOE_ON_OPEN);
       throw ioe;
     } finally {
       destroyResponses();
@@ -139,10 +139,10 @@
   void logout() {
     try {
       sendCommand(ImapConstants.LOGOUT, false);
-      if (!mParser.readResponse(true).is(0, ImapConstants.BYE)) {
+      if (!parser.readResponse(true).is(0, ImapConstants.BYE)) {
         VvmLog.e(TAG, "Server did not respond LOGOUT with BYE");
       }
-      if (!mParser.readResponse(false).isOk()) {
+      if (!parser.readResponse(false).isOk()) {
         VvmLog.e(TAG, "Server did not respond OK after LOGOUT");
       }
     } catch (IOException | MessagingException e) {
@@ -155,14 +155,14 @@
    * {@link #setStore(ImapStore)} is called.
    */
   void close() {
-    if (mTransport != null) {
+    if (transport != null) {
       logout();
-      mTransport.close();
-      mTransport = null;
+      transport.close();
+      transport = null;
     }
     destroyResponses();
-    mParser = null;
-    mImapStore = null;
+    parser = null;
+    imapStore = null;
   }
 
   /** Attempts to convert the connection into secure connection. */
@@ -171,7 +171,7 @@
     // Make sure the server does have this capability
     if (hasCapability(ImapConstants.CAPABILITY_STARTTLS)) {
       executeSimpleCommand(ImapConstants.STARTTLS);
-      mTransport.reopenTls();
+      transport.reopenTls();
       createParser();
       // The cached capabilities should be refreshed after TLS is established.
       queryCapability();
@@ -181,7 +181,7 @@
   /** Logs into the IMAP server */
   private void doLogin() throws IOException, MessagingException, AuthenticationFailedException {
     try {
-      if (mCapabilities.contains(ImapConstants.CAPABILITY_AUTH_DIGEST_MD5)) {
+      if (capabilities.contains(ImapConstants.CAPABILITY_AUTH_DIGEST_MD5)) {
         doDigestMd5Auth();
       } else {
         executeSimpleCommand(getLoginPhrase(), true);
@@ -195,36 +195,36 @@
       if (ImapConstants.NO.equals(status)) {
         switch (statusMessage) {
           case ImapConstants.NO_UNKNOWN_USER:
-            mImapStore.getImapHelper().handleEvent(OmtpEvents.DATA_AUTH_UNKNOWN_USER);
+            imapStore.getImapHelper().handleEvent(OmtpEvents.DATA_AUTH_UNKNOWN_USER);
             break;
           case ImapConstants.NO_UNKNOWN_CLIENT:
-            mImapStore.getImapHelper().handleEvent(OmtpEvents.DATA_AUTH_UNKNOWN_DEVICE);
+            imapStore.getImapHelper().handleEvent(OmtpEvents.DATA_AUTH_UNKNOWN_DEVICE);
             break;
           case ImapConstants.NO_INVALID_PASSWORD:
-            mImapStore.getImapHelper().handleEvent(OmtpEvents.DATA_AUTH_INVALID_PASSWORD);
+            imapStore.getImapHelper().handleEvent(OmtpEvents.DATA_AUTH_INVALID_PASSWORD);
             break;
           case ImapConstants.NO_MAILBOX_NOT_INITIALIZED:
-            mImapStore.getImapHelper().handleEvent(OmtpEvents.DATA_AUTH_MAILBOX_NOT_INITIALIZED);
+            imapStore.getImapHelper().handleEvent(OmtpEvents.DATA_AUTH_MAILBOX_NOT_INITIALIZED);
             break;
           case ImapConstants.NO_SERVICE_IS_NOT_PROVISIONED:
-            mImapStore.getImapHelper().handleEvent(OmtpEvents.DATA_AUTH_SERVICE_NOT_PROVISIONED);
+            imapStore.getImapHelper().handleEvent(OmtpEvents.DATA_AUTH_SERVICE_NOT_PROVISIONED);
             break;
           case ImapConstants.NO_SERVICE_IS_NOT_ACTIVATED:
-            mImapStore.getImapHelper().handleEvent(OmtpEvents.DATA_AUTH_SERVICE_NOT_ACTIVATED);
+            imapStore.getImapHelper().handleEvent(OmtpEvents.DATA_AUTH_SERVICE_NOT_ACTIVATED);
             break;
           case ImapConstants.NO_USER_IS_BLOCKED:
-            mImapStore.getImapHelper().handleEvent(OmtpEvents.DATA_AUTH_USER_IS_BLOCKED);
+            imapStore.getImapHelper().handleEvent(OmtpEvents.DATA_AUTH_USER_IS_BLOCKED);
             break;
           case ImapConstants.NO_APPLICATION_ERROR:
-            mImapStore.getImapHelper().handleEvent(OmtpEvents.DATA_REJECTED_SERVER_RESPONSE);
+            imapStore.getImapHelper().handleEvent(OmtpEvents.DATA_REJECTED_SERVER_RESPONSE);
             break;
           default:
-            mImapStore.getImapHelper().handleEvent(OmtpEvents.DATA_BAD_IMAP_CREDENTIAL);
+            imapStore.getImapHelper().handleEvent(OmtpEvents.DATA_BAD_IMAP_CREDENTIAL);
         }
         throw new AuthenticationFailedException(alertText, ie);
       }
 
-      mImapStore.getImapHelper().handleEvent(OmtpEvents.DATA_REJECTED_SERVER_RESPONSE);
+      imapStore.getImapHelper().handleEvent(OmtpEvents.DATA_REJECTED_SERVER_RESPONSE);
       throw new MessagingException(alertText, ie);
     }
   }
@@ -243,7 +243,7 @@
     String decodedChallenge = decodeBase64(responses.get(0).getStringOrEmpty(0).getString());
 
     Map<String, String> challenge = DigestMd5Utils.parseDigestMessage(decodedChallenge);
-    DigestMd5Utils.Data data = new DigestMd5Utils.Data(mImapStore, mTransport, challenge);
+    DigestMd5Utils.Data data = new DigestMd5Utils.Data(imapStore, transport, challenge);
 
     String response = data.createResponse();
     //  Respond to the challenge. If the server accepts it, it will reply a response-auth which
@@ -281,9 +281,9 @@
 
   private void queryCapability() throws IOException, MessagingException {
     List<ImapResponse> responses = executeSimpleCommand(ImapConstants.CAPABILITY);
-    mCapabilities.clear();
+    capabilities.clear();
     Set<String> disabledCapabilities =
-        mImapStore.getImapHelper().getConfig().getDisabledCapabilities();
+        imapStore.getImapHelper().getConfig().getDisabledCapabilities();
     for (ImapResponse response : responses) {
       if (response.isTagged()) {
         continue;
@@ -292,40 +292,40 @@
         String capability = response.getStringOrEmpty(i).getString();
         if (disabledCapabilities != null) {
           if (!disabledCapabilities.contains(capability)) {
-            mCapabilities.add(capability);
+            capabilities.add(capability);
           }
         } else {
-          mCapabilities.add(capability);
+          capabilities.add(capability);
         }
       }
     }
 
-    LogUtils.d(TAG, "Capabilities: " + mCapabilities.toString());
+    LogUtils.d(TAG, "Capabilities: " + capabilities.toString());
   }
 
   private boolean hasCapability(String capability) {
-    return mCapabilities.contains(capability);
+    return capabilities.contains(capability);
   }
   /**
    * Create an {@link ImapResponseParser} from {@code mTransport.getInputStream()} and set it to
-   * {@link #mParser}.
+   * {@link #parser}.
    *
    * <p>If we already have an {@link ImapResponseParser}, we {@link #destroyResponses()} and throw
    * it away.
    */
   private void createParser() {
     destroyResponses();
-    mParser = new ImapResponseParser(mTransport.getInputStream());
+    parser = new ImapResponseParser(transport.getInputStream());
   }
 
   public void destroyResponses() {
-    if (mParser != null) {
-      mParser.destroyResponses();
+    if (parser != null) {
+      parser.destroyResponses();
     }
   }
 
   public ImapResponse readResponse() throws IOException, MessagingException {
-    return mParser.readResponse(false);
+    return parser.readResponse(false);
   }
 
   public List<ImapResponse> executeSimpleCommand(String command)
@@ -356,18 +356,18 @@
       throws IOException, MessagingException {
     open();
 
-    if (mTransport == null) {
+    if (transport == null) {
       throw new IOException("Null transport");
     }
-    String tag = Integer.toString(mNextCommandTag.incrementAndGet());
+    String tag = Integer.toString(nextCommandTag.incrementAndGet());
     String commandToSend = tag + " " + command;
-    mTransport.writeLine(commandToSend, (sensitive ? IMAP_REDACTED_LOG : command));
+    transport.writeLine(commandToSend, (sensitive ? IMAP_REDACTED_LOG : command));
     return tag;
   }
 
   List<ImapResponse> executeContinuationResponse(String response, boolean sensitive)
       throws IOException, MessagingException {
-    mTransport.writeLine(response, (sensitive ? IMAP_REDACTED_LOG : response));
+    transport.writeLine(response, (sensitive ? IMAP_REDACTED_LOG : response));
     return getCommandResponses();
   }
 
@@ -382,7 +382,7 @@
     final List<ImapResponse> responses = new ArrayList<ImapResponse>();
     ImapResponse response;
     do {
-      response = mParser.readResponse(false);
+      response = parser.readResponse(false);
       responses.add(response);
     } while (!(response.isTagged() || response.isContinuationRequest()));
 
diff --git a/java/com/android/voicemail/impl/mail/store/ImapFolder.java b/java/com/android/voicemail/impl/mail/store/ImapFolder.java
index 5760ee2..3c76ec3 100644
--- a/java/com/android/voicemail/impl/mail/store/ImapFolder.java
+++ b/java/com/android/voicemail/impl/mail/store/ImapFolder.java
@@ -59,21 +59,21 @@
   };
   private static final int COPY_BUFFER_SIZE = 16 * 1024;
 
-  private final ImapStore mStore;
-  private final String mName;
-  private int mMessageCount = -1;
-  private ImapConnection mConnection;
-  private String mMode;
-  private boolean mExists;
+  private final ImapStore store;
+  private final String name;
+  private int messageCount = -1;
+  private ImapConnection connection;
+  private String mode;
+  private boolean exists;
   /** A set of hashes that can be used to track dirtiness */
-  Object[] mHash;
+  Object[] hash;
 
   public static final String MODE_READ_ONLY = "mode_read_only";
   public static final String MODE_READ_WRITE = "mode_read_write";
 
   public ImapFolder(ImapStore store, String name) {
-    mStore = store;
-    mName = name;
+    this.store = store;
+    this.name = name;
   }
 
   /** Callback for each message retrieval. */
@@ -82,8 +82,8 @@
   }
 
   private void destroyResponses() {
-    if (mConnection != null) {
-      mConnection.destroyResponses();
+    if (connection != null) {
+      connection.destroyResponses();
     }
   }
 
@@ -93,7 +93,7 @@
         throw new AssertionError("Duplicated open on ImapFolder");
       }
       synchronized (this) {
-        mConnection = mStore.getConnection();
+        connection = store.getConnection();
       }
       // * FLAGS (\Answered \Flagged \Deleted \Seen \Draft NonJunk
       // $MDNSent)
@@ -107,28 +107,28 @@
       try {
         doSelect();
       } catch (IOException ioe) {
-        throw ioExceptionHandler(mConnection, ioe);
+        throw ioExceptionHandler(connection, ioe);
       } finally {
         destroyResponses();
       }
     } catch (AuthenticationFailedException e) {
       // Don't cache this connection, so we're forced to try connecting/login again
-      mConnection = null;
+      connection = null;
       close(false);
       throw e;
     } catch (MessagingException e) {
-      mExists = false;
+      exists = false;
       close(false);
       throw e;
     }
   }
 
   public boolean isOpen() {
-    return mExists && mConnection != null;
+    return exists && connection != null;
   }
 
   public String getMode() {
-    return mMode;
+    return mode;
   }
 
   public void close(boolean expunge) {
@@ -139,14 +139,14 @@
         VvmLog.e(TAG, "Messaging Exception", e);
       }
     }
-    mMessageCount = -1;
+    messageCount = -1;
     synchronized (this) {
-      mConnection = null;
+      connection = null;
     }
   }
 
   public int getMessageCount() {
-    return mMessageCount;
+    return messageCount;
   }
 
   String[] getSearchUids(List<ImapResponse> responses) {
@@ -173,7 +173,7 @@
     try {
       try {
         final String command = ImapConstants.UID_SEARCH + " " + searchCriteria;
-        final String[] result = getSearchUids(mConnection.executeSimpleCommand(command));
+        final String[] result = getSearchUids(connection.executeSimpleCommand(command));
         VvmLog.d(TAG, "searchForUids '" + searchCriteria + "' results: " + result.length);
         return result;
       } catch (ImapException me) {
@@ -181,8 +181,8 @@
         return Utility.EMPTY_STRINGS; // Not found
       } catch (IOException ioe) {
         VvmLog.d(TAG, "IOException in search: " + searchCriteria, ioe);
-        mStore.getImapHelper().handleEvent(OmtpEvents.DATA_GENERIC_IMAP_IOE);
-        throw ioExceptionHandler(mConnection, ioe);
+        store.getImapHelper().handleEvent(OmtpEvents.DATA_GENERIC_IMAP_IOE);
+        throw ioExceptionHandler(connection, ioe);
       }
     } finally {
       destroyResponses();
@@ -296,7 +296,7 @@
     }
 
     try {
-      mConnection.sendCommand(
+      connection.sendCommand(
           String.format(
               Locale.US,
               ImapConstants.UID_FETCH + " %s (%s)",
@@ -307,7 +307,7 @@
       do {
         response = null;
         try {
-          response = mConnection.readResponse();
+          response = connection.readResponse();
 
           if (!response.isDataResponse(1, ImapConstants.FETCH)) {
             continue; // Ignore
@@ -395,7 +395,7 @@
               // (We'll need to share a temp file.  Protect it with a ref-count.)
               message.setBody(
                   decodeBody(
-                      mStore.getContext(),
+                      store.getContext(),
                       bodyStream,
                       contentTransferEncoding,
                       fetchPart.getSize(),
@@ -417,8 +417,8 @@
         }
       } while (!response.isTagged());
     } catch (IOException ioe) {
-      mStore.getImapHelper().handleEvent(OmtpEvents.DATA_GENERIC_IMAP_IOE);
-      throw ioExceptionHandler(mConnection, ioe);
+      store.getImapHelper().handleEvent(OmtpEvents.DATA_GENERIC_IMAP_IOE);
+      throw ioExceptionHandler(connection, ioe);
     }
   }
 
@@ -476,7 +476,7 @@
    */
   private void handleUntaggedResponse(ImapResponse response) {
     if (response.isDataResponse(1, ImapConstants.EXISTS)) {
-      mMessageCount = response.getStringOrEmpty(0).getNumberOrZero();
+      messageCount = response.getStringOrEmpty(0).getNumberOrZero();
     }
   }
 
@@ -660,10 +660,10 @@
   public Message[] expunge() throws MessagingException {
     checkOpen();
     try {
-      handleUntaggedResponses(mConnection.executeSimpleCommand(ImapConstants.EXPUNGE));
+      handleUntaggedResponses(connection.executeSimpleCommand(ImapConstants.EXPUNGE));
     } catch (IOException ioe) {
-      mStore.getImapHelper().handleEvent(OmtpEvents.DATA_GENERIC_IMAP_IOE);
-      throw ioExceptionHandler(mConnection, ioe);
+      store.getImapHelper().handleEvent(OmtpEvents.DATA_GENERIC_IMAP_IOE);
+      throw ioExceptionHandler(connection, ioe);
     } finally {
       destroyResponses();
     }
@@ -692,7 +692,7 @@
       allFlags = flagList.substring(1);
     }
     try {
-      mConnection.executeSimpleCommand(
+      connection.executeSimpleCommand(
           String.format(
               Locale.US,
               ImapConstants.UID_STORE + " %s %s" + ImapConstants.FLAGS_SILENT + " (%s)",
@@ -701,8 +701,8 @@
               allFlags));
 
     } catch (IOException ioe) {
-      mStore.getImapHelper().handleEvent(OmtpEvents.DATA_GENERIC_IMAP_IOE);
-      throw ioExceptionHandler(mConnection, ioe);
+      store.getImapHelper().handleEvent(OmtpEvents.DATA_GENERIC_IMAP_IOE);
+      throw ioExceptionHandler(connection, ioe);
     } finally {
       destroyResponses();
     }
@@ -714,11 +714,11 @@
    */
   private void doSelect() throws IOException, MessagingException {
     final List<ImapResponse> responses =
-        mConnection.executeSimpleCommand(
-            String.format(Locale.US, ImapConstants.SELECT + " \"%s\"", mName));
+        connection.executeSimpleCommand(
+            String.format(Locale.US, ImapConstants.SELECT + " \"%s\"", name));
 
     // Assume the folder is opened read-write; unless we are notified otherwise
-    mMode = MODE_READ_WRITE;
+    mode = MODE_READ_WRITE;
     int messageCount = -1;
     for (ImapResponse response : responses) {
       if (response.isDataResponse(1, ImapConstants.EXISTS)) {
@@ -726,12 +726,12 @@
       } else if (response.isOk()) {
         final ImapString responseCode = response.getResponseCodeOrEmpty();
         if (responseCode.is(ImapConstants.READ_ONLY)) {
-          mMode = MODE_READ_ONLY;
+          mode = MODE_READ_ONLY;
         } else if (responseCode.is(ImapConstants.READ_WRITE)) {
-          mMode = MODE_READ_WRITE;
+          mode = MODE_READ_WRITE;
         }
       } else if (response.isTagged()) { // Not OK
-        mStore.getImapHelper().handleEvent(OmtpEvents.DATA_MAILBOX_OPEN_FAILED);
+        store.getImapHelper().handleEvent(OmtpEvents.DATA_MAILBOX_OPEN_FAILED);
         throw new MessagingException(
             "Can't open mailbox: " + response.getStatusResponseTextOrEmpty());
       }
@@ -739,8 +739,8 @@
     if (messageCount == -1) {
       throw new MessagingException("Did not find message count during select");
     }
-    mMessageCount = messageCount;
-    mExists = true;
+    this.messageCount = messageCount;
+    exists = true;
   }
 
   public class Quota {
@@ -757,8 +757,8 @@
   public Quota getQuota() throws MessagingException {
     try {
       final List<ImapResponse> responses =
-          mConnection.executeSimpleCommand(
-              String.format(Locale.US, ImapConstants.GETQUOTAROOT + " \"%s\"", mName));
+          connection.executeSimpleCommand(
+              String.format(Locale.US, ImapConstants.GETQUOTAROOT + " \"%s\"", name));
 
       for (ImapResponse response : responses) {
         if (!response.isDataResponse(0, ImapConstants.QUOTA)) {
@@ -775,8 +775,8 @@
         }
       }
     } catch (IOException ioe) {
-      mStore.getImapHelper().handleEvent(OmtpEvents.DATA_GENERIC_IMAP_IOE);
-      throw ioExceptionHandler(mConnection, ioe);
+      store.getImapHelper().handleEvent(OmtpEvents.DATA_GENERIC_IMAP_IOE);
+      throw ioExceptionHandler(connection, ioe);
     } finally {
       destroyResponses();
     }
@@ -785,15 +785,15 @@
 
   private void checkOpen() throws MessagingException {
     if (!isOpen()) {
-      throw new MessagingException("Folder " + mName + " is not open.");
+      throw new MessagingException("Folder " + name + " is not open.");
     }
   }
 
   private MessagingException ioExceptionHandler(ImapConnection connection, IOException ioe) {
     VvmLog.d(TAG, "IO Exception detected: ", ioe);
     connection.close();
-    if (connection == mConnection) {
-      mConnection = null; // To prevent close() from returning the connection to the pool.
+    if (connection == this.connection) {
+      this.connection = null; // To prevent close() from returning the connection to the pool.
       close(false);
     }
     return new MessagingException(MessagingException.IOERROR, "IO Error", ioe);
diff --git a/java/com/android/voicemail/impl/mail/store/ImapStore.java b/java/com/android/voicemail/impl/mail/store/ImapStore.java
index 838bae2..6b88080 100644
--- a/java/com/android/voicemail/impl/mail/store/ImapStore.java
+++ b/java/com/android/voicemail/impl/mail/store/ImapStore.java
@@ -34,12 +34,12 @@
    */
   public static final int FETCH_BODY_SANE_SUGGESTED_SIZE = (125 * 1024);
 
-  private final Context mContext;
-  private final ImapHelper mHelper;
-  private final String mUsername;
-  private final String mPassword;
-  private final MailTransport mTransport;
-  private ImapConnection mConnection;
+  private final Context context;
+  private final ImapHelper helper;
+  private final String username;
+  private final String password;
+  private final MailTransport transport;
+  private ImapConnection connection;
 
   public static final int FLAG_NONE = 0x00; // No flags
   public static final int FLAG_SSL = 0x01; // Use SSL
@@ -58,32 +58,32 @@
       String serverName,
       int flags,
       Network network) {
-    mContext = context;
-    mHelper = helper;
-    mUsername = username;
-    mPassword = password;
-    mTransport = new MailTransport(context, this.getImapHelper(), network, serverName, port, flags);
+    this.context = context;
+    this.helper = helper;
+    this.username = username;
+    this.password = password;
+    transport = new MailTransport(context, this.getImapHelper(), network, serverName, port, flags);
   }
 
   public Context getContext() {
-    return mContext;
+    return context;
   }
 
   public ImapHelper getImapHelper() {
-    return mHelper;
+    return helper;
   }
 
   public String getUsername() {
-    return mUsername;
+    return username;
   }
 
   public String getPassword() {
-    return mPassword;
+    return password;
   }
 
   /** Returns a clone of the transport associated with this store. */
   MailTransport cloneTransport() {
-    return mTransport.clone();
+    return transport.clone();
   }
 
   /** Returns UIDs of Messages joined with "," as the separator. */
@@ -101,15 +101,15 @@
   }
 
   static class ImapMessage extends MimeMessage {
-    private ImapFolder mFolder;
+    private ImapFolder folder;
 
     ImapMessage(String uid, ImapFolder folder) {
-      mUid = uid;
-      mFolder = folder;
+      this.uid = uid;
+      this.folder = folder;
     }
 
     public void setSize(int size) {
-      mSize = size;
+      this.size = size;
     }
 
     @Override
@@ -124,17 +124,17 @@
     @Override
     public void setFlag(String flag, boolean set) throws MessagingException {
       super.setFlag(flag, set);
-      mFolder.setFlags(new Message[] {this}, new String[] {flag}, set);
+      folder.setFlags(new Message[] {this}, new String[] {flag}, set);
     }
   }
 
   static class ImapException extends MessagingException {
     private static final long serialVersionUID = 1L;
 
-    private final String mStatus;
-    private final String mStatusMessage;
-    private final String mAlertText;
-    private final String mResponseCode;
+    private final String status;
+    private final String statusMessage;
+    private final String alertText;
+    private final String responseCode;
 
     public ImapException(
         String message,
@@ -143,40 +143,40 @@
         String alertText,
         String responseCode) {
       super(message);
-      mStatus = status;
-      mStatusMessage = statusMessage;
-      mAlertText = alertText;
-      mResponseCode = responseCode;
+      this.status = status;
+      this.statusMessage = statusMessage;
+      this.alertText = alertText;
+      this.responseCode = responseCode;
     }
 
     public String getStatus() {
-      return mStatus;
+      return status;
     }
 
     public String getStatusMessage() {
-      return mStatusMessage;
+      return statusMessage;
     }
 
     public String getAlertText() {
-      return mAlertText;
+      return alertText;
     }
 
     public String getResponseCode() {
-      return mResponseCode;
+      return responseCode;
     }
   }
 
   public void closeConnection() {
-    if (mConnection != null) {
-      mConnection.close();
-      mConnection = null;
+    if (connection != null) {
+      connection.close();
+      connection = null;
     }
   }
 
   public ImapConnection getConnection() {
-    if (mConnection == null) {
-      mConnection = new ImapConnection(this);
+    if (connection == null) {
+      connection = new ImapConnection(this);
     }
-    return mConnection;
+    return connection;
   }
 }
diff --git a/java/com/android/voicemail/impl/mail/store/imap/DigestMd5Utils.java b/java/com/android/voicemail/impl/mail/store/imap/DigestMd5Utils.java
index f156f67..aa28868 100644
--- a/java/com/android/voicemail/impl/mail/store/imap/DigestMd5Utils.java
+++ b/java/com/android/voicemail/impl/mail/store/imap/DigestMd5Utils.java
@@ -121,27 +121,27 @@
 
     private static class ResponseBuilder {
 
-      private StringBuilder mBuilder = new StringBuilder();
+      private StringBuilder builder = new StringBuilder();
 
       public ResponseBuilder appendQuoted(String key, String value) {
-        if (mBuilder.length() != 0) {
-          mBuilder.append(",");
+        if (builder.length() != 0) {
+          builder.append(",");
         }
-        mBuilder.append(key).append("=\"").append(value).append("\"");
+        builder.append(key).append("=\"").append(value).append("\"");
         return this;
       }
 
       public ResponseBuilder append(String key, String value) {
-        if (mBuilder.length() != 0) {
-          mBuilder.append(",");
+        if (builder.length() != 0) {
+          builder.append(",");
         }
-        mBuilder.append(key).append("=").append(value);
+        builder.append(key).append("=").append(value);
         return this;
       }
 
       @Override
       public String toString() {
-        return mBuilder.toString();
+        return builder.toString();
       }
     }
   }
@@ -229,20 +229,20 @@
   /** Parse the key-value pair returned by the server. */
   private static class DigestMessageParser {
 
-    private final String mMessage;
-    private int mPosition = 0;
-    private Map<String, String> mResult = new ArrayMap<>();
+    private final String message;
+    private int position = 0;
+    private Map<String, String> result = new ArrayMap<>();
 
     public DigestMessageParser(String message) {
-      mMessage = message;
+      this.message = message;
     }
 
     @Nullable
     public Map<String, String> parse() {
       try {
-        while (mPosition < mMessage.length()) {
+        while (position < message.length()) {
           parsePair();
-          if (mPosition != mMessage.length()) {
+          if (position != message.length()) {
             expect(',');
           }
         }
@@ -250,42 +250,42 @@
         VvmLog.e(TAG, e.toString());
         return null;
       }
-      return mResult;
+      return result;
     }
 
     private void parsePair() {
       String key = parseKey();
       expect('=');
       String value = parseValue();
-      mResult.put(key, value);
+      result.put(key, value);
     }
 
     private void expect(char c) {
       if (pop() != c) {
-        throw new IllegalStateException("unexpected character " + mMessage.charAt(mPosition));
+        throw new IllegalStateException("unexpected character " + message.charAt(position));
       }
     }
 
     private char pop() {
       char result = peek();
-      mPosition++;
+      position++;
       return result;
     }
 
     private char peek() {
-      return mMessage.charAt(mPosition);
+      return message.charAt(position);
     }
 
     private void goToNext(char c) {
       while (peek() != c) {
-        mPosition++;
+        position++;
       }
     }
 
     private String parseKey() {
-      int start = mPosition;
+      int start = position;
       goToNext('=');
-      return mMessage.substring(start, mPosition);
+      return message.substring(start, position);
     }
 
     private String parseValue() {
@@ -319,13 +319,13 @@
         if (c == '\\') {
           result.append(pop());
         } else if (c == ',') {
-          mPosition--;
+          position--;
           break;
         } else {
           result.append(c);
         }
 
-        if (mPosition == mMessage.length()) {
+        if (position == message.length()) {
           break;
         }
       }
diff --git a/java/com/android/voicemail/impl/mail/store/imap/ImapElement.java b/java/com/android/voicemail/impl/mail/store/imap/ImapElement.java
index ee255d1..c2571f3 100644
--- a/java/com/android/voicemail/impl/mail/store/imap/ImapElement.java
+++ b/java/com/android/voicemail/impl/mail/store/imap/ImapElement.java
@@ -77,14 +77,14 @@
         }
       };
 
-  private boolean mDestroyed = false;
+  private boolean destroyed = false;
 
   public abstract boolean isList();
 
   public abstract boolean isString();
 
   protected boolean isDestroyed() {
-    return mDestroyed;
+    return destroyed;
   }
 
   /**
@@ -92,12 +92,12 @@
    * ImapTempFileLiteral}.
    */
   public void destroy() {
-    mDestroyed = true;
+    destroyed = true;
   }
 
   /** Throws {@link RuntimeException} if it's already destroyed. */
   protected final void checkNotDestroyed() {
-    if (mDestroyed) {
+    if (destroyed) {
       throw new RuntimeException("Already destroyed");
     }
   }
diff --git a/java/com/android/voicemail/impl/mail/store/imap/ImapList.java b/java/com/android/voicemail/impl/mail/store/imap/ImapList.java
index e4a6ec0..a72883f 100644
--- a/java/com/android/voicemail/impl/mail/store/imap/ImapList.java
+++ b/java/com/android/voicemail/impl/mail/store/imap/ImapList.java
@@ -35,13 +35,13 @@
         }
       };
 
-  private ArrayList<ImapElement> mList = new ArrayList<ImapElement>();
+  private ArrayList<ImapElement> list = new ArrayList<ImapElement>();
 
   /* package */ void add(ImapElement e) {
     if (e == null) {
       throw new RuntimeException("Can't add null");
     }
-    mList.add(e);
+    list.add(e);
   }
 
   @Override
@@ -55,7 +55,7 @@
   }
 
   public final int size() {
-    return mList.size();
+    return list.size();
   }
 
   public final boolean isEmpty() {
@@ -84,7 +84,7 @@
    * ImapElement#NONE}.
    */
   public final ImapElement getElementOrNone(int index) {
-    return (index >= mList.size()) ? ImapElement.NONE : mList.get(index);
+    return (index >= list.size()) ? ImapElement.NONE : list.get(index);
   }
 
   /**
@@ -112,7 +112,7 @@
   /* package */ final ImapElement getKeyedElementOrNull(String key, boolean prefixMatch) {
     for (int i = 1; i < size(); i += 2) {
       if (is(i - 1, key, prefixMatch)) {
-        return mList.get(i);
+        return list.get(i);
       }
     }
     return null;
@@ -162,18 +162,18 @@
 
   @Override
   public void destroy() {
-    if (mList != null) {
-      for (ImapElement e : mList) {
+    if (list != null) {
+      for (ImapElement e : list) {
         e.destroy();
       }
-      mList = null;
+      list = null;
     }
     super.destroy();
   }
 
   @Override
   public String toString() {
-    return mList.toString();
+    return list.toString();
   }
 
   /** Return the text representations of the contents concatenated with ",". */
@@ -192,7 +192,7 @@
    */
   private final StringBuilder flatten(StringBuilder sb) {
     sb.append('[');
-    for (int i = 0; i < mList.size(); i++) {
+    for (int i = 0; i < list.size(); i++) {
       if (i > 0) {
         sb.append(',');
       }
@@ -217,7 +217,7 @@
       return false;
     }
     for (int i = 0; i < size(); i++) {
-      if (!mList.get(i).equalsForTest(thatList.getElementOrNone(i))) {
+      if (!list.get(i).equalsForTest(thatList.getElementOrNone(i))) {
         return false;
       }
     }
diff --git a/java/com/android/voicemail/impl/mail/store/imap/ImapMemoryLiteral.java b/java/com/android/voicemail/impl/mail/store/imap/ImapMemoryLiteral.java
index 96a8c4a..46f3fc5 100644
--- a/java/com/android/voicemail/impl/mail/store/imap/ImapMemoryLiteral.java
+++ b/java/com/android/voicemail/impl/mail/store/imap/ImapMemoryLiteral.java
@@ -26,35 +26,35 @@
 /** Subclass of {@link ImapString} used for literals backed by an in-memory byte array. */
 public class ImapMemoryLiteral extends ImapString {
   private final String TAG = "ImapMemoryLiteral";
-  private byte[] mData;
+  private byte[] data;
 
   /* package */ ImapMemoryLiteral(FixedLengthInputStream in) throws IOException {
     // We could use ByteArrayOutputStream and IOUtils.copy, but it'd perform an unnecessary
     // copy....
-    mData = new byte[in.getLength()];
+    data = new byte[in.getLength()];
     int pos = 0;
-    while (pos < mData.length) {
-      int read = in.read(mData, pos, mData.length - pos);
+    while (pos < data.length) {
+      int read = in.read(data, pos, data.length - pos);
       if (read < 0) {
         break;
       }
       pos += read;
     }
-    if (pos != mData.length) {
+    if (pos != data.length) {
       VvmLog.w(TAG, "length mismatch");
     }
   }
 
   @Override
   public void destroy() {
-    mData = null;
+    data = null;
     super.destroy();
   }
 
   @Override
   public String getString() {
     try {
-      return new String(mData, "US-ASCII");
+      return new String(data, "US-ASCII");
     } catch (UnsupportedEncodingException e) {
       VvmLog.e(TAG, "Unsupported encoding: ", e);
     }
@@ -63,11 +63,11 @@
 
   @Override
   public InputStream getAsStream() {
-    return new ByteArrayInputStream(mData);
+    return new ByteArrayInputStream(data);
   }
 
   @Override
   public String toString() {
-    return String.format("{%d byte literal(memory)}", mData.length);
+    return String.format("{%d byte literal(memory)}", data.length);
   }
 }
diff --git a/java/com/android/voicemail/impl/mail/store/imap/ImapResponse.java b/java/com/android/voicemail/impl/mail/store/imap/ImapResponse.java
index d53d458..48eb39d 100644
--- a/java/com/android/voicemail/impl/mail/store/imap/ImapResponse.java
+++ b/java/com/android/voicemail/impl/mail/store/imap/ImapResponse.java
@@ -18,12 +18,12 @@
 
 /** Class represents an IMAP response. */
 public class ImapResponse extends ImapList {
-  private final String mTag;
-  private final boolean mIsContinuationRequest;
+  private final String tag;
+  private final boolean isContinuationRequest;
 
   /* package */ ImapResponse(String tag, boolean isContinuationRequest) {
-    mTag = tag;
-    mIsContinuationRequest = isContinuationRequest;
+    this.tag = tag;
+    this.isContinuationRequest = isContinuationRequest;
   }
 
   /* package */ static boolean isStatusResponse(String symbol) {
@@ -36,12 +36,12 @@
 
   /** @return whether it's a tagged response. */
   public boolean isTagged() {
-    return mTag != null;
+    return tag != null;
   }
 
   /** @return whether it's a continuation request. */
   public boolean isContinuationRequest() {
-    return mIsContinuationRequest;
+    return isContinuationRequest;
   }
 
   public boolean isStatusResponse() {
@@ -112,7 +112,7 @@
 
   @Override
   public String toString() {
-    String tag = mTag;
+    String tag = this.tag;
     if (isContinuationRequest()) {
       tag = "+";
     }
@@ -125,16 +125,16 @@
       return false;
     }
     final ImapResponse thatResponse = (ImapResponse) that;
-    if (mTag == null) {
-      if (thatResponse.mTag != null) {
+    if (tag == null) {
+      if (thatResponse.tag != null) {
         return false;
       }
     } else {
-      if (!mTag.equals(thatResponse.mTag)) {
+      if (!tag.equals(thatResponse.tag)) {
         return false;
       }
     }
-    if (mIsContinuationRequest != thatResponse.mIsContinuationRequest) {
+    if (isContinuationRequest != thatResponse.isContinuationRequest) {
       return false;
     }
     return true;
diff --git a/java/com/android/voicemail/impl/mail/store/imap/ImapResponseParser.java b/java/com/android/voicemail/impl/mail/store/imap/ImapResponseParser.java
index e37106a..68d6bab 100644
--- a/java/com/android/voicemail/impl/mail/store/imap/ImapResponseParser.java
+++ b/java/com/android/voicemail/impl/mail/store/imap/ImapResponseParser.java
@@ -33,21 +33,21 @@
   public static final int LITERAL_KEEP_IN_MEMORY_THRESHOLD = 2 * 1024 * 1024;
 
   /** Input stream */
-  private final PeekableInputStream mIn;
+  private final PeekableInputStream in;
 
-  private final int mLiteralKeepInMemoryThreshold;
+  private final int literalKeepInMemoryThreshold;
 
   /** StringBuilder used by readUntil() */
-  private final StringBuilder mBufferReadUntil = new StringBuilder();
+  private final StringBuilder bufferReadUntil = new StringBuilder();
 
   /** StringBuilder used by parseBareString() */
-  private final StringBuilder mParseBareString = new StringBuilder();
+  private final StringBuilder parseBareString = new StringBuilder();
 
   /**
    * We store all {@link ImapResponse} in it. {@link #destroyResponses()} must be called from time
    * to time to destroy them and clear it.
    */
-  private final ArrayList<ImapResponse> mResponsesToDestroy = new ArrayList<ImapResponse>();
+  private final ArrayList<ImapResponse> responsesToDestroy = new ArrayList<ImapResponse>();
 
   /**
    * Exception thrown when we receive BYE. It derives from IOException, so it'll be treated in the
@@ -68,8 +68,8 @@
 
   /** Constructor for testing to override the literal size threshold. */
   /* package for test */ ImapResponseParser(InputStream in, int literalKeepInMemoryThreshold) {
-    mIn = new PeekableInputStream(in);
-    mLiteralKeepInMemoryThreshold = literalKeepInMemoryThreshold;
+    this.in = new PeekableInputStream(in);
+    this.literalKeepInMemoryThreshold = literalKeepInMemoryThreshold;
   }
 
   private static IOException newEOSException() {
@@ -85,7 +85,7 @@
    * shouldn't see EOF during parsing.
    */
   private int peek() throws IOException {
-    final int next = mIn.peek();
+    final int next = in.peek();
     if (next == -1) {
       throw newEOSException();
     }
@@ -93,13 +93,13 @@
   }
 
   /**
-   * Read and return one byte from {@link #mIn}, and put it in {@link #mDiscourseLogger}.
+   * Read and return one byte from {@link #in}, and put it in {@link #mDiscourseLogger}.
    *
    * <p>Throws IOException() if reaches EOF. As long as logical response lines end with \r\n, we
    * shouldn't see EOF during parsing.
    */
   private int readByte() throws IOException {
-    int next = mIn.read();
+    int next = in.read();
     if (next == -1) {
       throw newEOSException();
     }
@@ -112,10 +112,10 @@
    * @see #readResponse()
    */
   public void destroyResponses() {
-    for (ImapResponse r : mResponsesToDestroy) {
+    for (ImapResponse r : responsesToDestroy) {
       r.destroy();
     }
-    mResponsesToDestroy.clear();
+    responsesToDestroy.clear();
   }
 
   /**
@@ -151,7 +151,7 @@
       response.destroy();
       throw new ByeException();
     }
-    mResponsesToDestroy.add(response);
+    responsesToDestroy.add(response);
     return response;
   }
 
@@ -192,13 +192,13 @@
    * (rather than peeked) and won't be included in the result.
    */
   /* package for test */ String readUntil(char end) throws IOException {
-    mBufferReadUntil.setLength(0);
+    bufferReadUntil.setLength(0);
     for (; ; ) {
       final int ch = readByte();
       if (ch != end) {
-        mBufferReadUntil.append((char) ch);
+        bufferReadUntil.append((char) ch);
       } else {
-        return mBufferReadUntil.toString();
+        return bufferReadUntil.toString();
       }
     }
   }
@@ -326,7 +326,7 @@
    * <p>If the value is "NIL", returns an empty string.
    */
   private ImapString parseBareString() throws IOException, MessagingException {
-    mParseBareString.setLength(0);
+    parseBareString.setLength(0);
     for (; ; ) {
       final int ch = peek();
 
@@ -351,10 +351,10 @@
           ch == '"'
           || (0x00 <= ch && ch <= 0x1f)
           || ch == 0x7f) {
-        if (mParseBareString.length() == 0) {
+        if (parseBareString.length() == 0) {
           throw new MessagingException("Expected string, none found.");
         }
-        String s = mParseBareString.toString();
+        String s = parseBareString.toString();
 
         // NIL will be always converted into the empty string.
         if (ImapConstants.NIL.equalsIgnoreCase(s)) {
@@ -363,11 +363,11 @@
         return new ImapSimpleString(s);
       } else if (ch == '[') {
         // Eat all until next ']'
-        mParseBareString.append((char) readByte());
-        mParseBareString.append(readUntil(']'));
-        mParseBareString.append(']'); // readUntil won't include the end char.
+        parseBareString.append((char) readByte());
+        parseBareString.append(readUntil(']'));
+        parseBareString.append(']'); // readUntil won't include the end char.
       } else {
-        mParseBareString.append((char) readByte());
+        parseBareString.append((char) readByte());
       }
     }
   }
@@ -414,8 +414,8 @@
     }
     expect('\r');
     expect('\n');
-    FixedLengthInputStream in = new FixedLengthInputStream(mIn, size);
-    if (size > mLiteralKeepInMemoryThreshold) {
+    FixedLengthInputStream in = new FixedLengthInputStream(this.in, size);
+    if (size > literalKeepInMemoryThreshold) {
       return new ImapTempFileLiteral(in);
     } else {
       return new ImapMemoryLiteral(in);
diff --git a/java/com/android/voicemail/impl/mail/store/imap/ImapSimpleString.java b/java/com/android/voicemail/impl/mail/store/imap/ImapSimpleString.java
index 7cc866b..76d3c6e 100644
--- a/java/com/android/voicemail/impl/mail/store/imap/ImapSimpleString.java
+++ b/java/com/android/voicemail/impl/mail/store/imap/ImapSimpleString.java
@@ -24,27 +24,27 @@
 /** Subclass of {@link ImapString} used for non literals. */
 public class ImapSimpleString extends ImapString {
   private final String TAG = "ImapSimpleString";
-  private String mString;
+  private String string;
 
   /* package */ ImapSimpleString(String string) {
-    mString = (string != null) ? string : "";
+    this.string = (string != null) ? string : "";
   }
 
   @Override
   public void destroy() {
-    mString = null;
+    string = null;
     super.destroy();
   }
 
   @Override
   public String getString() {
-    return mString;
+    return string;
   }
 
   @Override
   public InputStream getAsStream() {
     try {
-      return new ByteArrayInputStream(mString.getBytes("US-ASCII"));
+      return new ByteArrayInputStream(string.getBytes("US-ASCII"));
     } catch (UnsupportedEncodingException e) {
       VvmLog.e(TAG, "Unsupported encoding: ", e);
     }
@@ -54,6 +54,6 @@
   @Override
   public String toString() {
     // Purposefully not return just mString, in order to prevent using it instead of getString.
-    return "\"" + mString + "\"";
+    return "\"" + string + "\"";
   }
 }
diff --git a/java/com/android/voicemail/impl/mail/store/imap/ImapString.java b/java/com/android/voicemail/impl/mail/store/imap/ImapString.java
index d5c5551..099e569 100644
--- a/java/com/android/voicemail/impl/mail/store/imap/ImapString.java
+++ b/java/com/android/voicemail/impl/mail/store/imap/ImapString.java
@@ -64,9 +64,9 @@
   private static final SimpleDateFormat DATE_TIME_FORMAT =
       new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss Z", Locale.US);
 
-  private boolean mIsInteger;
-  private int mParsedInteger;
-  private Date mParsedDate;
+  private boolean isInteger;
+  private int parsedInteger;
+  private Date parsedDate;
 
   @Override
   public final boolean isList() {
@@ -94,12 +94,12 @@
 
   /** @return whether it can be parsed as a number. */
   public final boolean isNumber() {
-    if (mIsInteger) {
+    if (isInteger) {
       return true;
     }
     try {
-      mParsedInteger = Integer.parseInt(getString());
-      mIsInteger = true;
+      parsedInteger = Integer.parseInt(getString());
+      isInteger = true;
       return true;
     } catch (NumberFormatException e) {
       return false;
@@ -116,19 +116,19 @@
     if (!isNumber()) {
       return defaultValue;
     }
-    return mParsedInteger;
+    return parsedInteger;
   }
 
   /** @return whether it can be parsed as a date using {@link #DATE_TIME_FORMAT}. */
   public final boolean isDate() {
-    if (mParsedDate != null) {
+    if (parsedDate != null) {
       return true;
     }
     if (isEmpty()) {
       return false;
     }
     try {
-      mParsedDate = DATE_TIME_FORMAT.parse(getString());
+      parsedDate = DATE_TIME_FORMAT.parse(getString());
       return true;
     } catch (ParseException e) {
       VvmLog.w("ImapString", getString() + " can't be parsed as a date.");
@@ -141,7 +141,7 @@
     if (!isDate()) {
       return null;
     }
-    return mParsedDate;
+    return parsedDate;
   }
 
   /** @return whether the value case-insensitively equals to {@code s}. */
diff --git a/java/com/android/voicemail/impl/mail/store/imap/ImapTempFileLiteral.java b/java/com/android/voicemail/impl/mail/store/imap/ImapTempFileLiteral.java
index ab64d85..417adcc 100644
--- a/java/com/android/voicemail/impl/mail/store/imap/ImapTempFileLiteral.java
+++ b/java/com/android/voicemail/impl/mail/store/imap/ImapTempFileLiteral.java
@@ -33,20 +33,20 @@
 public class ImapTempFileLiteral extends ImapString {
   private final String TAG = "ImapTempFileLiteral";
 
-  /* package for test */ final File mFile;
+  /* package for test */ final File file;
 
   /** Size is purely for toString() */
-  private final int mSize;
+  private final int size;
 
   /* package */ ImapTempFileLiteral(FixedLengthInputStream stream) throws IOException {
-    mSize = stream.getLength();
-    mFile = File.createTempFile("imap", ".tmp", TempDirectory.getTempDirectory());
+    size = stream.getLength();
+    file = File.createTempFile("imap", ".tmp", TempDirectory.getTempDirectory());
 
     // Unfortunately, we can't really use deleteOnExit(), because temp filenames are random
     // so it'd simply cause a memory leak.
     // deleteOnExit() simply adds filenames to a static list and the list will never shrink.
     // mFile.deleteOnExit();
-    OutputStream out = new FileOutputStream(mFile);
+    OutputStream out = new FileOutputStream(file);
     IOUtils.copy(stream, out);
     out.close();
   }
@@ -69,7 +69,7 @@
   public InputStream getAsStream() {
     checkNotDestroyed();
     try {
-      return new FileInputStream(mFile);
+      return new FileInputStream(file);
     } catch (FileNotFoundException e) {
       // It's probably possible if we're low on storage and the system clears the cache dir.
       LogUtils.w(TAG, "ImapTempFileLiteral: Temp file not found");
@@ -98,8 +98,8 @@
   @Override
   public void destroy() {
     try {
-      if (!isDestroyed() && mFile.exists()) {
-        mFile.delete();
+      if (!isDestroyed() && file.exists()) {
+        file.delete();
       }
     } catch (RuntimeException re) {
       // Just log and ignore.
@@ -110,10 +110,10 @@
 
   @Override
   public String toString() {
-    return String.format("{%d byte literal(file)}", mSize);
+    return String.format("{%d byte literal(file)}", size);
   }
 
   public boolean tempFileExistsForTest() {
-    return mFile.exists();
+    return file.exists();
   }
 }
diff --git a/java/com/android/voicemail/impl/mail/utility/CountingOutputStream.java b/java/com/android/voicemail/impl/mail/utility/CountingOutputStream.java
index c358610..0136b02 100644
--- a/java/com/android/voicemail/impl/mail/utility/CountingOutputStream.java
+++ b/java/com/android/voicemail/impl/mail/utility/CountingOutputStream.java
@@ -23,26 +23,26 @@
  * count available to callers.
  */
 public class CountingOutputStream extends OutputStream {
-  private long mCount;
-  private final OutputStream mOutputStream;
+  private long count;
+  private final OutputStream outputStream;
 
   public CountingOutputStream(OutputStream outputStream) {
-    mOutputStream = outputStream;
+    this.outputStream = outputStream;
   }
 
   public long getCount() {
-    return mCount;
+    return count;
   }
 
   @Override
   public void write(byte[] buffer, int offset, int count) throws IOException {
-    mOutputStream.write(buffer, offset, count);
-    mCount += count;
+    outputStream.write(buffer, offset, count);
+    this.count += count;
   }
 
   @Override
   public void write(int oneByte) throws IOException {
-    mOutputStream.write(oneByte);
-    mCount++;
+    outputStream.write(oneByte);
+    count++;
   }
 }
diff --git a/java/com/android/voicemail/impl/mail/utils/LogUtils.java b/java/com/android/voicemail/impl/mail/utils/LogUtils.java
index f6c3c6b..772048d 100644
--- a/java/com/android/voicemail/impl/mail/utils/LogUtils.java
+++ b/java/com/android/voicemail/impl/mail/utils/LogUtils.java
@@ -1,5 +1,5 @@
-/**
- * Copyright (c) 2015 The Android Open Source Project
+/*
+ * Copyright (C) 2015 The Android Open Source Project
  *
  * <p>Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
  * except in compliance with the License. You may obtain a copy of the License at
@@ -46,7 +46,7 @@
    */
   private static final int MAX_ENABLED_LOG_LEVEL = DEBUG;
 
-  private static Boolean sDebugLoggingEnabledForTests = null;
+  private static Boolean debugLoggingEnabledForTests = null;
 
   /** Enable debug logging for unit tests. */
   @VisibleForTesting
@@ -55,7 +55,7 @@
   }
 
   protected static void setDebugLoggingEnabledForTestsInternal(boolean enabled) {
-    sDebugLoggingEnabledForTests = Boolean.valueOf(enabled);
+    debugLoggingEnabledForTests = Boolean.valueOf(enabled);
   }
 
   /** Returns true if the build configuration prevents debug logging. */
@@ -69,8 +69,8 @@
     if (buildPreventsDebugLogging()) {
       return false;
     }
-    if (sDebugLoggingEnabledForTests != null) {
-      return sDebugLoggingEnabledForTests.booleanValue();
+    if (debugLoggingEnabledForTests != null) {
+      return debugLoggingEnabledForTests.booleanValue();
     }
     return Log.isLoggable(tag, Log.DEBUG) || Log.isLoggable(TAG, Log.DEBUG);
   }
diff --git a/java/com/android/voicemail/impl/protocol/Vvm3Subscriber.java b/java/com/android/voicemail/impl/protocol/Vvm3Subscriber.java
index d9a0649..ce5094f 100644
--- a/java/com/android/voicemail/impl/protocol/Vvm3Subscriber.java
+++ b/java/com/android/voicemail/impl/protocol/Vvm3Subscriber.java
@@ -131,15 +131,15 @@
 
   private static final int REQUEST_TIMEOUT_SECONDS = 30;
 
-  private final ActivationTask mTask;
-  private final PhoneAccountHandle mHandle;
-  private final OmtpVvmCarrierConfigHelper mHelper;
-  private final VoicemailStatus.Editor mStatus;
-  private final Bundle mData;
+  private final ActivationTask task;
+  private final PhoneAccountHandle handle;
+  private final OmtpVvmCarrierConfigHelper helper;
+  private final VoicemailStatus.Editor status;
+  private final Bundle data;
 
-  private final String mNumber;
+  private final String number;
 
-  private RequestQueue mRequestQueue;
+  private RequestQueue requestQueue;
 
   @VisibleForTesting
   static class ProvisioningException extends Exception {
@@ -166,19 +166,19 @@
       VoicemailStatus.Editor status,
       Bundle data) {
     Assert.isNotMainThread();
-    mTask = task;
-    mHandle = handle;
-    mHelper = helper;
-    mStatus = status;
-    mData = data;
+    this.task = task;
+    this.handle = handle;
+    this.helper = helper;
+    this.status = status;
+    this.data = data;
 
     // Assuming getLine1Number() will work with VVM3. For unprovisioned users the IMAP username
     // is not included in the status SMS, thus no other way to get the current phone number.
-    mNumber =
-        mHelper
+    number =
+        this.helper
             .getContext()
             .getSystemService(TelephonyManager.class)
-            .createForPhoneAccountHandle(mHandle)
+            .createForPhoneAccountHandle(this.handle)
             .getLine1Number();
   }
 
@@ -189,15 +189,15 @@
     // processSubscription() is called after network is available.
     VvmLog.i(TAG, "Subscribing");
 
-    try (NetworkWrapper wrapper = VvmNetworkRequest.getNetwork(mHelper, mHandle, mStatus)) {
+    try (NetworkWrapper wrapper = VvmNetworkRequest.getNetwork(helper, handle, status)) {
       Network network = wrapper.get();
       VvmLog.d(TAG, "provisioning: network available");
-      mRequestQueue =
-          Volley.newRequestQueue(mHelper.getContext(), new NetworkSpecifiedHurlStack(network));
+      requestQueue =
+          Volley.newRequestQueue(helper.getContext(), new NetworkSpecifiedHurlStack(network));
       processSubscription();
     } catch (RequestFailedException e) {
-      mHelper.handleEvent(mStatus, OmtpEvents.VVM3_VMG_CONNECTION_FAILED);
-      mTask.fail();
+      helper.handleEvent(status, OmtpEvents.VVM3_VMG_CONNECTION_FAILED);
+      task.fail();
     }
   }
 
@@ -206,11 +206,11 @@
       String gatewayUrl = getSelfProvisioningGateway();
       String selfProvisionResponse = getSelfProvisionResponse(gatewayUrl);
       String subscribeLink =
-          findSubscribeLink(getSubscribeLinkPatterns(mHelper.getContext()), selfProvisionResponse);
+          findSubscribeLink(getSubscribeLinkPatterns(helper.getContext()), selfProvisionResponse);
       clickSubscribeLink(subscribeLink);
     } catch (ProvisioningException e) {
       VvmLog.e(TAG, e.toString());
-      mTask.fail();
+      task.fail();
     }
   }
 
@@ -236,7 +236,7 @@
           @Override
           protected Map<String, String> getParams() {
             Map<String, String> params = new ArrayMap<>();
-            params.put(SPG_VZW_MDN_PARAM, mNumber);
+            params.put(SPG_VZW_MDN_PARAM, number);
             params.put(SPG_VZW_SERVICE_PARAM, SPG_VZW_SERVICE_BASIC);
             params.put(SPG_DEVICE_MODEL_PARAM, SPG_DEVICE_MODEL_ANDROID);
             params.put(SPG_APP_TOKEN_PARAM, SPG_APP_TOKEN);
@@ -247,11 +247,11 @@
           }
         };
 
-    mRequestQueue.add(stringRequest);
+    requestQueue.add(stringRequest);
     try {
       return future.get(REQUEST_TIMEOUT_SECONDS, TimeUnit.SECONDS);
     } catch (InterruptedException | ExecutionException | TimeoutException e) {
-      mHelper.handleEvent(mStatus, OmtpEvents.VVM3_SPG_CONNECTION_FAILED);
+      helper.handleEvent(status, OmtpEvents.VVM3_SPG_CONNECTION_FAILED);
       throw new ProvisioningException(e.toString());
     }
   }
@@ -262,12 +262,12 @@
 
     StringRequest stringRequest =
         new StringRequest(Request.Method.POST, subscribeLink, future, future);
-    mRequestQueue.add(stringRequest);
+    requestQueue.add(stringRequest);
     try {
       // A new STATUS SMS will be sent after this request.
       future.get(REQUEST_TIMEOUT_SECONDS, TimeUnit.SECONDS);
     } catch (TimeoutException | ExecutionException | InterruptedException e) {
-      mHelper.handleEvent(mStatus, OmtpEvents.VVM3_SPG_CONNECTION_FAILED);
+      helper.handleEvent(status, OmtpEvents.VVM3_SPG_CONNECTION_FAILED);
       throw new ProvisioningException(e.toString());
     }
     // It could take very long for the STATUS SMS to return. Waiting for it is unreliable.
@@ -277,7 +277,7 @@
 
   private String vvm3XmlRequest(String operation) throws ProvisioningException {
     VvmLog.d(TAG, "Sending vvm3XmlRequest for " + operation);
-    String voicemailManagementGateway = mData.getString(VMG_URL_KEY);
+    String voicemailManagementGateway = data.getString(VMG_URL_KEY);
     if (voicemailManagementGateway == null) {
       VvmLog.e(TAG, "voicemailManagementGateway url unknown");
       return null;
@@ -285,7 +285,7 @@
     String transactionId = createTransactionId();
     String body =
         String.format(
-            Locale.US, VMG_XML_REQUEST_FORMAT, transactionId, mNumber, operation, Build.MODEL);
+            Locale.US, VMG_XML_REQUEST_FORMAT, transactionId, number, operation, Build.MODEL);
 
     RequestFuture<String> future = RequestFuture.newFuture();
     StringRequest stringRequest =
@@ -295,7 +295,7 @@
             return body.getBytes();
           }
         };
-    mRequestQueue.add(stringRequest);
+    requestQueue.add(stringRequest);
 
     try {
       String response = future.get(REQUEST_TIMEOUT_SECONDS, TimeUnit.SECONDS);
@@ -304,7 +304,7 @@
       }
       return response;
     } catch (InterruptedException | ExecutionException | TimeoutException e) {
-      mHelper.handleEvent(mStatus, OmtpEvents.VVM3_VMG_CONNECTION_FAILED);
+      helper.handleEvent(status, OmtpEvents.VVM3_VMG_CONNECTION_FAILED);
       throw new ProvisioningException(e.toString());
     }
   }
@@ -364,15 +364,15 @@
 
   private static class NetworkSpecifiedHurlStack extends HurlStack {
 
-    private final Network mNetwork;
+    private final Network network;
 
     public NetworkSpecifiedHurlStack(Network network) {
-      mNetwork = network;
+      this.network = network;
     }
 
     @Override
     protected HttpURLConnection createConnection(URL url) throws IOException {
-      return (HttpURLConnection) mNetwork.openConnection(url);
+      return (HttpURLConnection) network.openConnection(url);
     }
   }
 }
diff --git a/java/com/android/voicemail/impl/scheduling/BaseTask.java b/java/com/android/voicemail/impl/scheduling/BaseTask.java
index 773d026..0b70758 100644
--- a/java/com/android/voicemail/impl/scheduling/BaseTask.java
+++ b/java/com/android/voicemail/impl/scheduling/BaseTask.java
@@ -44,25 +44,25 @@
 
   private static final String EXTRA_EXECUTION_TIME = "extra_execution_time";
 
-  private Bundle mExtras;
+  private Bundle extras;
 
-  private Context mContext;
+  private Context context;
 
-  private int mId;
-  private PhoneAccountHandle mPhoneAccountHandle;
+  private int id;
+  private PhoneAccountHandle phoneAccountHandle;
 
-  private boolean mHasStarted;
-  private volatile boolean mHasFailed;
+  private boolean hasStarted;
+  private volatile boolean hasFailed;
 
-  @NonNull private final List<Policy> mPolicies = new ArrayList<>();
+  @NonNull private final List<Policy> policies = new ArrayList<>();
 
-  private long mExecutionTime;
+  private long executionTime;
 
-  private static Clock sClock = new Clock();
+  private static Clock clock = new Clock();
 
   protected BaseTask(int id) {
-    mId = id;
-    mExecutionTime = getTimeMillis();
+    this.id = id;
+    executionTime = getTimeMillis();
   }
 
   /**
@@ -72,27 +72,27 @@
   @MainThread
   public void setId(int id) {
     Assert.isMainThread();
-    mId = id;
+    this.id = id;
   }
 
   @MainThread
   public boolean hasStarted() {
     Assert.isMainThread();
-    return mHasStarted;
+    return hasStarted;
   }
 
   @MainThread
   public boolean hasFailed() {
     Assert.isMainThread();
-    return mHasFailed;
+    return hasFailed;
   }
 
   public Context getContext() {
-    return mContext;
+    return context;
   }
 
   public PhoneAccountHandle getPhoneAccountHandle() {
-    return mPhoneAccountHandle;
+    return phoneAccountHandle;
   }
   /**
    * Should be call in the constructor or {@link Policy#onCreate(BaseTask, Bundle)} will be missed.
@@ -100,7 +100,7 @@
   @MainThread
   public BaseTask addPolicy(Policy policy) {
     Assert.isMainThread();
-    mPolicies.add(policy);
+    policies.add(policy);
     return this;
   }
 
@@ -112,18 +112,18 @@
   @WorkerThread
   public void fail() {
     Assert.isNotMainThread();
-    mHasFailed = true;
+    hasFailed = true;
   }
 
   /** @param timeMillis the time since epoch, in milliseconds. */
   @MainThread
   public void setExecutionTime(long timeMillis) {
     Assert.isMainThread();
-    mExecutionTime = timeMillis;
+    executionTime = timeMillis;
   }
 
   public long getTimeMillis() {
-    return sClock.getTimeMillis();
+    return clock.getTimeMillis();
   }
 
   /**
@@ -131,7 +131,7 @@
    * their intent upon this.
    */
   public Intent createRestartIntent() {
-    return createIntent(getContext(), this.getClass(), mPhoneAccountHandle);
+    return createIntent(getContext(), this.getClass(), phoneAccountHandle);
   }
 
   /**
@@ -147,22 +147,22 @@
 
   @Override
   public TaskId getId() {
-    return new TaskId(mId, mPhoneAccountHandle);
+    return new TaskId(id, phoneAccountHandle);
   }
 
   @Override
   public Bundle toBundle() {
-    mExtras.putLong(EXTRA_EXECUTION_TIME, mExecutionTime);
-    return mExtras;
+    extras.putLong(EXTRA_EXECUTION_TIME, executionTime);
+    return extras;
   }
 
   @Override
   @CallSuper
   public void onCreate(Context context, Bundle extras) {
-    mContext = context;
-    mExtras = extras;
-    mPhoneAccountHandle = extras.getParcelable(EXTRA_PHONE_ACCOUNT_HANDLE);
-    for (Policy policy : mPolicies) {
+    this.context = context;
+    this.extras = extras;
+    phoneAccountHandle = extras.getParcelable(EXTRA_PHONE_ACCOUNT_HANDLE);
+    for (Policy policy : policies) {
       policy.onCreate(this, extras);
     }
   }
@@ -170,42 +170,42 @@
   @Override
   @CallSuper
   public void onRestore(Bundle extras) {
-    if (mExtras.containsKey(EXTRA_EXECUTION_TIME)) {
-      mExecutionTime = extras.getLong(EXTRA_EXECUTION_TIME);
+    if (this.extras.containsKey(EXTRA_EXECUTION_TIME)) {
+      executionTime = extras.getLong(EXTRA_EXECUTION_TIME);
     }
   }
 
   @Override
   public long getReadyInMilliSeconds() {
-    return mExecutionTime - getTimeMillis();
+    return executionTime - getTimeMillis();
   }
 
   @Override
   @CallSuper
   public void onBeforeExecute() {
-    for (Policy policy : mPolicies) {
+    for (Policy policy : policies) {
       policy.onBeforeExecute();
     }
-    mHasStarted = true;
+    hasStarted = true;
   }
 
   @Override
   @CallSuper
   public void onCompleted() {
-    if (mHasFailed) {
-      for (Policy policy : mPolicies) {
+    if (hasFailed) {
+      for (Policy policy : policies) {
         policy.onFail();
       }
     }
 
-    for (Policy policy : mPolicies) {
+    for (Policy policy : policies) {
       policy.onCompleted();
     }
   }
 
   @Override
   public void onDuplicatedTaskAdded(Task task) {
-    for (Policy policy : mPolicies) {
+    for (Policy policy : policies) {
       policy.onDuplicatedTaskAdded();
     }
   }
@@ -221,6 +221,6 @@
   /** Used to replace the clock with an deterministic clock */
   @NeededForTesting
   static void setClockForTesting(Clock clock) {
-    sClock = clock;
+    BaseTask.clock = clock;
   }
 }
diff --git a/java/com/android/voicemail/impl/scheduling/MinimalIntervalPolicy.java b/java/com/android/voicemail/impl/scheduling/MinimalIntervalPolicy.java
index 342b56e..6d6a0a1 100644
--- a/java/com/android/voicemail/impl/scheduling/MinimalIntervalPolicy.java
+++ b/java/com/android/voicemail/impl/scheduling/MinimalIntervalPolicy.java
@@ -27,18 +27,18 @@
  */
 public class MinimalIntervalPolicy implements Policy {
 
-  BaseTask mTask;
-  TaskId mId;
-  int mBlockForMillis;
+  BaseTask task;
+  TaskId id;
+  int blockForMillis;
 
   public MinimalIntervalPolicy(int blockForMillis) {
-    mBlockForMillis = blockForMillis;
+    this.blockForMillis = blockForMillis;
   }
 
   @Override
   public void onCreate(BaseTask task, Bundle extras) {
-    mTask = task;
-    mId = mTask.getId();
+    this.task = task;
+    id = this.task.getId();
   }
 
   @Override
@@ -46,12 +46,12 @@
 
   @Override
   public void onCompleted() {
-    if (!mTask.hasFailed()) {
+    if (!task.hasFailed()) {
       Intent intent =
-          BaseTask.createIntent(mTask.getContext(), BlockerTask.class, mId.phoneAccountHandle);
-      intent.putExtra(BlockerTask.EXTRA_TASK_ID, mId.id);
-      intent.putExtra(BlockerTask.EXTRA_BLOCK_FOR_MILLIS, mBlockForMillis);
-      mTask.getContext().sendBroadcast(intent);
+          BaseTask.createIntent(task.getContext(), BlockerTask.class, id.phoneAccountHandle);
+      intent.putExtra(BlockerTask.EXTRA_TASK_ID, id.id);
+      intent.putExtra(BlockerTask.EXTRA_BLOCK_FOR_MILLIS, blockForMillis);
+      task.getContext().sendBroadcast(intent);
     }
   }
 
diff --git a/java/com/android/voicemail/impl/scheduling/PostponePolicy.java b/java/com/android/voicemail/impl/scheduling/PostponePolicy.java
index 46773b5..8ff1478 100644
--- a/java/com/android/voicemail/impl/scheduling/PostponePolicy.java
+++ b/java/com/android/voicemail/impl/scheduling/PostponePolicy.java
@@ -29,17 +29,17 @@
 
   private static final String TAG = "PostponePolicy";
 
-  private final int mPostponeMillis;
-  private BaseTask mTask;
+  private final int postponeMillis;
+  private BaseTask task;
 
   public PostponePolicy(int postponeMillis) {
-    mPostponeMillis = postponeMillis;
+    this.postponeMillis = postponeMillis;
   }
 
   @Override
   public void onCreate(BaseTask task, Bundle extras) {
-    mTask = task;
-    mTask.setExecutionTime(mTask.getTimeMillis() + mPostponeMillis);
+    this.task = task;
+    this.task.setExecutionTime(this.task.getTimeMillis() + postponeMillis);
   }
 
   @Override
@@ -59,10 +59,10 @@
 
   @Override
   public void onDuplicatedTaskAdded() {
-    if (mTask.hasStarted()) {
+    if (task.hasStarted()) {
       return;
     }
-    VvmLog.i(TAG, "postponing " + mTask);
-    mTask.setExecutionTime(mTask.getTimeMillis() + mPostponeMillis);
+    VvmLog.i(TAG, "postponing " + task);
+    task.setExecutionTime(task.getTimeMillis() + postponeMillis);
   }
 }
diff --git a/java/com/android/voicemail/impl/scheduling/RetryPolicy.java b/java/com/android/voicemail/impl/scheduling/RetryPolicy.java
index c408bdc..ec4d72d 100644
--- a/java/com/android/voicemail/impl/scheduling/RetryPolicy.java
+++ b/java/com/android/voicemail/impl/scheduling/RetryPolicy.java
@@ -32,23 +32,23 @@
   private static final String TAG = "RetryPolicy";
   private static final String EXTRA_RETRY_COUNT = "extra_retry_count";
 
-  private final int mRetryLimit;
-  private final int mRetryDelayMillis;
+  private final int retryLimit;
+  private final int retryDelayMillis;
 
-  private BaseTask mTask;
+  private BaseTask task;
 
-  private int mRetryCount;
-  private boolean mFailed;
+  private int retryCount;
+  private boolean failed;
 
-  private VoicemailStatus.DeferredEditor mVoicemailStatusEditor;
+  private VoicemailStatus.DeferredEditor voicemailStatusEditor;
 
   public RetryPolicy(int retryLimit, int retryDelayMillis) {
-    mRetryLimit = retryLimit;
-    mRetryDelayMillis = retryDelayMillis;
+    this.retryLimit = retryLimit;
+    this.retryDelayMillis = retryDelayMillis;
   }
 
   private boolean hasMoreRetries() {
-    return mRetryCount < mRetryLimit;
+    return retryCount < retryLimit;
   }
 
   /**
@@ -57,18 +57,23 @@
    * the task is successful or there are no retries left.
    */
   public VoicemailStatus.Editor getVoicemailStatusEditor() {
-    return mVoicemailStatusEditor;
+    return voicemailStatusEditor;
   }
 
   @Override
   public void onCreate(BaseTask task, Bundle extras) {
-    mTask = task;
-    mRetryCount = extras.getInt(EXTRA_RETRY_COUNT, 0);
-    if (mRetryCount > 0) {
+    this.task = task;
+    retryCount = extras.getInt(EXTRA_RETRY_COUNT, 0);
+    if (retryCount > 0) {
       VvmLog.i(
           TAG,
-          "retry #" + mRetryCount + " for " + mTask + " queued, executing in " + mRetryDelayMillis);
-      mTask.setExecutionTime(mTask.getTimeMillis() + mRetryDelayMillis);
+          "retry #"
+              + retryCount
+              + " for "
+              + this.task
+              + " queued, executing in "
+              + retryDelayMillis);
+      this.task.setExecutionTime(this.task.getTimeMillis() + retryDelayMillis);
     }
     PhoneAccountHandle phoneAccountHandle = task.getPhoneAccountHandle();
     if (phoneAccountHandle == null) {
@@ -76,7 +81,7 @@
       // This should never happen, but continue on if it does. The status write will be
       // discarded.
     }
-    mVoicemailStatusEditor = VoicemailStatus.deferredEdit(task.getContext(), phoneAccountHandle);
+    voicemailStatusEditor = VoicemailStatus.deferredEdit(task.getContext(), phoneAccountHandle);
   }
 
   @Override
@@ -84,27 +89,27 @@
 
   @Override
   public void onCompleted() {
-    if (!mFailed || !hasMoreRetries()) {
-      if (!mFailed) {
-        VvmLog.i(TAG, mTask + " completed successfully");
+    if (!failed || !hasMoreRetries()) {
+      if (!failed) {
+        VvmLog.i(TAG, task + " completed successfully");
       }
       if (!hasMoreRetries()) {
-        VvmLog.i(TAG, "Retry limit for " + mTask + " reached");
+        VvmLog.i(TAG, "Retry limit for " + task + " reached");
       }
-      VvmLog.i(TAG, "committing deferred status: " + mVoicemailStatusEditor.getValues());
-      mVoicemailStatusEditor.deferredApply();
+      VvmLog.i(TAG, "committing deferred status: " + voicemailStatusEditor.getValues());
+      voicemailStatusEditor.deferredApply();
       return;
     }
-    VvmLog.i(TAG, "discarding deferred status: " + mVoicemailStatusEditor.getValues());
-    Intent intent = mTask.createRestartIntent();
-    intent.putExtra(EXTRA_RETRY_COUNT, mRetryCount + 1);
+    VvmLog.i(TAG, "discarding deferred status: " + voicemailStatusEditor.getValues());
+    Intent intent = task.createRestartIntent();
+    intent.putExtra(EXTRA_RETRY_COUNT, retryCount + 1);
 
-    mTask.getContext().sendBroadcast(intent);
+    task.getContext().sendBroadcast(intent);
   }
 
   @Override
   public void onFail() {
-    mFailed = true;
+    failed = true;
   }
 
   @Override
diff --git a/java/com/android/voicemail/impl/sms/OmtpMessageReceiver.java b/java/com/android/voicemail/impl/sms/OmtpMessageReceiver.java
index 4383527..eae990a 100644
--- a/java/com/android/voicemail/impl/sms/OmtpMessageReceiver.java
+++ b/java/com/android/voicemail/impl/sms/OmtpMessageReceiver.java
@@ -46,11 +46,11 @@
 
   private static final String TAG = "OmtpMessageReceiver";
 
-  private Context mContext;
+  private Context context;
 
   @Override
   public void onReceive(Context context, Intent intent) {
-    mContext = context;
+    this.context = context;
     VisualVoicemailSms sms = intent.getExtras().getParcelable(OmtpService.EXTRA_VOICEMAIL_SMS);
     PhoneAccountHandle phone = sms.getPhoneAccountHandle();
 
@@ -69,12 +69,12 @@
       return;
     }
 
-    OmtpVvmCarrierConfigHelper helper = new OmtpVvmCarrierConfigHelper(mContext, phone);
+    OmtpVvmCarrierConfigHelper helper = new OmtpVvmCarrierConfigHelper(this.context, phone);
     if (!helper.isValid()) {
       VvmLog.e(TAG, "vvm config no longer valid");
       return;
     }
-    if (!VisualVoicemailSettingsUtil.isEnabled(mContext, phone)) {
+    if (!VisualVoicemailSettingsUtil.isEnabled(this.context, phone)) {
       if (helper.isLegacyModeEnabled()) {
         LegacyModeSmsHandler.handle(context, sms);
       } else {
@@ -140,18 +140,18 @@
                 .setPhoneAccount(phone)
                 .setSourceData(message.getId())
                 .setDuration(message.getLength())
-                .setSourcePackage(mContext.getPackageName());
+                .setSourcePackage(context.getPackageName());
         Voicemail voicemail = builder.build();
 
-        VoicemailsQueryHelper queryHelper = new VoicemailsQueryHelper(mContext);
+        VoicemailsQueryHelper queryHelper = new VoicemailsQueryHelper(context);
         if (queryHelper.isVoicemailUnique(voicemail)) {
-          Uri uri = VoicemailDatabaseUtil.insert(mContext, voicemail);
+          Uri uri = VoicemailDatabaseUtil.insert(context, voicemail);
           voicemail = builder.setId(ContentUris.parseId(uri)).setUri(uri).build();
-          SyncOneTask.start(mContext, phone, voicemail);
+          SyncOneTask.start(context, phone, voicemail);
         }
         break;
       case OmtpConstants.MAILBOX_UPDATE:
-        SyncTask.start(mContext, phone);
+        SyncTask.start(context, phone);
         break;
       case OmtpConstants.GREETINGS_UPDATE:
         // Not implemented in V1
diff --git a/java/com/android/voicemail/impl/sms/OmtpMessageSender.java b/java/com/android/voicemail/impl/sms/OmtpMessageSender.java
index 19661e9..76a2583 100644
--- a/java/com/android/voicemail/impl/sms/OmtpMessageSender.java
+++ b/java/com/android/voicemail/impl/sms/OmtpMessageSender.java
@@ -35,20 +35,20 @@
  */
 public abstract class OmtpMessageSender {
   protected static final String TAG = "OmtpMessageSender";
-  protected final Context mContext;
-  protected final PhoneAccountHandle mPhoneAccountHandle;
-  protected final short mApplicationPort;
-  protected final String mDestinationNumber;
+  protected final Context context;
+  protected final PhoneAccountHandle phoneAccountHandle;
+  protected final short applicationPort;
+  protected final String destinationNumber;
 
   public OmtpMessageSender(
       Context context,
       PhoneAccountHandle phoneAccountHandle,
       short applicationPort,
       String destinationNumber) {
-    mContext = context;
-    mPhoneAccountHandle = phoneAccountHandle;
-    mApplicationPort = applicationPort;
-    mDestinationNumber = destinationNumber;
+    this.context = context;
+    this.phoneAccountHandle = phoneAccountHandle;
+    this.applicationPort = applicationPort;
+    this.destinationNumber = destinationNumber;
   }
 
   /**
@@ -78,11 +78,10 @@
   protected void sendSms(String text, PendingIntent sentIntent) {
 
     VvmLog.v(
-        TAG,
-        String.format("Sending sms '%s' to %s:%d", text, mDestinationNumber, mApplicationPort));
+        TAG, String.format("Sending sms '%s' to %s:%d", text, destinationNumber, applicationPort));
 
     TelephonyMangerCompat.sendVisualVoicemailSms(
-        mContext, mPhoneAccountHandle, mDestinationNumber, mApplicationPort, text, sentIntent);
+        context, phoneAccountHandle, destinationNumber, applicationPort, text, sentIntent);
   }
 
   protected void appendField(StringBuilder sb, String field, Object value) {
diff --git a/java/com/android/voicemail/impl/sms/OmtpStandardMessageSender.java b/java/com/android/voicemail/impl/sms/OmtpStandardMessageSender.java
index 7974699..a8d27ff 100644
--- a/java/com/android/voicemail/impl/sms/OmtpStandardMessageSender.java
+++ b/java/com/android/voicemail/impl/sms/OmtpStandardMessageSender.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2015 Google Inc. All Rights Reserved.
+ * Copyright (C) 2015 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,9 +24,9 @@
 
 /** A implementation of the OmtpMessageSender using the standard OMTP sms protocol. */
 public class OmtpStandardMessageSender extends OmtpMessageSender {
-  private final String mClientType;
-  private final String mProtocolVersion;
-  private final String mClientPrefix;
+  private final String clientType;
+  private final String protocolVersion;
+  private final String clientPrefix;
 
   /**
    * Creates a new instance of OmtpStandardMessageSender.
@@ -49,9 +49,9 @@
       String protocolVersion,
       String clientPrefix) {
     super(context, phoneAccountHandle, applicationPort, destinationNumber);
-    mClientType = clientType;
-    mProtocolVersion = protocolVersion;
-    mClientPrefix = clientPrefix;
+    this.clientType = clientType;
+    this.protocolVersion = protocolVersion;
+    this.clientPrefix = clientPrefix;
   }
 
   // Activate message:
@@ -63,8 +63,8 @@
     StringBuilder sb = new StringBuilder().append(OmtpConstants.ACTIVATE_REQUEST);
 
     appendProtocolVersionAndClientType(sb);
-    if (TextUtils.equals(mProtocolVersion, OmtpConstants.PROTOCOL_VERSION1_2)
-        || TextUtils.equals(mProtocolVersion, OmtpConstants.PROTOCOL_VERSION1_3)) {
+    if (TextUtils.equals(protocolVersion, OmtpConstants.PROTOCOL_VERSION1_2)
+        || TextUtils.equals(protocolVersion, OmtpConstants.PROTOCOL_VERSION1_3)) {
       appendApplicationPort(sb);
       appendClientPrefix(sb);
     }
@@ -92,7 +92,7 @@
   public void requestVvmStatus(@Nullable PendingIntent sentIntent) {
     StringBuilder sb = new StringBuilder().append(OmtpConstants.STATUS_REQUEST);
 
-    if (TextUtils.equals(mProtocolVersion, OmtpConstants.PROTOCOL_VERSION1_3)) {
+    if (TextUtils.equals(protocolVersion, OmtpConstants.PROTOCOL_VERSION1_3)) {
       appendProtocolVersionAndClientType(sb);
       appendApplicationPort(sb);
       appendClientPrefix(sb);
@@ -103,18 +103,18 @@
 
   private void appendProtocolVersionAndClientType(StringBuilder sb) {
     sb.append(OmtpConstants.SMS_PREFIX_SEPARATOR);
-    appendField(sb, OmtpConstants.PROTOCOL_VERSION, mProtocolVersion);
+    appendField(sb, OmtpConstants.PROTOCOL_VERSION, protocolVersion);
     sb.append(OmtpConstants.SMS_FIELD_SEPARATOR);
-    appendField(sb, OmtpConstants.CLIENT_TYPE, mClientType);
+    appendField(sb, OmtpConstants.CLIENT_TYPE, clientType);
   }
 
   private void appendApplicationPort(StringBuilder sb) {
     sb.append(OmtpConstants.SMS_FIELD_SEPARATOR);
-    appendField(sb, OmtpConstants.APPLICATION_PORT, mApplicationPort);
+    appendField(sb, OmtpConstants.APPLICATION_PORT, applicationPort);
   }
 
   private void appendClientPrefix(StringBuilder sb) {
     sb.append(OmtpConstants.SMS_FIELD_SEPARATOR);
-    sb.append(mClientPrefix);
+    sb.append(clientPrefix);
   }
 }
diff --git a/java/com/android/voicemail/impl/sms/StatusMessage.java b/java/com/android/voicemail/impl/sms/StatusMessage.java
index a5766a6..7fd2966 100644
--- a/java/com/android/voicemail/impl/sms/StatusMessage.java
+++ b/java/com/android/voicemail/impl/sms/StatusMessage.java
@@ -32,66 +32,66 @@
   // to be useful for initial omtp source implementation.
   // lang, g_len, vs_len, pw_len, pm, gm, vtc, vt
 
-  private final String mProvisioningStatus;
-  private final String mStatusReturnCode;
-  private final String mSubscriptionUrl;
-  private final String mServerAddress;
-  private final String mTuiAccessNumber;
-  private final String mClientSmsDestinationNumber;
-  private final String mImapPort;
-  private final String mImapUserName;
-  private final String mImapPassword;
-  private final String mSmtpPort;
-  private final String mSmtpUserName;
-  private final String mSmtpPassword;
-  private final String mTuiPasswordLength;
+  private final String provisioningStatus;
+  private final String statusReturnCode;
+  private final String subscriptionUrl;
+  private final String serverAddress;
+  private final String tuiAccessNumber;
+  private final String clientSmsDestinationNumber;
+  private final String imapPort;
+  private final String imapUserName;
+  private final String imapPassword;
+  private final String smtpPort;
+  private final String smtpUserName;
+  private final String smtpPassword;
+  private final String tuiPasswordLength;
 
   @Override
   public String toString() {
     return "StatusMessage [mProvisioningStatus="
-        + mProvisioningStatus
+        + provisioningStatus
         + ", mStatusReturnCode="
-        + mStatusReturnCode
+        + statusReturnCode
         + ", mSubscriptionUrl="
-        + mSubscriptionUrl
+        + subscriptionUrl
         + ", mServerAddress="
-        + mServerAddress
+        + serverAddress
         + ", mTuiAccessNumber="
-        + mTuiAccessNumber
+        + tuiAccessNumber
         + ", mClientSmsDestinationNumber="
-        + mClientSmsDestinationNumber
+        + clientSmsDestinationNumber
         + ", mImapPort="
-        + mImapPort
+        + imapPort
         + ", mImapUserName="
-        + mImapUserName
+        + imapUserName
         + ", mImapPassword="
-        + VvmLog.pii(mImapPassword)
+        + VvmLog.pii(imapPassword)
         + ", mSmtpPort="
-        + mSmtpPort
+        + smtpPort
         + ", mSmtpUserName="
-        + mSmtpUserName
+        + smtpUserName
         + ", mSmtpPassword="
-        + VvmLog.pii(mSmtpPassword)
+        + VvmLog.pii(smtpPassword)
         + ", mTuiPasswordLength="
-        + mTuiPasswordLength
+        + tuiPasswordLength
         + "]";
   }
 
   public StatusMessage(Bundle wrappedData) {
-    mProvisioningStatus = unquote(getString(wrappedData, OmtpConstants.PROVISIONING_STATUS));
-    mStatusReturnCode = getString(wrappedData, OmtpConstants.RETURN_CODE);
-    mSubscriptionUrl = getString(wrappedData, OmtpConstants.SUBSCRIPTION_URL);
-    mServerAddress = getString(wrappedData, OmtpConstants.SERVER_ADDRESS);
-    mTuiAccessNumber = getString(wrappedData, OmtpConstants.TUI_ACCESS_NUMBER);
-    mClientSmsDestinationNumber =
+    provisioningStatus = unquote(getString(wrappedData, OmtpConstants.PROVISIONING_STATUS));
+    statusReturnCode = getString(wrappedData, OmtpConstants.RETURN_CODE);
+    subscriptionUrl = getString(wrappedData, OmtpConstants.SUBSCRIPTION_URL);
+    serverAddress = getString(wrappedData, OmtpConstants.SERVER_ADDRESS);
+    tuiAccessNumber = getString(wrappedData, OmtpConstants.TUI_ACCESS_NUMBER);
+    clientSmsDestinationNumber =
         getString(wrappedData, OmtpConstants.CLIENT_SMS_DESTINATION_NUMBER);
-    mImapPort = getString(wrappedData, OmtpConstants.IMAP_PORT);
-    mImapUserName = getString(wrappedData, OmtpConstants.IMAP_USER_NAME);
-    mImapPassword = getString(wrappedData, OmtpConstants.IMAP_PASSWORD);
-    mSmtpPort = getString(wrappedData, OmtpConstants.SMTP_PORT);
-    mSmtpUserName = getString(wrappedData, OmtpConstants.SMTP_USER_NAME);
-    mSmtpPassword = getString(wrappedData, OmtpConstants.SMTP_PASSWORD);
-    mTuiPasswordLength = getString(wrappedData, OmtpConstants.TUI_PASSWORD_LENGTH);
+    imapPort = getString(wrappedData, OmtpConstants.IMAP_PORT);
+    imapUserName = getString(wrappedData, OmtpConstants.IMAP_USER_NAME);
+    imapPassword = getString(wrappedData, OmtpConstants.IMAP_PASSWORD);
+    smtpPort = getString(wrappedData, OmtpConstants.SMTP_PORT);
+    smtpUserName = getString(wrappedData, OmtpConstants.SMTP_USER_NAME);
+    smtpPassword = getString(wrappedData, OmtpConstants.SMTP_PASSWORD);
+    tuiPasswordLength = getString(wrappedData, OmtpConstants.TUI_PASSWORD_LENGTH);
   }
 
   private static String unquote(String string) {
@@ -106,12 +106,12 @@
 
   /** @return the subscriber's VVM provisioning status. */
   public String getProvisioningStatus() {
-    return mProvisioningStatus;
+    return provisioningStatus;
   }
 
   /** @return the return-code of the status SMS. */
   public String getReturnCode() {
-    return mStatusReturnCode;
+    return statusReturnCode;
   }
 
   /**
@@ -120,14 +120,14 @@
    */
   @NeededForTesting
   public String getSubscriptionUrl() {
-    return mSubscriptionUrl;
+    return subscriptionUrl;
   }
 
   /**
    * @return the voicemail server address. Either server IP address or fully qualified domain name.
    */
   public String getServerAddress() {
-    return mServerAddress;
+    return serverAddress;
   }
 
   /**
@@ -135,50 +135,50 @@
    */
   @NeededForTesting
   public String getTuiAccessNumber() {
-    return mTuiAccessNumber;
+    return tuiAccessNumber;
   }
 
   /** @return the number to which client originated SMSes should be sent to. */
   @NeededForTesting
   public String getClientSmsDestinationNumber() {
-    return mClientSmsDestinationNumber;
+    return clientSmsDestinationNumber;
   }
 
   /** @return the IMAP server port to talk to. */
   public String getImapPort() {
-    return mImapPort;
+    return imapPort;
   }
 
   /** @return the IMAP user name to be used for authentication. */
   public String getImapUserName() {
-    return mImapUserName;
+    return imapUserName;
   }
 
   /** @return the IMAP password to be used for authentication. */
   public String getImapPassword() {
-    return mImapPassword;
+    return imapPassword;
   }
 
   /** @return the SMTP server port to talk to. */
   @NeededForTesting
   public String getSmtpPort() {
-    return mSmtpPort;
+    return smtpPort;
   }
 
   /** @return the SMTP user name to be used for SMTP authentication. */
   @NeededForTesting
   public String getSmtpUserName() {
-    return mSmtpUserName;
+    return smtpUserName;
   }
 
   /** @return the SMTP password to be used for SMTP authentication. */
   @NeededForTesting
   public String getSmtpPassword() {
-    return mSmtpPassword;
+    return smtpPassword;
   }
 
   public String getTuiPasswordLength() {
-    return mTuiPasswordLength;
+    return tuiPasswordLength;
   }
 
   private static String getString(Bundle bundle, String key) {
diff --git a/java/com/android/voicemail/impl/sms/StatusSmsFetcher.java b/java/com/android/voicemail/impl/sms/StatusSmsFetcher.java
index d178628..73e0c7f 100644
--- a/java/com/android/voicemail/impl/sms/StatusSmsFetcher.java
+++ b/java/com/android/voicemail/impl/sms/StatusSmsFetcher.java
@@ -58,14 +58,14 @@
       "com.android.voicemailomtp.sms.REQUEST_SENT";
   private static final int ACTION_REQUEST_SENT_REQUEST_CODE = 0;
 
-  private CompletableFuture<Bundle> mFuture = new CompletableFuture<>();
+  private CompletableFuture<Bundle> future = new CompletableFuture<>();
 
-  private final Context mContext;
-  private final PhoneAccountHandle mPhoneAccountHandle;
+  private final Context context;
+  private final PhoneAccountHandle phoneAccountHandle;
 
   public StatusSmsFetcher(Context context, PhoneAccountHandle phoneAccountHandle) {
-    mContext = context;
-    mPhoneAccountHandle = phoneAccountHandle;
+    this.context = context;
+    this.phoneAccountHandle = phoneAccountHandle;
     IntentFilter filter = new IntentFilter(ACTION_REQUEST_SENT_INTENT);
     filter.addAction(OmtpService.ACTION_SMS_RECEIVED);
     context.registerReceiver(this, filter);
@@ -73,7 +73,7 @@
 
   @Override
   public void close() throws IOException {
-    mContext.unregisterReceiver(this);
+    context.unregisterReceiver(this);
   }
 
   @WorkerThread
@@ -81,16 +81,16 @@
   public Bundle get()
       throws InterruptedException, ExecutionException, TimeoutException, CancellationException {
     Assert.isNotMainThread();
-    return mFuture.get(STATUS_SMS_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
+    return future.get(STATUS_SMS_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
   }
 
   public PendingIntent getSentIntent() {
     Intent intent = new Intent(ACTION_REQUEST_SENT_INTENT);
-    intent.setPackage(mContext.getPackageName());
+    intent.setPackage(context.getPackageName());
     // Because the receiver is registered dynamically, implicit intent must be used.
     // There should only be a single status SMS request at a time.
     return PendingIntent.getBroadcast(
-        mContext, ACTION_REQUEST_SENT_REQUEST_CODE, intent, PendingIntent.FLAG_CANCEL_CURRENT);
+        context, ACTION_REQUEST_SENT_REQUEST_CODE, intent, PendingIntent.FLAG_CANCEL_CURRENT);
   }
 
   @Override
@@ -106,19 +106,19 @@
       }
 
       VvmLog.e(TAG, "Request SMS send failed: " + sentSmsResultToString(resultCode));
-      mFuture.cancel(true);
+      future.cancel(true);
       return;
     }
 
     VisualVoicemailSms sms = intent.getExtras().getParcelable(OmtpService.EXTRA_VOICEMAIL_SMS);
 
-    if (!mPhoneAccountHandle.equals(sms.getPhoneAccountHandle())) {
+    if (!phoneAccountHandle.equals(sms.getPhoneAccountHandle())) {
       return;
     }
     String eventType = sms.getPrefix();
 
     if (eventType.equals(OmtpConstants.STATUS_SMS_PREFIX)) {
-      mFuture.complete(sms.getFields());
+      future.complete(sms.getFields());
       return;
     }
 
@@ -129,8 +129,7 @@
     VvmLog.i(
         TAG,
         "VVM SMS with event " + eventType + " received, attempting to translate to STATUS SMS");
-    OmtpVvmCarrierConfigHelper helper =
-        new OmtpVvmCarrierConfigHelper(context, mPhoneAccountHandle);
+    OmtpVvmCarrierConfigHelper helper = new OmtpVvmCarrierConfigHelper(context, phoneAccountHandle);
     VisualVoicemailProtocol protocol = helper.getProtocol();
     if (protocol == null) {
       return;
@@ -139,7 +138,7 @@
 
     if (translatedBundle != null) {
       VvmLog.i(TAG, "Translated to STATUS SMS");
-      mFuture.complete(translatedBundle);
+      future.complete(translatedBundle);
     }
   }
 
diff --git a/java/com/android/voicemail/impl/sms/SyncMessage.java b/java/com/android/voicemail/impl/sms/SyncMessage.java
index 3cfa1a7..de5b3ce 100644
--- a/java/com/android/voicemail/impl/sms/SyncMessage.java
+++ b/java/com/android/voicemail/impl/sms/SyncMessage.java
@@ -31,47 +31,47 @@
  */
 public class SyncMessage {
   // Sync event that triggered this message.
-  private final String mSyncTriggerEvent;
+  private final String syncTriggerEvent;
   // Total number of new messages on the server.
-  private final int mNewMessageCount;
+  private final int newMessageCount;
   // UID of the new message.
-  private final String mMessageId;
+  private final String messageId;
   // Length of the message.
-  private final int mMessageLength;
+  private final int messageLength;
   // Content type (voice, video, fax...) of the new message.
-  private final String mContentType;
+  private final String contentType;
   // Sender of the new message.
-  private final String mSender;
+  private final String sender;
   // Timestamp (in millis) of the new message.
-  private final long mMsgTimeMillis;
+  private final long msgTimeMillis;
 
   @Override
   public String toString() {
     return "SyncMessage [mSyncTriggerEvent="
-        + mSyncTriggerEvent
+        + syncTriggerEvent
         + ", mNewMessageCount="
-        + mNewMessageCount
+        + newMessageCount
         + ", mMessageId="
-        + mMessageId
+        + messageId
         + ", mMessageLength="
-        + mMessageLength
+        + messageLength
         + ", mContentType="
-        + mContentType
+        + contentType
         + ", mSender="
-        + mSender
+        + sender
         + ", mMsgTimeMillis="
-        + mMsgTimeMillis
+        + msgTimeMillis
         + "]";
   }
 
   public SyncMessage(Bundle wrappedData) {
-    mSyncTriggerEvent = getString(wrappedData, OmtpConstants.SYNC_TRIGGER_EVENT);
-    mMessageId = getString(wrappedData, OmtpConstants.MESSAGE_UID);
-    mMessageLength = getInt(wrappedData, OmtpConstants.MESSAGE_LENGTH);
-    mContentType = getString(wrappedData, OmtpConstants.CONTENT_TYPE);
-    mSender = getString(wrappedData, OmtpConstants.SENDER);
-    mNewMessageCount = getInt(wrappedData, OmtpConstants.NUM_MESSAGE_COUNT);
-    mMsgTimeMillis = parseTime(wrappedData.getString(OmtpConstants.TIME));
+    syncTriggerEvent = getString(wrappedData, OmtpConstants.SYNC_TRIGGER_EVENT);
+    messageId = getString(wrappedData, OmtpConstants.MESSAGE_UID);
+    messageLength = getInt(wrappedData, OmtpConstants.MESSAGE_LENGTH);
+    contentType = getString(wrappedData, OmtpConstants.CONTENT_TYPE);
+    sender = getString(wrappedData, OmtpConstants.SENDER);
+    newMessageCount = getInt(wrappedData, OmtpConstants.NUM_MESSAGE_COUNT);
+    msgTimeMillis = parseTime(wrappedData.getString(OmtpConstants.TIME));
   }
 
   private static long parseTime(@Nullable String value) {
@@ -89,13 +89,13 @@
    *     set.
    */
   public String getSyncTriggerEvent() {
-    return mSyncTriggerEvent;
+    return syncTriggerEvent;
   }
 
   /** @return the number of new messages stored on the voicemail server. */
   @NeededForTesting
   public int getNewMessageCount() {
-    return mNewMessageCount;
+    return newMessageCount;
   }
 
   /**
@@ -103,7 +103,7 @@
    *     <p>Expected to be set only for {@link OmtpConstants#NEW_MESSAGE}
    */
   public String getId() {
-    return mMessageId;
+    return messageId;
   }
 
   /**
@@ -112,7 +112,7 @@
    */
   @NeededForTesting
   public String getContentType() {
-    return mContentType;
+    return contentType;
   }
 
   /**
@@ -120,7 +120,7 @@
    *     <p>Expected to be set only for {@link OmtpConstants#NEW_MESSAGE}
    */
   public int getLength() {
-    return mMessageLength;
+    return messageLength;
   }
 
   /**
@@ -128,7 +128,7 @@
    *     <p>Expected to be set only for {@link OmtpConstants#NEW_MESSAGE}
    */
   public String getSender() {
-    return mSender;
+    return sender;
   }
 
   /**
@@ -136,7 +136,7 @@
    *     <p>Expected to be set only for {@link OmtpConstants#NEW_MESSAGE}
    */
   public long getTimestampMillis() {
-    return mMsgTimeMillis;
+    return msgTimeMillis;
   }
 
   private static int getInt(Bundle wrappedData, String key) {
diff --git a/java/com/android/voicemail/impl/sync/OmtpVvmSyncService.java b/java/com/android/voicemail/impl/sync/OmtpVvmSyncService.java
index f7c8f29..cf2763b 100644
--- a/java/com/android/voicemail/impl/sync/OmtpVvmSyncService.java
+++ b/java/com/android/voicemail/impl/sync/OmtpVvmSyncService.java
@@ -56,12 +56,12 @@
   /** Threshold for whether we should archive and delete voicemails from the remote VM server. */
   private static final float AUTO_DELETE_ARCHIVE_VM_THRESHOLD = 0.75f;
 
-  private final Context mContext;
-  private final VoicemailsQueryHelper mQueryHelper;
+  private final Context context;
+  private final VoicemailsQueryHelper queryHelper;
 
   public OmtpVvmSyncService(Context context) {
-    mContext = context;
-    mQueryHelper = new VoicemailsQueryHelper(mContext);
+    this.context = context;
+    queryHelper = new VoicemailsQueryHelper(this.context);
   }
 
   public void sync(
@@ -79,22 +79,22 @@
       PhoneAccountHandle phoneAccount,
       Voicemail voicemail,
       VoicemailStatus.Editor status) {
-    if (!VisualVoicemailSettingsUtil.isEnabled(mContext, phoneAccount)) {
+    if (!VisualVoicemailSettingsUtil.isEnabled(context, phoneAccount)) {
       VvmLog.e(TAG, "Sync requested for disabled account");
       return;
     }
-    if (!VvmAccountManager.isAccountActivated(mContext, phoneAccount)) {
-      ActivationTask.start(mContext, phoneAccount, null);
+    if (!VvmAccountManager.isAccountActivated(context, phoneAccount)) {
+      ActivationTask.start(context, phoneAccount, null);
       return;
     }
 
-    OmtpVvmCarrierConfigHelper config = new OmtpVvmCarrierConfigHelper(mContext, phoneAccount);
-    LoggerUtils.logImpressionOnMainThread(mContext, DialerImpression.Type.VVM_SYNC_STARTED);
+    OmtpVvmCarrierConfigHelper config = new OmtpVvmCarrierConfigHelper(context, phoneAccount);
+    LoggerUtils.logImpressionOnMainThread(context, DialerImpression.Type.VVM_SYNC_STARTED);
     // DATA_IMAP_OPERATION_STARTED posting should not be deferred. This event clears all data
     // channel errors, which should happen when the task starts, not when it ends. It is the
     // "Sync in progress..." status, which is currently displayed to the user as no error.
     config.handleEvent(
-        VoicemailStatus.edit(mContext, phoneAccount), OmtpEvents.DATA_IMAP_OPERATION_STARTED);
+        VoicemailStatus.edit(context, phoneAccount), OmtpEvents.DATA_IMAP_OPERATION_STARTED);
     try (NetworkWrapper network = VvmNetworkRequest.getNetwork(config, phoneAccount, status)) {
       if (network == null) {
         VvmLog.e(TAG, "unable to acquire network");
@@ -114,7 +114,7 @@
       PhoneAccountHandle phoneAccount,
       Voicemail voicemail,
       VoicemailStatus.Editor status) {
-    try (ImapHelper imapHelper = new ImapHelper(mContext, phoneAccount, network, status)) {
+    try (ImapHelper imapHelper = new ImapHelper(context, phoneAccount, network, status)) {
       boolean success;
       if (voicemail == null) {
         success = syncAll(imapHelper, phoneAccount);
@@ -126,7 +126,7 @@
         imapHelper.updateQuota();
         autoDeleteAndArchiveVM(imapHelper, phoneAccount);
         imapHelper.handleEvent(OmtpEvents.DATA_IMAP_OPERATION_COMPLETED);
-        LoggerUtils.logImpressionOnMainThread(mContext, DialerImpression.Type.VVM_SYNC_COMPLETED);
+        LoggerUtils.logImpressionOnMainThread(context, DialerImpression.Type.VVM_SYNC_COMPLETED);
       } else {
         task.fail();
       }
@@ -142,16 +142,16 @@
    */
   private void autoDeleteAndArchiveVM(
       ImapHelper imapHelper, PhoneAccountHandle phoneAccountHandle) {
-    if (!isArchiveAllowedAndEnabled(mContext, phoneAccountHandle)) {
+    if (!isArchiveAllowedAndEnabled(context, phoneAccountHandle)) {
       VvmLog.i(TAG, "autoDeleteAndArchiveVM is turned off");
       LoggerUtils.logImpressionOnMainThread(
-          mContext, DialerImpression.Type.VVM_ARCHIVE_AUTO_DELETE_TURNED_OFF);
+          context, DialerImpression.Type.VVM_ARCHIVE_AUTO_DELETE_TURNED_OFF);
       return;
     }
     Quota quotaOnServer = imapHelper.getQuota();
     if (quotaOnServer == null) {
       LoggerUtils.logImpressionOnMainThread(
-          mContext, DialerImpression.Type.VVM_ARCHIVE_AUTO_DELETE_FAILED_DUE_TO_FAILED_QUOTA_CHECK);
+          context, DialerImpression.Type.VVM_ARCHIVE_AUTO_DELETE_FAILED_DUE_TO_FAILED_QUOTA_CHECK);
       VvmLog.e(TAG, "autoDeleteAndArchiveVM failed - Can't retrieve Imap quota.");
       return;
     }
@@ -161,7 +161,7 @@
       deleteAndArchiveVM(imapHelper, quotaOnServer);
       imapHelper.updateQuota();
       LoggerUtils.logImpressionOnMainThread(
-          mContext, DialerImpression.Type.VVM_ARCHIVE_AUTO_DELETED_VM_FROM_SERVER);
+          context, DialerImpression.Type.VVM_ARCHIVE_AUTO_DELETED_VM_FROM_SERVER);
     } else {
       VvmLog.i(TAG, "no need to archive and auto delete VM, quota below threshold");
     }
@@ -194,10 +194,10 @@
     // The number of voicemails that exceed our threshold and should be deleted from the server
     int numVoicemails =
         quotaOnServer.occupied - (int) (AUTO_DELETE_ARCHIVE_VM_THRESHOLD * quotaOnServer.total);
-    List<Voicemail> oldestVoicemails = mQueryHelper.oldestVoicemailsOnServer(numVoicemails);
+    List<Voicemail> oldestVoicemails = queryHelper.oldestVoicemailsOnServer(numVoicemails);
     VvmLog.w(TAG, "number of voicemails to delete " + numVoicemails);
     if (!oldestVoicemails.isEmpty()) {
-      mQueryHelper.markArchivedInDatabase(oldestVoicemails);
+      queryHelper.markArchivedInDatabase(oldestVoicemails);
       imapHelper.markMessagesAsDeleted(oldestVoicemails);
       VvmLog.i(
           TAG,
@@ -211,8 +211,8 @@
   private boolean syncAll(ImapHelper imapHelper, PhoneAccountHandle account) {
 
     List<Voicemail> serverVoicemails = imapHelper.fetchAllVoicemails();
-    List<Voicemail> localVoicemails = mQueryHelper.getAllVoicemails(account);
-    List<Voicemail> deletedVoicemails = mQueryHelper.getDeletedVoicemails(account);
+    List<Voicemail> localVoicemails = queryHelper.getAllVoicemails(account);
+    List<Voicemail> deletedVoicemails = queryHelper.getDeletedVoicemails(account);
     boolean succeeded = true;
 
     if (localVoicemails == null || serverVoicemails == null) {
@@ -225,7 +225,7 @@
       if (imapHelper.markMessagesAsDeleted(deletedVoicemails)) {
         // Delete only the voicemails that was deleted on the server, in case more are deleted
         // since the IMAP query was completed.
-        mQueryHelper.deleteFromDatabase(deletedVoicemails);
+        queryHelper.deleteFromDatabase(deletedVoicemails);
       } else {
         succeeded = false;
       }
@@ -249,10 +249,10 @@
 
       // Do not delete voicemails that are archived marked as archived.
       if (remoteVoicemail == null) {
-        mQueryHelper.deleteNonArchivedFromDatabase(localVoicemail);
+        queryHelper.deleteNonArchivedFromDatabase(localVoicemail);
       } else {
         if (remoteVoicemail.isRead() && !localVoicemail.isRead()) {
-          mQueryHelper.markReadInDatabase(localVoicemail);
+          queryHelper.markReadInDatabase(localVoicemail);
         } else if (localVoicemail.isRead() && !remoteVoicemail.isRead()) {
           localReadVoicemails.add(localVoicemail);
         }
@@ -260,8 +260,8 @@
         if (!TextUtils.isEmpty(remoteVoicemail.getTranscription())
             && TextUtils.isEmpty(localVoicemail.getTranscription())) {
           LoggerUtils.logImpressionOnMainThread(
-              mContext, DialerImpression.Type.VVM_TRANSCRIPTION_DOWNLOADED);
-          mQueryHelper.updateWithTranscription(localVoicemail, remoteVoicemail.getTranscription());
+              context, DialerImpression.Type.VVM_TRANSCRIPTION_DOWNLOADED);
+          queryHelper.updateWithTranscription(localVoicemail, remoteVoicemail.getTranscription());
         }
       }
     }
@@ -270,7 +270,7 @@
       VvmLog.i(TAG, "Marking voicemails as read");
       if (imapHelper.markMessagesAsRead(localReadVoicemails)) {
         VvmLog.i(TAG, "Marking voicemails as clean");
-        mQueryHelper.markCleanInDatabase(localReadVoicemails);
+        queryHelper.markCleanInDatabase(localReadVoicemails);
       } else {
         return false;
       }
@@ -281,12 +281,12 @@
     for (Voicemail remoteVoicemail : remoteMap.values()) {
       if (!TextUtils.isEmpty(remoteVoicemail.getTranscription())) {
         LoggerUtils.logImpressionOnMainThread(
-            mContext, DialerImpression.Type.VVM_TRANSCRIPTION_DOWNLOADED);
+            context, DialerImpression.Type.VVM_TRANSCRIPTION_DOWNLOADED);
       }
-      Uri uri = VoicemailDatabaseUtil.insert(mContext, remoteVoicemail);
+      Uri uri = VoicemailDatabaseUtil.insert(context, remoteVoicemail);
       if (prefetchEnabled) {
         VoicemailFetchedCallback fetchedCallback =
-            new VoicemailFetchedCallback(mContext, uri, account);
+            new VoicemailFetchedCallback(context, uri, account);
         imapHelper.fetchVoicemailPayload(fetchedCallback, remoteVoicemail.getSourceData());
       }
     }
@@ -298,17 +298,17 @@
       ImapHelper imapHelper, Voicemail voicemail, PhoneAccountHandle account) {
     if (shouldPerformPrefetch(account, imapHelper)) {
       VoicemailFetchedCallback callback =
-          new VoicemailFetchedCallback(mContext, voicemail.getUri(), account);
+          new VoicemailFetchedCallback(context, voicemail.getUri(), account);
       imapHelper.fetchVoicemailPayload(callback, voicemail.getSourceData());
     }
 
     return imapHelper.fetchTranscription(
-        new TranscriptionFetchedCallback(mContext, voicemail), voicemail.getSourceData());
+        new TranscriptionFetchedCallback(context, voicemail), voicemail.getSourceData());
   }
 
   private boolean shouldPerformPrefetch(PhoneAccountHandle account, ImapHelper imapHelper) {
     OmtpVvmCarrierConfigHelper carrierConfigHelper =
-        new OmtpVvmCarrierConfigHelper(mContext, account);
+        new OmtpVvmCarrierConfigHelper(context, account);
     return carrierConfigHelper.isPrefetchEnabled() && !imapHelper.isRoaming();
   }
 
@@ -324,17 +324,17 @@
   /** Callback for {@link ImapHelper#fetchTranscription(TranscriptionFetchedCallback, String)} */
   public static class TranscriptionFetchedCallback {
 
-    private Context mContext;
-    private Voicemail mVoicemail;
+    private Context context;
+    private Voicemail voicemail;
 
     public TranscriptionFetchedCallback(Context context, Voicemail voicemail) {
-      mContext = context;
-      mVoicemail = voicemail;
+      this.context = context;
+      this.voicemail = voicemail;
     }
 
     public void setVoicemailTranscription(String transcription) {
-      VoicemailsQueryHelper queryHelper = new VoicemailsQueryHelper(mContext);
-      queryHelper.updateWithTranscription(mVoicemail, transcription);
+      VoicemailsQueryHelper queryHelper = new VoicemailsQueryHelper(context);
+      queryHelper.updateWithTranscription(voicemail, transcription);
     }
   }
 }
diff --git a/java/com/android/voicemail/impl/sync/SyncOneTask.java b/java/com/android/voicemail/impl/sync/SyncOneTask.java
index 70c6bd8..2f0b23f 100644
--- a/java/com/android/voicemail/impl/sync/SyncOneTask.java
+++ b/java/com/android/voicemail/impl/sync/SyncOneTask.java
@@ -41,8 +41,8 @@
   private static final String EXTRA_PHONE_ACCOUNT_HANDLE = "extra_phone_account_handle";
   private static final String EXTRA_VOICEMAIL = "extra_voicemail";
 
-  private PhoneAccountHandle mPhone;
-  private Voicemail mVoicemail;
+  private PhoneAccountHandle phone;
+  private Voicemail voicemail;
 
   public static void start(Context context, PhoneAccountHandle phone, Voicemail voicemail) {
     Intent intent = BaseTask.createIntent(context, SyncOneTask.class, phone);
@@ -59,22 +59,22 @@
   @Override
   public void onCreate(Context context, Bundle extras) {
     super.onCreate(context, extras);
-    mPhone = extras.getParcelable(EXTRA_PHONE_ACCOUNT_HANDLE);
-    mVoicemail = extras.getParcelable(EXTRA_VOICEMAIL);
+    phone = extras.getParcelable(EXTRA_PHONE_ACCOUNT_HANDLE);
+    voicemail = extras.getParcelable(EXTRA_VOICEMAIL);
   }
 
   @Override
   public void onExecuteInBackgroundThread() {
     OmtpVvmSyncService service = new OmtpVvmSyncService(getContext());
-    service.sync(this, mPhone, mVoicemail, VoicemailStatus.edit(getContext(), mPhone));
+    service.sync(this, phone, voicemail, VoicemailStatus.edit(getContext(), phone));
   }
 
   @Override
   public Intent createRestartIntent() {
     LoggerUtils.logImpressionOnMainThread(getContext(), DialerImpression.Type.VVM_AUTO_RETRY_SYNC);
     Intent intent = super.createRestartIntent();
-    intent.putExtra(EXTRA_PHONE_ACCOUNT_HANDLE, mPhone);
-    intent.putExtra(EXTRA_VOICEMAIL, mVoicemail);
+    intent.putExtra(EXTRA_PHONE_ACCOUNT_HANDLE, phone);
+    intent.putExtra(EXTRA_VOICEMAIL, voicemail);
     return intent;
   }
 }
diff --git a/java/com/android/voicemail/impl/sync/SyncTask.java b/java/com/android/voicemail/impl/sync/SyncTask.java
index 68ce012..06a5e9e 100644
--- a/java/com/android/voicemail/impl/sync/SyncTask.java
+++ b/java/com/android/voicemail/impl/sync/SyncTask.java
@@ -38,9 +38,9 @@
 
   private static final String EXTRA_PHONE_ACCOUNT_HANDLE = "extra_phone_account_handle";
 
-  private final RetryPolicy mRetryPolicy;
+  private final RetryPolicy retryPolicy;
 
-  private PhoneAccountHandle mPhone;
+  private PhoneAccountHandle phone;
 
   public static void start(Context context, PhoneAccountHandle phone) {
     Intent intent = BaseTask.createIntent(context, SyncTask.class, phone);
@@ -50,28 +50,28 @@
 
   public SyncTask() {
     super(TASK_SYNC);
-    mRetryPolicy = new RetryPolicy(RETRY_TIMES, RETRY_INTERVAL_MILLIS);
-    addPolicy(mRetryPolicy);
+    retryPolicy = new RetryPolicy(RETRY_TIMES, RETRY_INTERVAL_MILLIS);
+    addPolicy(retryPolicy);
     addPolicy(new MinimalIntervalPolicy(MINIMAL_INTERVAL_MILLIS));
   }
 
   @Override
   public void onCreate(Context context, Bundle extras) {
     super.onCreate(context, extras);
-    mPhone = extras.getParcelable(EXTRA_PHONE_ACCOUNT_HANDLE);
+    phone = extras.getParcelable(EXTRA_PHONE_ACCOUNT_HANDLE);
   }
 
   @Override
   public void onExecuteInBackgroundThread() {
     OmtpVvmSyncService service = new OmtpVvmSyncService(getContext());
-    service.sync(this, mPhone, null, mRetryPolicy.getVoicemailStatusEditor());
+    service.sync(this, phone, null, retryPolicy.getVoicemailStatusEditor());
   }
 
   @Override
   public Intent createRestartIntent() {
     LoggerUtils.logImpressionOnMainThread(getContext(), DialerImpression.Type.VVM_AUTO_RETRY_SYNC);
     Intent intent = super.createRestartIntent();
-    intent.putExtra(EXTRA_PHONE_ACCOUNT_HANDLE, mPhone);
+    intent.putExtra(EXTRA_PHONE_ACCOUNT_HANDLE, phone);
     return intent;
   }
 }
diff --git a/java/com/android/voicemail/impl/sync/VoicemailStatusQueryHelper.java b/java/com/android/voicemail/impl/sync/VoicemailStatusQueryHelper.java
index 4ef19da..259d79b 100644
--- a/java/com/android/voicemail/impl/sync/VoicemailStatusQueryHelper.java
+++ b/java/com/android/voicemail/impl/sync/VoicemailStatusQueryHelper.java
@@ -39,14 +39,14 @@
   public static final int NOTIFICATION_CHANNEL_STATE = 2;
   public static final int SOURCE_PACKAGE = 3;
 
-  private Context mContext;
-  private ContentResolver mContentResolver;
-  private Uri mSourceUri;
+  private Context context;
+  private ContentResolver contentResolver;
+  private Uri sourceUri;
 
   public VoicemailStatusQueryHelper(Context context) {
-    mContext = context;
-    mContentResolver = context.getContentResolver();
-    mSourceUri = VoicemailContract.Status.buildSourceUri(mContext.getPackageName());
+    this.context = context;
+    contentResolver = context.getContentResolver();
+    sourceUri = VoicemailContract.Status.buildSourceUri(this.context.getPackageName());
   }
 
   /**
@@ -97,8 +97,8 @@
                 + "=? AND "
                 + Status.SOURCE_PACKAGE
                 + "=?";
-        String[] whereArgs = {phoneAccountComponentName, phoneAccountId, mContext.getPackageName()};
-        cursor = mContentResolver.query(mSourceUri, PROJECTION, whereClause, whereArgs, null);
+        String[] whereArgs = {phoneAccountComponentName, phoneAccountId, context.getPackageName()};
+        cursor = contentResolver.query(sourceUri, PROJECTION, whereClause, whereArgs, null);
         if (cursor != null && cursor.moveToFirst()) {
           return cursor.getInt(columnIndex) == value;
         }
diff --git a/java/com/android/voicemail/impl/sync/VoicemailsQueryHelper.java b/java/com/android/voicemail/impl/sync/VoicemailsQueryHelper.java
index 1af5e68..c47b40d 100644
--- a/java/com/android/voicemail/impl/sync/VoicemailsQueryHelper.java
+++ b/java/com/android/voicemail/impl/sync/VoicemailsQueryHelper.java
@@ -52,14 +52,14 @@
   static final String DELETED_SELECTION = Voicemails.DELETED + "=1";
   static final String ARCHIVED_SELECTION = Voicemails.ARCHIVED + "=0";
 
-  private Context mContext;
-  private ContentResolver mContentResolver;
-  private Uri mSourceUri;
+  private Context context;
+  private ContentResolver contentResolver;
+  private Uri sourceUri;
 
   public VoicemailsQueryHelper(Context context) {
-    mContext = context;
-    mContentResolver = context.getContentResolver();
-    mSourceUri = VoicemailContract.Voicemails.buildSourceUri(mContext.getPackageName());
+    this.context = context;
+    contentResolver = context.getContentResolver();
+    sourceUri = VoicemailContract.Voicemails.buildSourceUri(this.context.getPackageName());
   }
 
   /**
@@ -90,7 +90,7 @@
    */
   private List<Voicemail> getLocalVoicemails(
       @NonNull PhoneAccountHandle unusedPhoneAccountHandle, String selection) {
-    Cursor cursor = mContentResolver.query(mSourceUri, PROJECTION, selection, null, null);
+    Cursor cursor = contentResolver.query(sourceUri, PROJECTION, selection, null, null);
     if (cursor == null) {
       return null;
     }
@@ -135,12 +135,12 @@
     }
 
     String selectionStatement = String.format(Voicemails._ID + " IN (%s)", sb.toString());
-    return mContentResolver.delete(Voicemails.CONTENT_URI, selectionStatement, null);
+    return contentResolver.delete(Voicemails.CONTENT_URI, selectionStatement, null);
   }
 
   /** Utility method to delete a single voicemail that is not archived. */
   public void deleteNonArchivedFromDatabase(Voicemail voicemail) {
-    mContentResolver.delete(
+    contentResolver.delete(
         Voicemails.CONTENT_URI,
         Voicemails._ID + "=? AND " + Voicemails.ARCHIVED + "= 0",
         new String[] {Long.toString(voicemail.getId())});
@@ -156,10 +156,10 @@
 
   /** Utility method to mark single message as read. */
   public void markReadInDatabase(Voicemail voicemail) {
-    Uri uri = ContentUris.withAppendedId(mSourceUri, voicemail.getId());
+    Uri uri = ContentUris.withAppendedId(sourceUri, voicemail.getId());
     ContentValues contentValues = new ContentValues();
     contentValues.put(Voicemails.IS_READ, "1");
-    mContentResolver.update(uri, contentValues, null, null);
+    contentResolver.update(uri, contentValues, null, null);
   }
 
   /**
@@ -181,17 +181,17 @@
 
   /** Utility method to mark single message as clean. */
   public void markCleanInDatabase(Voicemail voicemail) {
-    Uri uri = ContentUris.withAppendedId(mSourceUri, voicemail.getId());
+    Uri uri = ContentUris.withAppendedId(sourceUri, voicemail.getId());
     ContentValues contentValues = new ContentValues();
-    mContentResolver.update(uri, contentValues, null, null);
+    contentResolver.update(uri, contentValues, null, null);
   }
 
   /** Utility method to add a transcription to the voicemail. */
   public void updateWithTranscription(Voicemail voicemail, String transcription) {
-    Uri uri = ContentUris.withAppendedId(mSourceUri, voicemail.getId());
+    Uri uri = ContentUris.withAppendedId(sourceUri, voicemail.getId());
     ContentValues contentValues = new ContentValues();
     contentValues.put(Voicemails.TRANSCRIPTION, transcription);
-    mContentResolver.update(uri, contentValues, null, null);
+    contentResolver.update(uri, contentValues, null, null);
   }
 
   /**
@@ -221,7 +221,7 @@
                 + Voicemails.SOURCE_DATA
                 + "=?";
         String[] whereArgs = {phoneAccountComponentName, phoneAccountId, sourceData};
-        cursor = mContentResolver.query(mSourceUri, PROJECTION, whereClause, whereArgs, null);
+        cursor = contentResolver.query(sourceUri, PROJECTION, whereClause, whereArgs, null);
         if (cursor.getCount() == 0) {
           return true;
         } else {
@@ -249,10 +249,10 @@
 
   /** Utility method to mark single voicemail as archived. */
   public void markArchiveInDatabase(Voicemail voicemail) {
-    Uri uri = ContentUris.withAppendedId(mSourceUri, voicemail.getId());
+    Uri uri = ContentUris.withAppendedId(sourceUri, voicemail.getId());
     ContentValues contentValues = new ContentValues();
     contentValues.put(Voicemails.ARCHIVED, "1");
-    mContentResolver.update(uri, contentValues, null, null);
+    contentResolver.update(uri, contentValues, null, null);
   }
 
   /** Find the oldest voicemails that are on the device, and also on the server. */
@@ -265,7 +265,7 @@
     String sortAndLimit = "date ASC limit " + numVoicemails;
 
     try (Cursor cursor =
-        mContentResolver.query(mSourceUri, PROJECTION, ARCHIVED_SELECTION, null, sortAndLimit)) {
+        contentResolver.query(sourceUri, PROJECTION, ARCHIVED_SELECTION, null, sortAndLimit)) {
 
       Assert.isNotNull(cursor);
 
diff --git a/java/com/android/voicemail/impl/sync/VvmNetworkRequest.java b/java/com/android/voicemail/impl/sync/VvmNetworkRequest.java
index 189dc8f..e751736 100644
--- a/java/com/android/voicemail/impl/sync/VvmNetworkRequest.java
+++ b/java/com/android/voicemail/impl/sync/VvmNetworkRequest.java
@@ -45,21 +45,21 @@
    */
   public static class NetworkWrapper implements Closeable {
 
-    private final Network mNetwork;
-    private final VvmNetworkRequestCallback mCallback;
+    private final Network network;
+    private final VvmNetworkRequestCallback callback;
 
     private NetworkWrapper(Network network, VvmNetworkRequestCallback callback) {
-      mNetwork = network;
-      mCallback = callback;
+      this.network = network;
+      this.callback = callback;
     }
 
     public Network get() {
-      return mNetwork;
+      return network;
     }
 
     @Override
     public void close() {
-      mCallback.releaseNetwork();
+      callback.releaseNetwork();
     }
   }
 
@@ -92,7 +92,7 @@
      * {@link CompletableFuture#get()} will block until {@link CompletableFuture# complete(Object) }
      * has been called on the other thread.
      */
-    private final CompletableFuture<NetworkWrapper> mFuture = new CompletableFuture<>();
+    private final CompletableFuture<NetworkWrapper> future = new CompletableFuture<>();
 
     public FutureNetworkRequestCallback(
         OmtpVvmCarrierConfigHelper config,
@@ -102,19 +102,19 @@
     }
 
     public Future<NetworkWrapper> getFuture() {
-      return mFuture;
+      return future;
     }
 
     @Override
     public void onAvailable(Network network) {
       super.onAvailable(network);
-      mFuture.complete(new NetworkWrapper(network, this));
+      future.complete(new NetworkWrapper(network, this));
     }
 
     @Override
     public void onFailed(String reason) {
       super.onFailed(reason);
-      mFuture.complete(null);
+      future.complete(null);
     }
   }
 }
diff --git a/java/com/android/voicemail/impl/sync/VvmNetworkRequestCallback.java b/java/com/android/voicemail/impl/sync/VvmNetworkRequestCallback.java
index 17f5c16..60ba166 100644
--- a/java/com/android/voicemail/impl/sync/VvmNetworkRequestCallback.java
+++ b/java/com/android/voicemail/impl/sync/VvmNetworkRequestCallback.java
@@ -48,37 +48,37 @@
   public static final String NETWORK_REQUEST_FAILED_TIMEOUT = "timeout";
   public static final String NETWORK_REQUEST_FAILED_LOST = "lost";
 
-  protected Context mContext;
-  protected PhoneAccountHandle mPhoneAccount;
-  protected NetworkRequest mNetworkRequest;
-  private ConnectivityManager mConnectivityManager;
-  private final OmtpVvmCarrierConfigHelper mCarrierConfigHelper;
-  private final VoicemailStatus.Editor mStatus;
-  private boolean mRequestSent = false;
-  private boolean mResultReceived = false;
+  protected Context context;
+  protected PhoneAccountHandle phoneAccount;
+  protected NetworkRequest networkRequest;
+  private ConnectivityManager connectivityManager;
+  private final OmtpVvmCarrierConfigHelper carrierConfigHelper;
+  private final VoicemailStatus.Editor status;
+  private boolean requestSent = false;
+  private boolean resultReceived = false;
 
   public VvmNetworkRequestCallback(
       Context context, PhoneAccountHandle phoneAccount, VoicemailStatus.Editor status) {
-    mContext = context;
-    mPhoneAccount = phoneAccount;
-    mStatus = status;
-    mCarrierConfigHelper = new OmtpVvmCarrierConfigHelper(context, mPhoneAccount);
-    mNetworkRequest = createNetworkRequest();
+    this.context = context;
+    this.phoneAccount = phoneAccount;
+    this.status = status;
+    carrierConfigHelper = new OmtpVvmCarrierConfigHelper(context, this.phoneAccount);
+    networkRequest = createNetworkRequest();
   }
 
   public VvmNetworkRequestCallback(
       OmtpVvmCarrierConfigHelper config,
       PhoneAccountHandle phoneAccount,
       VoicemailStatus.Editor status) {
-    mContext = config.getContext();
-    mPhoneAccount = phoneAccount;
-    mStatus = status;
-    mCarrierConfigHelper = config;
-    mNetworkRequest = createNetworkRequest();
+    context = config.getContext();
+    this.phoneAccount = phoneAccount;
+    this.status = status;
+    carrierConfigHelper = config;
+    networkRequest = createNetworkRequest();
   }
 
   public VoicemailStatus.Editor getVoicemailStatusEditor() {
-    return mStatus;
+    return status;
   }
 
   /**
@@ -91,12 +91,10 @@
         new NetworkRequest.Builder().addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
 
     TelephonyManager telephonyManager =
-        mContext
-            .getSystemService(TelephonyManager.class)
-            .createForPhoneAccountHandle(mPhoneAccount);
+        context.getSystemService(TelephonyManager.class).createForPhoneAccountHandle(phoneAccount);
     // At this point mPhoneAccount should always be valid and telephonyManager will never be null
     Assert.isNotNull(telephonyManager);
-    if (mCarrierConfigHelper.isCellularDataRequired()) {
+    if (carrierConfigHelper.isCellularDataRequired()) {
       VvmLog.d(TAG, "Transport type: CELLULAR");
       builder
           .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
@@ -108,14 +106,14 @@
   }
 
   public NetworkRequest getNetworkRequest() {
-    return mNetworkRequest;
+    return networkRequest;
   }
 
   @Override
   @CallSuper
   public void onLost(Network network) {
     VvmLog.d(TAG, "onLost");
-    mResultReceived = true;
+    resultReceived = true;
     onFailed(NETWORK_REQUEST_FAILED_LOST);
   }
 
@@ -123,22 +121,22 @@
   @CallSuper
   public void onAvailable(Network network) {
     super.onAvailable(network);
-    mResultReceived = true;
+    resultReceived = true;
   }
 
   @CallSuper
   public void onUnavailable() {
     // TODO(twyen): a bug this is hidden, do we really need this?
-    mResultReceived = true;
+    resultReceived = true;
     onFailed(NETWORK_REQUEST_FAILED_TIMEOUT);
   }
 
   public void requestNetwork() {
-    if (mRequestSent == true) {
+    if (requestSent == true) {
       VvmLog.e(TAG, "requestNetwork() called twice");
       return;
     }
-    mRequestSent = true;
+    requestSent = true;
     getConnectivityManager().requestNetwork(getNetworkRequest(), this);
     /**
      * Somehow requestNetwork() with timeout doesn't work, and it's a hidden method. Implement our
@@ -149,7 +147,7 @@
         new Runnable() {
           @Override
           public void run() {
-            if (mResultReceived == false) {
+            if (resultReceived == false) {
               onFailed(NETWORK_REQUEST_FAILED_TIMEOUT);
             }
           }
@@ -163,20 +161,20 @@
   }
 
   public ConnectivityManager getConnectivityManager() {
-    if (mConnectivityManager == null) {
-      mConnectivityManager =
-          (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
+    if (connectivityManager == null) {
+      connectivityManager =
+          (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
     }
-    return mConnectivityManager;
+    return connectivityManager;
   }
 
   @CallSuper
   public void onFailed(String reason) {
     VvmLog.d(TAG, "onFailed: " + reason);
-    if (mCarrierConfigHelper.isCellularDataRequired()) {
-      mCarrierConfigHelper.handleEvent(mStatus, OmtpEvents.DATA_NO_CONNECTION_CELLULAR_REQUIRED);
+    if (carrierConfigHelper.isCellularDataRequired()) {
+      carrierConfigHelper.handleEvent(status, OmtpEvents.DATA_NO_CONNECTION_CELLULAR_REQUIRED);
     } else {
-      mCarrierConfigHelper.handleEvent(mStatus, OmtpEvents.DATA_NO_CONNECTION);
+      carrierConfigHelper.handleEvent(status, OmtpEvents.DATA_NO_CONNECTION);
     }
     releaseNetwork();
   }
diff --git a/java/com/android/voicemail/impl/utils/IndentingPrintWriter.java b/java/com/android/voicemail/impl/utils/IndentingPrintWriter.java
index bbc1d66..b72aece 100644
--- a/java/com/android/voicemail/impl/utils/IndentingPrintWriter.java
+++ b/java/com/android/voicemail/impl/utils/IndentingPrintWriter.java
@@ -29,23 +29,23 @@
  */
 public class IndentingPrintWriter extends PrintWriter {
 
-  private final String mSingleIndent;
-  private final int mWrapLength;
+  private final String singleIndent;
+  private final int wrapLength;
 
   /** Mutable version of current indent */
-  private StringBuilder mIndentBuilder = new StringBuilder();
-  /** Cache of current {@link #mIndentBuilder} value */
-  private char[] mCurrentIndent;
+  private StringBuilder indentBuilder = new StringBuilder();
+  /** Cache of current {@link #indentBuilder} value */
+  private char[] currentIndent;
   /** Length of current line being built, excluding any indent */
-  private int mCurrentLength;
+  private int currentLength;
 
   /**
    * Flag indicating if we're currently sitting on an empty line, and that next write should be
    * prefixed with the current indent.
    */
-  private boolean mEmptyLine = true;
+  private boolean emptyLine = true;
 
-  private char[] mSingleChar = new char[1];
+  private char[] singleChar = new char[1];
 
   public IndentingPrintWriter(Writer writer, String singleIndent) {
     this(writer, singleIndent, -1);
@@ -53,18 +53,18 @@
 
   public IndentingPrintWriter(Writer writer, String singleIndent, int wrapLength) {
     super(writer);
-    mSingleIndent = singleIndent;
-    mWrapLength = wrapLength;
+    this.singleIndent = singleIndent;
+    this.wrapLength = wrapLength;
   }
 
   public void increaseIndent() {
-    mIndentBuilder.append(mSingleIndent);
-    mCurrentIndent = null;
+    indentBuilder.append(singleIndent);
+    currentIndent = null;
   }
 
   public void decreaseIndent() {
-    mIndentBuilder.delete(0, mSingleIndent.length());
-    mCurrentIndent = null;
+    indentBuilder.delete(0, singleIndent.length());
+    currentIndent = null;
   }
 
   public void printPair(String key, Object value) {
@@ -86,8 +86,8 @@
 
   @Override
   public void write(int c) {
-    mSingleChar[0] = (char) c;
-    write(mSingleChar, 0, 1);
+    singleChar[0] = (char) c;
+    write(singleChar, 0, 1);
   }
 
   @Override
@@ -99,7 +99,7 @@
 
   @Override
   public void write(char[] buf, int offset, int count) {
-    final int indentLength = mIndentBuilder.length();
+    final int indentLength = indentBuilder.length();
     final int bufferEnd = offset + count;
     int lineStart = offset;
     int lineEnd = offset;
@@ -107,30 +107,30 @@
     // March through incoming buffer looking for newlines
     while (lineEnd < bufferEnd) {
       char ch = buf[lineEnd++];
-      mCurrentLength++;
+      currentLength++;
       if (ch == '\n') {
         maybeWriteIndent();
         super.write(buf, lineStart, lineEnd - lineStart);
         lineStart = lineEnd;
-        mEmptyLine = true;
-        mCurrentLength = 0;
+        emptyLine = true;
+        currentLength = 0;
       }
 
       // Wrap if we've pushed beyond line length
-      if (mWrapLength > 0 && mCurrentLength >= mWrapLength - indentLength) {
-        if (!mEmptyLine) {
+      if (wrapLength > 0 && currentLength >= wrapLength - indentLength) {
+        if (!emptyLine) {
           // Give ourselves a fresh line to work with
           super.write('\n');
-          mEmptyLine = true;
-          mCurrentLength = lineEnd - lineStart;
+          emptyLine = true;
+          currentLength = lineEnd - lineStart;
         } else {
           // We need more than a dedicated line, slice it hard
           maybeWriteIndent();
           super.write(buf, lineStart, lineEnd - lineStart);
           super.write('\n');
-          mEmptyLine = true;
+          emptyLine = true;
           lineStart = lineEnd;
-          mCurrentLength = 0;
+          currentLength = 0;
         }
       }
     }
@@ -142,13 +142,13 @@
   }
 
   private void maybeWriteIndent() {
-    if (mEmptyLine) {
-      mEmptyLine = false;
-      if (mIndentBuilder.length() != 0) {
-        if (mCurrentIndent == null) {
-          mCurrentIndent = mIndentBuilder.toString().toCharArray();
+    if (emptyLine) {
+      emptyLine = false;
+      if (indentBuilder.length() != 0) {
+        if (currentIndent == null) {
+          currentIndent = indentBuilder.toString().toCharArray();
         }
-        super.write(mCurrentIndent, 0, mCurrentIndent.length);
+        super.write(currentIndent, 0, currentIndent.length);
       }
     }
   }
