Dodgeball: A True Underdog Story

Peter LaFleur is the owner of Average Joe's, a small gym with only a few members. When he defaults on the gym's mortgage, it is purchased by his rival, the arrogant White Goodman, a fitness guru and owner of the Globo-Gym across the street. Unless Peter can raise $50,000 in thirty days, White will foreclose on Average Joe's and demolish it to build a parking garage. Attorney Katherine "Kate" Veatch is working on the transaction for White. White unsuccessfully attempts to seduce her, and she instead develops a close friendship with Peter.
Average Joe's employees Dwight and Owen and members Steve "the Pirate", Justin and Gordon try to raise the money needed to save the gym. Gordon suggests that they enter a dodgeball tournament in Las Vegas with a $50,000 prize. They form a team with Peter and watch a 1950s-era training video narrated by dodgeball legend "Patches" O'Houlihan (Hank Azaria) and a 12-year-old boy named Timmy (Cayden Boyd). They are soundly defeated by a Girl Scout troop in a local qualifying match, but win by default when the Scouts are disqualified because of one member's steroid and beaver tranquilizer use.
White has been spying on Average Joe's using a hidden camera, and forms his own elite dodgeball team to defeat them. Peter is approached by the aging, wheelchair-bound Patches, who volunteers to coach the team. Patches' training regimen includes throwing wrenches at the team ("If you can dodge a wrench you can dodge a ball!"), forcing them to dodge oncoming cars and constantly roasting them with insults. Kate demonstrates skill at the game, but declines to join the team as it would be a conflict of interest. Upon finding a loophole in the contract with Kate, White arranges for her to be fired from her law firm so that dating him would not be a conflict of interest. This enrages Kate and motivates her to join the Average Joe's team.
At the tournament in Las Vegas, Average Joe's suffers early setbacks but manages to advance to the final round against Globo-Gym. The night before the match, Patches is killed by a falling sign. Peter expresses his anxiety that the team will lose and scolds Steve for his embarrassing pirate persona, causing Steve to leave the team. White offers Peter $100,000 for the deed to Average Joe's, which Peter accepts. The day of the final round, Justin leaves to help his classmate Amber with a cheerleading competition, leaving the team without enough members to compete. Peter has a chance encounter with Lance Armstrong, who talks him into rejoining his team, but he arrives too late: Average Joe's has already been forced to forfeit. Gordon finds a loophole in the rules: a majority of the judges can overturn the forfeiture. Chuck Norris casts the tie-breaking vote allowing the team to play.
After an intense game, Peter and White face off in a sudden-death match to determine the winner. Inspired by a vision of Patches, Peter blindfolds himself and is able to dodge White's throw and strike him, winning the championship and the prize money. White declares the victory meaningless, since Peter had sold Average Joe's to him the previous night, but Peter reveals that he used White's $100,000 to bet on Average Joe's to win; with the odds against them at 50 to 1, he has won $5 million. Because Globo-Gym is a public company (which White was unaware of), he purchases a controlling interest in the company, which now also includes Average Joe's, and fires White. Steve returns to the group after Peter apologizes to him. He has appeared to have quit being a pirate until Peter inspires him to be his old self. Peter is upset when a girlfriend of Kate's kisses her passionately, but Kate then reveals that she is bisexual and kisses Peter as well. Justin finds romance with Amber, while Owen begins dating Fran from the Globo-Gym team. Peter opens youth dodgeball classes at a newly renovated Average Joe's, while White, as depicted in a vignette during the credits becomes massively obese from junk food.

Question: With what White has been spying on Average Joe?
Answer: Hidden camera