@Override
  public void onServiceStateChanged(ServiceState serviceState) {
    int state = serviceState.getState();
    if (state == mPreviousState
        || (state != ServiceState.STATE_IN_SERVICE
            && mPreviousState != ServiceState.STATE_IN_SERVICE)) {
      // Only interested in state changes or transitioning into or out of "in service".
      // Otherwise just quit.
      mPreviousState = state;
      return;
    }

    if (state == ServiceState.STATE_IN_SERVICE) {
      VoicemailStatusQueryHelper voicemailStatusQueryHelper =
          new VoicemailStatusQueryHelper(mContext);
      if (voicemailStatusQueryHelper.isVoicemailSourceConfigured(mPhoneAccount)) {
        if (!voicemailStatusQueryHelper.isNotificationsChannelActive(mPhoneAccount)) {
          Log.v(TAG, "Notifications channel is active for " + mPhoneAccount.getId());
          VoicemailContract.Status.setStatus(
              mContext,
              mPhoneAccount,
              VoicemailContract.Status.CONFIGURATION_STATE_OK,
              VoicemailContract.Status.DATA_CHANNEL_STATE_OK,
              VoicemailContract.Status.NOTIFICATION_CHANNEL_STATE_OK);
          PhoneGlobals.getInstance()
              .clearMwiIndicator(PhoneUtils.getSubIdForPhoneAccountHandle(mPhoneAccount));
        }
      }

      if (OmtpVvmSourceManager.getInstance(mContext).isVvmSourceRegistered(mPhoneAccount)) {
        Log.v(TAG, "Signal returned: requesting resync for " + mPhoneAccount.getId());
        LocalLogHelper.log(TAG, "Signal returned: requesting resync for " + mPhoneAccount.getId());
        // If the source is already registered, run a full sync in case something was missed
        // while signal was down.
        Intent serviceIntent =
            OmtpVvmSyncService.getSyncIntent(
                mContext,
                OmtpVvmSyncService.SYNC_FULL_SYNC,
                mPhoneAccount,
                true /* firstAttempt */);
        mContext.startService(serviceIntent);
      } else {
        Log.v(TAG, "Signal returned: reattempting activation for " + mPhoneAccount.getId());
        LocalLogHelper.log(
            TAG, "Signal returned: reattempting activation for " + mPhoneAccount.getId());
        // 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.
        OmtpVvmCarrierConfigHelper carrierConfigHelper =
            new OmtpVvmCarrierConfigHelper(
                mContext, PhoneUtils.getSubIdForPhoneAccountHandle(mPhoneAccount));
        carrierConfigHelper.startActivation();
      }
    } else {
      Log.v(TAG, "Notifications channel is inactive for " + mPhoneAccount.getId());
      mContext.stopService(
          OmtpVvmSyncService.getSyncIntent(
              mContext, OmtpVvmSyncService.SYNC_FULL_SYNC, mPhoneAccount, true /* firstAttempt */));

      if (!OmtpVvmSourceManager.getInstance(mContext).isVvmSourceRegistered(mPhoneAccount)) {
        return;
      }

      VoicemailContract.Status.setStatus(
          mContext,
          mPhoneAccount,
          VoicemailContract.Status.CONFIGURATION_STATE_OK,
          VoicemailContract.Status.DATA_CHANNEL_STATE_NO_CONNECTION,
          VoicemailContract.Status.NOTIFICATION_CHANNEL_STATE_NO_CONNECTION);
    }
    mPreviousState = state;
  }
 public static OmtpVvmSourceManager getInstance(Context context) {
   sInstance.setup(context);
   return sInstance;
 }