/** Generate and update all UI elements */
  private void updateView(
      LinearLayout uiStatesView,
      CpuSpyApp cpuSpyApp,
      CardViewItem.DCardView frequencyCard,
      CardViewItem.DCardView uptimeCard,
      CardViewItem.DCardView additionalCard) {
    if (!isAdded()) return;
    /**
     * Get the CpuStateMonitor from the app, and iterate over all states, creating a row if the
     * duration is > 0 or otherwise marking it in extraStates (missing)
     */
    uiStatesView.removeAllViews();
    List<String> extraStates = new ArrayList<>();
    for (CpuStateMonitor.CpuState state : cpuSpyApp.getCpuStateMonitor().getStates()) {
      if (state.duration > 0) {
        addView(frequencyCard);
        try {
          generateStateRow(state, uiStatesView, cpuSpyApp.getCpuStateMonitor());
        } catch (NullPointerException e) {
          e.printStackTrace();
        }
      } else
        extraStates.add(
            state.freq == 0
                ? getString(R.string.deep_sleep)
                : state.freq / 1000 + getString(R.string.mhz));
    }

    // show the red warning label if no states found
    if (cpuSpyApp.getCpuStateMonitor().getStates().size() == 0) {
      removeView(uptimeCard);
      removeView(frequencyCard);
    }

    // update the total state time
    uptimeCard.setDescription(sToString(cpuSpyApp.getCpuStateMonitor().getTotalStateTime() / 100));

    // for all the 0 duration states, add the the Unused State area
    if (extraStates.size() > 0) {
      int n = 0;
      StringBuilder stringBuilder = new StringBuilder();

      for (String s : extraStates) {
        if (n++ > 0) stringBuilder.append(",").append(" ");
        stringBuilder.append(s);
      }

      additionalCard.setDescription(stringBuilder.toString());
    } else additionalCard.setDescription("-");
  }
  /** Initialize the Fragment */
  @Override
  public void init(Bundle savedInstanceState) {
    super.init(savedInstanceState);

    if (CPU.isBigLITTLE()) {
      DDividerCard bigDivider = new DDividerCard();
      bigDivider.setText(getString(R.string.big).toLowerCase());
      addView(bigDivider);
    }

    uptimeCard = new CardViewItem.DCardView();
    uptimeCard.setTitle(getString(R.string.uptime));
    addView(uptimeCard);

    additionalCard = new CardViewItem.DCardView();
    additionalCard.setTitle(getString(R.string.unused_cpu_states));
    addView(additionalCard);

    uiStatesView = new LinearLayout(getActivity());
    uiStatesView.setOrientation(LinearLayout.VERTICAL);
    frequencyCard = new CardViewItem.DCardView();
    frequencyCard.setTitle(getString(R.string.frequency_table));
    frequencyCard.setView(uiStatesView);
    frequencyCard.setFullSpan(true);
    addView(frequencyCard);

    if (CPU.isBigLITTLE()) {
      DDividerCard LITTLEDivider = new DDividerCard();
      LITTLEDivider.setText(getString(R.string.little));
      addView(LITTLEDivider);

      uptimeCardLITTLE = new CardViewItem.DCardView();
      uptimeCardLITTLE.setTitle(getString(R.string.uptime));
      addView(uptimeCardLITTLE);

      additionalCardLITTLE = new CardViewItem.DCardView();
      additionalCardLITTLE.setTitle(getString(R.string.unused_cpu_states));
      addView(additionalCardLITTLE);

      uiStatesViewLITTLE = new LinearLayout(getActivity());
      uiStatesViewLITTLE.setOrientation(LinearLayout.VERTICAL);
      frequencyCardLITTLE = new CardViewItem.DCardView();
      frequencyCardLITTLE.setTitle(getString(R.string.frequency_table));
      frequencyCardLITTLE.setView(uiStatesViewLITTLE);
      frequencyCardLITTLE.setFullSpan(true);
      addView(frequencyCardLITTLE);
    }
  }
  private long viewInit(File folder, final Backup.PARTITION partition_type) {
    if (!folder.exists()) if (!folder.mkdirs()) return 0;

    long size = 0;
    String text = null;
    if (folder.toString().endsWith("boot")) text = getString(R.string.boot);
    else if (folder.toString().endsWith("recovery")) text = getString(R.string.recovery);
    else if (folder.toString().endsWith("fota")) text = getString(R.string.fota);
    if (text == null) return 0;
    for (final File file : folder.listFiles())
      if (file.getName().endsWith(".img")) {
        CardViewItem.DCardView cardView = new CardViewItem.DCardView();
        cardView.setTitle(file.getName().replace(".img", ""));
        long fileSize = file.length() / 1024 / 1024;
        size += fileSize;
        cardView.setDescription(text + ", " + fileSize + getString(R.string.mb));
        cardView.setOnDCardListener(
            new CardViewItem.DCardView.OnDCardListener() {
              @Override
              public void onClick(CardViewItem.DCardView dCardView) {
                new AlertDialog.Builder(getActivity())
                    .setItems(
                        getResources().getStringArray(R.array.backup_menu),
                        new DialogInterface.OnClickListener() {
                          @Override
                          public void onClick(DialogInterface dialog, int which) {
                            switch (which) {
                              case 0:
                                restoreDialog(file, partition_type, true);
                                break;
                              case 1:
                                deleteDialog(file);
                                break;
                            }
                          }
                        })
                    .show();
              }
            });

        addView(cardView);
      }
    return size;
  }