private void updateComputer(ComputerDetails details) {
    ComputerObject existingEntry = null;

    for (int i = 0; i < pcGridAdapter.getCount(); i++) {
      ComputerObject computer = (ComputerObject) pcGridAdapter.getItem(i);

      // Check if this is the same computer
      if (details.uuid.equals(computer.details.uuid)) {
        existingEntry = computer;
        break;
      }
    }

    if (existingEntry != null) {
      // Replace the information in the existing entry
      existingEntry.details = details;
    } else {
      // Add a new entry
      pcGridAdapter.addComputer(new ComputerObject(details));

      // Remove the "Discovery in progress" view
      noPcFoundLayout.setVisibility(View.INVISIBLE);
    }

    // Notify the view that the data has changed
    pcGridAdapter.notifyDataSetChanged();
  }
  @Override
  public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    stopComputerUpdates(false);

    // Call superclass
    super.onCreateContextMenu(menu, v, menuInfo);

    AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
    ComputerObject computer = (ComputerObject) pcGridAdapter.getItem(info.position);

    // Inflate the context menu
    if (computer.details.reachability == ComputerDetails.Reachability.OFFLINE
        || computer.details.reachability == ComputerDetails.Reachability.UNKNOWN) {
      menu.add(Menu.NONE, WOL_ID, 1, getResources().getString(R.string.pcview_menu_send_wol));
      menu.add(Menu.NONE, DELETE_ID, 2, getResources().getString(R.string.pcview_menu_delete_pc));
    } else if (computer.details.pairState != PairState.PAIRED) {
      menu.add(Menu.NONE, PAIR_ID, 1, getResources().getString(R.string.pcview_menu_pair_pc));
      menu.add(Menu.NONE, DELETE_ID, 2, getResources().getString(R.string.pcview_menu_delete_pc));
    } else {
      if (computer.details.runningGameId != 0) {
        menu.add(Menu.NONE, RESUME_ID, 1, getResources().getString(R.string.applist_menu_resume));
        menu.add(Menu.NONE, QUIT_ID, 2, getResources().getString(R.string.applist_menu_quit));
      }

      menu.add(Menu.NONE, APP_LIST_ID, 3, getResources().getString(R.string.pcview_menu_app_list));

      // FIXME: We used to be able to unpair here but it's been broken since GFE 2.1.x, so I've
      // replaced
      // it with delete which actually work
      menu.add(Menu.NONE, DELETE_ID, 4, getResources().getString(R.string.pcview_menu_delete_pc));
    }
  }
  private void removeComputer(ComputerDetails details) {
    for (int i = 0; i < pcGridAdapter.getCount(); i++) {
      ComputerObject computer = (ComputerObject) pcGridAdapter.getItem(i);

      if (details.equals(computer.details)) {
        pcGridAdapter.removeComputer(computer);
        pcGridAdapter.notifyDataSetChanged();

        if (pcGridAdapter.getCount() == 0) {
          // Show the "Discovery in progress" view
          noPcFoundLayout.setVisibility(View.VISIBLE);
        }

        break;
      }
    }
  }
  private void initializeViews() {
    setContentView(R.layout.activity_pc_view);

    UiHelper.notifyNewRootView(this);

    // Set default preferences if we've never been run
    PreferenceManager.setDefaultValues(this, R.xml.preferences, false);

    // Setup the list view
    ImageButton settingsButton = (ImageButton) findViewById(R.id.settingsButton);
    ImageButton addComputerButton = (ImageButton) findViewById(R.id.manuallyAddPc);

    settingsButton.setOnClickListener(
        new OnClickListener() {
          @Override
          public void onClick(View v) {
            startActivity(new Intent(PcView.this, StreamSettings.class));
          }
        });
    addComputerButton.setOnClickListener(
        new OnClickListener() {
          @Override
          public void onClick(View v) {
            Intent i = new Intent(PcView.this, AddComputerManually.class);
            startActivity(i);
          }
        });

    getFragmentManager()
        .beginTransaction()
        .replace(R.id.pcFragmentContainer, new AdapterFragment())
        .commitAllowingStateLoss();

    noPcFoundLayout = (RelativeLayout) findViewById(R.id.no_pc_found_layout);
    if (pcGridAdapter.getCount() == 0) {
      noPcFoundLayout.setVisibility(View.VISIBLE);
    } else {
      noPcFoundLayout.setVisibility(View.INVISIBLE);
    }
    pcGridAdapter.notifyDataSetChanged();
  }
  @Override
  public boolean onContextItemSelected(MenuItem item) {
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
    final ComputerObject computer = (ComputerObject) pcGridAdapter.getItem(info.position);
    switch (item.getItemId()) {
      case PAIR_ID:
        doPair(computer.details);
        return true;

      case UNPAIR_ID:
        doUnpair(computer.details);
        return true;

      case WOL_ID:
        doWakeOnLan(computer.details);
        return true;

      case DELETE_ID:
        if (managerBinder == null) {
          Toast.makeText(
                  PcView.this,
                  getResources().getString(R.string.error_manager_not_running),
                  Toast.LENGTH_LONG)
              .show();
          return true;
        }
        managerBinder.removeComputer(computer.details.name);
        removeComputer(computer.details);
        return true;

      case APP_LIST_ID:
        doAppList(computer.details);
        return true;

      case RESUME_ID:
        if (managerBinder == null) {
          Toast.makeText(
                  PcView.this,
                  getResources().getString(R.string.error_manager_not_running),
                  Toast.LENGTH_LONG)
              .show();
          return true;
        }

        ServerHelper.doStart(
            this,
            new NvApp("app", computer.details.runningGameId),
            computer.details,
            managerBinder);
        return true;

      case QUIT_ID:
        if (managerBinder == null) {
          Toast.makeText(
                  PcView.this,
                  getResources().getString(R.string.error_manager_not_running),
                  Toast.LENGTH_LONG)
              .show();
          return true;
        }

        // Display a confirmation dialog first
        UiHelper.displayQuitConfirmationDialog(
            this,
            new Runnable() {
              @Override
              public void run() {
                ServerHelper.doQuit(
                    PcView.this,
                    ServerHelper.getCurrentAddressFromComputer(computer.details),
                    new NvApp("app", 0),
                    managerBinder,
                    null);
              }
            },
            null);
        return true;

      default:
        return super.onContextItemSelected(item);
    }
  }