void refreshUi(boolean dataChanged) {
    if (dataChanged) {
      ServiceListAdapter adapter = (ServiceListAdapter) (mListView.getAdapter());
      adapter.refreshItems();
      adapter.notifyDataSetChanged();
    }

    if (mDataAvail != null) {
      mDataAvail.run();
      mDataAvail = null;
    }

    // This is the amount of available memory until we start killing
    // background services.
    mMemInfoReader.readMemInfo();
    long availMem =
        mMemInfoReader.getFreeSize() + mMemInfoReader.getCachedSize() - SECONDARY_SERVER_MEM;
    if (availMem < 0) {
      availMem = 0;
    }

    /// M: get total size @{
    long totalSize = mMemInfoReader.getTotalSize();
    /// @}

    synchronized (mState.mLock) {

      /// M: get zram extra available memory @{
      long extraAvailableSize = 0;
      if (SystemProperties.getBoolean("mediatek.virtual_zram_extra", false)) {
        extraAvailableSize += Process.getZramExtraAvailableSize();
      } else {
        final long anonReserve = 15 * 1024 * 1024; // 15MB
        long anonToCompress =
            Process.getLruAnonMemory() - anonReserve - mState.mBackgroundProcessMemory;
        if (anonToCompress > 0) {
          extraAvailableSize =
              (long) (anonToCompress * (1.0f - 1.0f / Process.getZramCompressRatio()));
        }
      }
      Log.i("RunningProcessView", "extraAvailableSize = " + extraAvailableSize);
      availMem += extraAvailableSize;
      /// @}
      if (mLastNumBackgroundProcesses != mState.mNumBackgroundProcesses
          || mLastBackgroundProcessMemory != mState.mBackgroundProcessMemory
          || mLastAvailMemory != availMem) {
        mLastNumBackgroundProcesses = mState.mNumBackgroundProcesses;
        mLastBackgroundProcessMemory = mState.mBackgroundProcessMemory;
        mLastAvailMemory = availMem;
        long freeMem = mLastAvailMemory + mLastBackgroundProcessMemory;

        BidiFormatter bidiFormatter = BidiFormatter.getInstance();
        String sizeStr =
            bidiFormatter.unicodeWrap(Formatter.formatShortFileSize(getContext(), freeMem));

        mBackgroundProcessText.setText(
            getResources().getString(R.string.service_background_processes, sizeStr));

        sizeStr =
            bidiFormatter.unicodeWrap(
                Formatter.formatShortFileSize(
                    getContext(), mMemInfoReader.getTotalSize() - freeMem));

        mForegroundProcessText.setText(
            getResources().getString(R.string.service_foreground_processes, sizeStr));
      }
      if (mLastNumForegroundProcesses != mState.mNumForegroundProcesses
          || mLastForegroundProcessMemory != mState.mForegroundProcessMemory
          || mLastNumServiceProcesses != mState.mNumServiceProcesses
          || mLastServiceProcessMemory != mState.mServiceProcessMemory) {
        mLastNumForegroundProcesses = mState.mNumForegroundProcesses;
        mLastForegroundProcessMemory = mState.mForegroundProcessMemory;
        mLastNumServiceProcesses = mState.mNumServiceProcesses;
        mLastServiceProcessMemory = mState.mServiceProcessMemory;
        /*
        String sizeStr = Formatter.formatShortFileSize(getContext(),
                mLastForegroundProcessMemory + mLastServiceProcessMemory);
        mForegroundProcessText.setText(getResources().getString(
                R.string.service_foreground_processes, sizeStr));
        */
      }
      /// M: get swap usage @{
      float totalMem = totalSize;
      float totalShownMem = availMem + mLastBackgroundProcessMemory + mLastServiceProcessMemory;
      Log.i(
          "RunningProcessView",
          "totalShownMem = "
              + mMemInfoReader.getFreeSize()
              + " + "
              + mMemInfoReader.getCachedSize()
              + " - "
              + SECONDARY_SERVER_MEM
              + " + "
              + mLastBackgroundProcessMemory
              + " + "
              + mLastServiceProcessMemory);
      /// @}
      mColorBar.setRatios(
          (totalMem - totalShownMem) / totalMem,
          mLastServiceProcessMemory / totalMem,
          mLastBackgroundProcessMemory / totalMem);
    }
  }
  void refreshUi(boolean dataChanged) {
    if (dataChanged) {
      ServiceListAdapter adapter = (ServiceListAdapter) (mListView.getAdapter());
      adapter.refreshItems();
      adapter.notifyDataSetChanged();
    }

    if (mDataAvail != null) {
      mDataAvail.run();
      mDataAvail = null;
    }

    // This is the amount of available memory until we start killing
    // background services.
    mMemInfoReader.readMemInfo();
    long availMem =
        mMemInfoReader.getFreeSize() + mMemInfoReader.getCachedSize() - SECONDARY_SERVER_MEM;
    if (availMem < 0) {
      availMem = 0;
    }

    synchronized (mState.mLock) {
      if (mLastNumBackgroundProcesses != mState.mNumBackgroundProcesses
          || mLastBackgroundProcessMemory != mState.mBackgroundProcessMemory
          || mLastAvailMemory != availMem) {
        mLastNumBackgroundProcesses = mState.mNumBackgroundProcesses;
        mLastBackgroundProcessMemory = mState.mBackgroundProcessMemory;
        mLastAvailMemory = availMem;
        long freeMem = mLastAvailMemory + mLastBackgroundProcessMemory;
        BidiFormatter bidiFormatter = BidiFormatter.getInstance();
        String sizeStr =
            bidiFormatter.unicodeWrap(Formatter.formatShortFileSize(getContext(), freeMem));
        mBackgroundProcessText.setText(
            getResources().getString(R.string.service_background_processes, sizeStr));
        sizeStr =
            bidiFormatter.unicodeWrap(
                Formatter.formatShortFileSize(
                    getContext(), mMemInfoReader.getTotalSize() - freeMem));
        mForegroundProcessText.setText(
            getResources().getString(R.string.service_foreground_processes, sizeStr));
      }
      if (mLastNumForegroundProcesses != mState.mNumForegroundProcesses
          || mLastForegroundProcessMemory != mState.mForegroundProcessMemory
          || mLastNumServiceProcesses != mState.mNumServiceProcesses
          || mLastServiceProcessMemory != mState.mServiceProcessMemory) {
        mLastNumForegroundProcesses = mState.mNumForegroundProcesses;
        mLastForegroundProcessMemory = mState.mForegroundProcessMemory;
        mLastNumServiceProcesses = mState.mNumServiceProcesses;
        mLastServiceProcessMemory = mState.mServiceProcessMemory;
        /*
        String sizeStr = Formatter.formatShortFileSize(getContext(),
                mLastForegroundProcessMemory + mLastServiceProcessMemory);
        mForegroundProcessText.setText(getResources().getString(
                R.string.service_foreground_processes, sizeStr));
        */
      }

      float totalMem = mMemInfoReader.getTotalSize();
      float totalShownMem = availMem + mLastBackgroundProcessMemory + mLastServiceProcessMemory;
      mColorBar.setRatios(
          (totalMem - totalShownMem) / totalMem,
          mLastServiceProcessMemory / totalMem,
          mLastBackgroundProcessMemory / totalMem);
    }
  }