Jumper

In Ann Arbor, Michigan, 15-year-old David Rice (Max Thieriot) gives his crush, Millie Harris (AnnaSophia Robb), a snow globe. A bully, Mark Kobold (Jesse James), throws it onto a frozen river. While trying to retrieve it, David falls through the ice and is pulled away by the current. He suddenly finds himself in the local library and discovers his ability to "jump" from one place to another. Amazed with his new ability, he leaves his abusive father (Michael Rooker) and runs away from home.
Eight years later, an adult David (Hayden Christensen) lives lavishly on stolen money. One day, he is ambushed in his home by Roland Cox (Samuel L. Jackson), a member of the Paladins, a group of religious extremists who have been tracking down and killing "Jumpers". Their reasoning is that Jumpers' alleged omnipresence is considered blasphemous. Roland tries to capture David with electric cables designed to nullify his ability, but David escapes. He returns to Ann Arbor, seeking his old crush Millie (Rachel Bilson). When Mark (Teddy Dunn) attacks him, David teleports him into a bank vault and leaves him there. David then returns to Millie and invites her on a trip to Rome. Roland later discovers Mark in police custody and learns David's identity.
In Rome, David and Millie grow closer, though he keeps his ability a secret. They visit the Colosseum, where David meets Griffin (Jamie Bell), another Jumper. A group of Paladins appear, and Griffin casually kills them, then jumps away. David tries to leave with Millie, but he's detained by Italian police and questioned about the deaths. David's mother, Mary (Diane Lane), who had left him when he was five, appears and helps him escape. She urges him to leave Rome with Millie, to protect her. Millie, upset and afraid when David tries to skirt around the issue, demands to know the truth. David declines and puts her on a plane home.
David runs into Griffin again, and follows him to his hideout in a cave. Griffin reveals that he has been trailing and killing Paladins for years and plans to kill Roland to avenge his parents. David sees Mary's photo on the wall and realizes she is also a Paladin. Griffin tells David that the Paladins will target his loved ones to draw him out. David teleports home and finds his father lying bleeding. He gets his father to a hospital and returns to Griffin to ask for help. Realizing Roland is personally hunting David, Griffin agrees.
They go to pick Millie up at the airport, but she is no longer there. Griffin returns to his hideout to get weapons. David breaks into Millie's apartment, angering her. Seeing Roland arriving, David decides to reveal the truth to her. He teleports her to Griffin's hideout. Using a machine that keeps David's "jump scar" open, the Paladins, including Roland, invade the hideout. David and Griffin subdue most of them. Roland is chased back through the jump scar, but he manages to snatch Millie with him. He sets up a trap in Millie's apartment, expecting David to come back for her.
Obsessed with killing Roland, Griffin plans to bomb the apartment; but David objects, wanting to save Millie. They fight and David traps Griffin with power lines in Chechnya. Ignoring Griffin's warning, David jumps to Millie's apartment and is quickly trapped by Roland's cables. The cables "link" him to the apartment, making him unable to jump away alone. Mustering his strength, David teleports the apartment and everyone inside to a river. Once free of the cables, David teleports Millie to safety and dumps Roland in a cave in the Grand Canyon. He leaves Roland there, explaining that not all Jumpers are a threat to be destroyed.
David visits his mother and discovers his half-sister, Sophie (Kristen Stewart). Mary tells David that when he was five, he made his jump. She is a Paladin and had to either kill David or leave. After leaving her house, David meets with Millie outside, and they jump to an unknown location.

Question: Who decides to reveal the truth to Millie?
Answer: David