text:
Haley's Choice: Native Son Barbour Comes Home to Run for Governor
By Donna Ladd Sunday, January 11, 2004 3:10 a.m. CST
Jaro Vacek/file photo
Gov. Haley Barbour returned to Mississippi to run for governor after years in Washington, D.C., as a corporate lobbyist and a Republican operative. Photo by Jaro Vacek
JACKSON — The big sign draped between two trees next to the Neshoba County Fair pavilion in August 1982 caused a lot of drama: "Happy Birthday, Senator Stennis." We were all there as a bunch of college students from Mississippi State, Ole Miss and Southern to pack the audience during the political speech of the long-time senator, who happened to be turning 81 that day. Dekalb native John C. Stennis, a Democrat wedged part way between the old conservative Dixiecrat party and an increasingly liberal and less-racist re-make, was widely respected around the state, especially for the bacon he liked to send home from Washington. He was friendly with politicians from liberal to conservative, Kennedy to Nixon. He was the president pro tem of the Senate and widely expected to retire when he felt like it, rather than be defeated by some young whipper-snapper.
But young Republican Haley Barbour, a feisty Yazooan, wanted to bring the elderly senator home to Mississippi. He was the underdog challenger, he had lost 30 pounds to appear young and svelte for the race, and he wasn't going to give up without a fight. Later that day, Barbour would also infuriate us Stennis kids by having a big birthday cake, complete with people singing "Happy Birthday," rolled out for the aging senator. That year, though, the ploy didn't work for Barbour; Stennis defeated him in November. His message to voters: "Don't send a boy to do a man's job."
The competitive Barbour had run for student body president at Ole Miss—where he had distributed a negative missive about his opponent the night before the election—and had lost. Back in high school, news reports say, he had run for king of the local teen center and had won. And there was certainly an enormous elected position in his future: as chairman of the Republican National Committee, which he won by party ballot in 1993.
But, after the Stennis defeat, Barbour would not run for public office, at the mercy of the people of Mississippi, until he announced that he would take on incumbent Democrat Ronnie Musgrove here in 2003. Barbour had been out of Mississippi more than in it for many years, with some amazing successes under his belt, millions of dollars in the bank, and some friends in the highest places imaginable, but suddenly he decided to come on home and run for governor.
Mississippians seem to be split right down the middle on whether that return trip is a good idea. Supporters say it's been his long-time dream to bring back what he's learned to his state; critics say he's coming back to hand Mississippi over to the highest bidder.
Barbour was born Oct. 22, 1947, in Yazoo City. Like many Libras, he seems to have lived a life trying to balance extremes. He's also proved to be extremely personable and determined to get what he wants.
He was born into a certain amount of wealth in a Delta town that has long seen dramatic gaps between rich and poor. Despite the silver spoon, Barbour's family suffered early heartache: His father, Jeptha, an Ivy League-educated lawyer, died of a heart attack when he was only 36, and Barbour was a mere toddler. His mother, Leflore, and a family maid raised him and two older brothers, who also helped look after him. He graduated as valedictorian from Yazoo High School before it was integrated (his own sons would later attend private school), and enrolled at Ole Miss during the heat of the Civil Rights Movement.
Barbour was focused on politics from a young age, making buddies in the Ole Miss political nursery that would last him a lifetime. While still in Oxford, he took his first political job—as a field organizer for Richard Nixon's 1968 presidential campaign, the first of many national political strategy gigs for Barbour. Being a white Republican in the South was still unusual at that point; Barbour was in on (and helped start) a trend that would soon sweep the nation: the flight of staunch white conservatives to the party they used to hate from the bottom of their gut. "Where there had formerly been Democrats, they were now Republican, but they were of the same ideological persuasion," said Jackson State University political scientist Mary Coleman.
Until the civil-rights upheavals of the 1950s and '60s, the white South had been solidly Democratic, and even Dixiecratic—which then meant racist, segregationist and extremely conservative. Back then, Republicans were the liberals, the party of Lincoln, the party that ended slavery and elected black officials during Reconstruction, the carpetbaggers, the party that fought lynching and Jim Crow. The Democrats had squelched Republican power after re-taking the South in 1877; they held onto it firmly until the Civil Rights Movement when a seismic political shift happened: national Democrats like President Kennedy and then Texan Lyndon Johnson suddenly supported civil rights. So the financial and small-government conservatives that girded the Republican Party (led by Barry Goldwater) took the other road, opposing civil rights on a "state's rights" basis, and thus was suddenly very attractive to the segregationist South. The Grand New Party, you could say—was born out of anger over integration; many consider its official birth moment when Johnson signed the Civil Rights Act of 1964 and then turned to then-press secretary Bill Moyers and said, "I think we just delivered the South to the Republican Party for a long time to come."
"Republicans can claim all they want that it is still the Party of Lincoln, but no longer; the Republican Party is now the party of Jefferson Davis," said David Bositis, the senior research associate for the Joint Center of Political and Economic Studies in Washington, D.C., and an expert on the evolution of race politics in the United States. The way the new rendition of the GOP sought power in the pivotal South was to play to prejudices that were still very strong, he said—a scheme that would become known as the "Southern Strategy."
"When Nixon ran, (the "Southern Strategy") was a major part of his campaign: to appeal to white southerners in subtle ways and not-so-subtle ways," Bositis added.
It worked. The "Southern Strategy" provided a new lifeline to voters disgusted with the national Democratic party, who would become a major cornerstone of the modern version of the GOP, one Lincoln would hardly know. That new party was apparently quite attractive to an ambitious young man from Yazoo.
A Reagan Soldier
Barbour carried his new Republicanism into his career, which started in 1973 in Yazoo City as a partner in his family law firm, Henry, Barbour & DeCell. He hadn't received a bachelor's degree from Ole Miss—USA Today reported that he was six Latin credits shy—but he was able to enroll in the law school there and received his J.D. in 1972, the year after he got married to a girl from Canton. He and his new wife, Marsha, then settled back in Yazoo.
But even in the 1970s, Barbour had one foot out of the state, helping the national GOP gain a foothold in his home territory. He served as executive director of the fledgling Mississippi Republican Party from 1973 to 1976 and worked to draw southerners into the Gerald R. Ford camp in 1976. He continued serving in various positions in the state's party, and worked hard to draw Mississippians into Ronald Reagan's camp in 1980—in fact, Reagan kicked off his national "state's rights" campaign at the Neshoba County Fair, a fact that shocked many national political watchers in its seemingly blatant pander to the lingering white segregationists of the state; it had only been 16 years since James Chaney, Andrew Goodman and Michael Schwerner were murdered by Klansmen in Neshoba County and buried nine miles away from the fairground.
At the time, high school bands (including the one I was in) still routinely played "Dixie" at the fair, with older men in the audience defiantly standing at attention while the ode to the Old South played. The fairground then, as now, was filled with Confederate battle flags hanging proudly from the fronts of fair cabins (even as more blacks now attend the fair). Not all Mississippians agree, and many of all political persuasions love attending the fair, but many political junkies still think of the fair as a hotbed for the angry white vote. Regardless, one fact is clear: Haley Barbour certainly didn't twist Reagan's arm to avoid making such a statement to white Southerners in 1980.
Bositis said Barbour, as a man intimate with his state's body temperature, "probably" advised Reagan to go to the fair in the first place—but that is difficult to prove, and it's not like Barbour is going to loudly take credit for a race-tinged "Southern Strategy." By Reagan's time, the strategy was time-honored, Bositis said, and it was just a matter of how to carry it out the best. "Haley Barbour was one of Ronald Reagan's soldiers," Bositis said.
North Toward Home
Indeed, Barbour became White House political director for Reagan in 1985, a fact he is very proud of when speaking to conservative Mississippians. It was also the year that Barbour started spending the majority of his time in Washington, D.C., while his family was back home in Yazoo—a fact that he downplays, even as he subtly and not-so-subtly reminds voters as often as possible that Gov. Musgrove is a divorcé who is running his campaign without a devoted wife at his side.
"In the '80s, when President Reagan asked me to go to work for him as political director of the White House," Barbour said at this year's Neshoba County Fair, "Marsha and I decided not to move because we wanted to live here and have our boys grow up in Yazoo City. Over the years, it would have been easier to have moved and lived up there, but we chose to live at home, in Mississippi. So it was up on Sunday and back home on Thursday or Friday, most weeks. And I have nearly 4 million frequent flier miles on Delta to prove it."
Musgrove's divorce while in office has proved fortuitous to the Barbours; had Musgrove seemed happily married, it could have made the Barbours' long-distance marriage seem much less family-values traditional than they have carefully positioned it during the campaign. To hear them tell it, leaving Marsha behind in Yazoo was the best possible way to raise their two boys, Sterling and Reeves.
"I am so thankful that I was able to be home with our boys," Marsha Barbour said recently in a letter mailed by the Mississippi Republican Party to potential supporters. "Little things, like having both of our sons playing Little League baseball on the same field Haley did, make a difference in a child's life. There have been times I had wondered if it would have been easier if we had moved to Washington as the business Haley started grew. … (But) It was a decision we made as a family, and one we still know was right." A color copy of the couple's wedding photo was enclosed with the letter simply signed "Marsha."
Reports out of Yazoo haven't always been so rosy. In a USA Today profile in 1996, Marsha Barbour admitted that her husband was gone way too much for her taste; when he worked in the Reagan White House, he was home once a month if she was lucky. But when he left politics (temporarily) and started his own lobbying firm (the other side of politics) in 1986, he started coming home just about every weekend, she told the paper. But when he was elected as chairman of the RNC in 1993, he would be gone for weeks on end. "The last four years have been the hardest thing we've ever done," Marsha Barbour, then 46, told USA Today in 1996. "I haven't really been that much a part of it. He's been so busy and so consumed. He hasn't been home for an anniversary in a long time, or a birthday." Their sons were then aged 21 and 17.
It isn't hard to see why Marsha Barbour might be excited about her husband serving as governor of Mississippi: they could live together full time in Mississippi for the first time in nearly 20 years. She emphasizes in her letter to voters, though, that her sacrifice has been worth it: "It was a compromise made easier knowing how much Haley loved every job he's ever had," she wrote.
Beltway Man
By all accounts, Barbour lived a very different life in Washington than he did back in Yazoo: the city yin to his country yang, so to speak. He is known as a gregarious glad-hander and schmoozer—required qualifications for the head of a major political party and for the man who is arguably the world's most powerful lobbyist. He started the schmoozy Caucus Room restaurant and bar with a bipartisan group of partners. Roasted Chicken, served with Fennel, Roasted Elephant Garlic & Braised Beets costs $28, a Bone-On Filet $38, Haley's Chopped Salad $8. He enjoys sipping Maker's Mark bourbon in his bar and on the D.C. circuit.
"The business Haley started," as his wife called it, isn't exactly a corner drugstore. After he worked for Reagan's White House for a year, Barbour started his lobbying firm, Barbour, Griffith and Rogers, in 1986. It is a purely Republican concern, down to the receptionists, reported a recent New York Times Magazine piece. And he has enjoyed an impressive roster of clients, worth several millions of dollars per year in fees. Barbour is listed on lobbying records as an individual lobbyist for dozens of corporations, including major tobacco, communications, defense-contracting and health-care companies. The list of clients includes Microsoft, Delta Airlines, Bellsouth, CBS, DaimlerChrysler, CBS, Edison Electric, Federal Express, RJR Nabisco and a controversial U.N. family-planning group. In 2000 alone, the firm (of which he remained CEO after it was sold), brought in $9,250,000 in fees; he is listed as an individual lobbyist on the vast majority of accounts for that year.
The Musgrove campaign, as well as primary challenger Mitch Tyner (a trial attorney that many believe was in cahoots with Musgrove supporters) went on the attack early about Barbour's "fat cat" past, as Tyner called it. They have produced documents that show that Barbour lobbied on behalf of the Mexican government for implementation of the North American Free Trade Agreement (NAFTA), a controversial bipartisan effort that led to the loss of many manufacturing jobs in the U.S., as corporations moved plants to countries where labor is much cheaper. Mississippi lost 41,000 manufacturing jobs as the result of NAFTA.
Tyner also unearthed old news reports showing that Barbour, while RNC chairman, had worked with Sen. Trent Lott and then Rep. Newt Gingrich, both Republican allies, to try to insert a $50 billion tax credit for tobacco companies in the middle of the night during budget negotiations in 1997.
Outside Mississippi, Barbour is well known for his maneuvering on behalf of his lobbying clients and the Republican Party, even as the lines between the two often blur. "Ask forgiveness, not permission," he has described his philosophy, according to news reports. That is, do what it takes to win, even if it's not exactly focused on specific issues and policies. Apologize later if you need to.
Here in Mississippi, the jury is out on whether Barbour's successful career is a plus or a minus. In a state that desperately needs more good jobs and smart economic development (a point that both Barbour and Musgrove pound home), many people believe his contacts are his greatest strengths.
"We certainly think that if he were to win that it would be good for our city and for our county," said Wardell Leach, the African-American mayor of Yazoo City. "We think it would be good for the state as a whole, but in terms of Yazoo City, we would certainly expect some sort of windfall from it."
Leech said his city, which experiences a large poverty gap especially between black and white, has been hard hit in the current economy, and lost many jobs when K-Mart, a major employer, pulled out recently. Thus, he hopes that Barbour's election would help Yazoo benefit from more infrastructure and special projects such as Musgrove's hometown of Batesville has seen. "He has proven himself, he has spent a lot of time in Washington, and he has a lot of influence," Leech said. "We think that will be good for Yazoo County."
'Influence Peddling'
Musgrove emphasizes that corporate contacts do not a good governor make, and has banked much of his campaign on it, pounding TV ads into voters' living rooms that remind them that Barbour isn't just the guy down the street. The Tuesday before the election, for instance, the campaign launched an ad criticizing Barbour because his lobbying partners started a company, New Bridge Strategies, that is helping corporate clients seek contracts to rebuild Iraq. Barbour has insisted that he isn't connected with the venture, but it shares offices with his firm in Washington. "Mississippi needs a governor to bring jobs here, not jobs in Iraq for his clients," the TV ad states.
But will running against Barbour's past resonate with Mississippi voters? "I do think it will," Musgrove campaign manager Lisa McMurray said. "It's influence-peddling. I think it's distasteful." She also said: "Over the last 20 years, Haley Barbour has worked for people who don't care about us, our families, our job or our state, He's represented clients who have hurt the best interest of the people of Mississippi, and it's hard (to believe) that when his name is still on the door of that lobbying firm that he will put the best interests of the regular people of Mississippi first."
Other experts without a pony in this race agree that Barbour's lobbying past could be more harmful than helpful, ultimately, to the state. "The minus is that clearly Barbour has been, his entire professional life, connected to that corporate elite," said Larry Sabato of the University of Virginia Center for Politics.. "Mississippi is a very poor state, and there is more to governing that state than there is to connecting with corporate America. You need to connect with average people, poor people, average and middle-class whites and blacks, and while Barbour is a friendly enough guy, I don't think it will come as naturally to him as it would to others. … Barbour would be spending a lot of time with corporate Mississippi and corporate America."
One arena where Barbour is likely to use his "influence" is the push for federal (and state) curbs against lawsuits and damage payouts, both for business and medical malpractice claims. Many of Barbour's lobbying clients have a direct financial interest in stopping what they call "lawsuit abuse" in the state. Although Musgrove called an 83-day special session that resulted in some legal reforms, Barbour makes no secret that further reforms are coming. "It's a big priority," said Barbour spokesman Quinton Dickerson. Barbour wants lower non-economic damage caps—half the $500,000 caps set last year—and more regulations to make it harder for attorneys to venue shop. He also calls for a "loser pay" system in which a losing plaintiff has to pay all costs of the lawsuit—a barrier that critics say would scare injured plaintiffs out of seeking redress, and would help eliminate the deterrent benefit of lawsuits.
And like many Republican candidates this year, Barbour is using "lawsuit abuse" rhetoric as a basis for much of his platform, while pointedly ignoring any problems with the insurance side of things, as demonstrated in a recent General Accounting Office report to Congress. His line is the party line: Eliminating the "abuse," he claims, will help lure new industry, create new jobs and make health care more accessible. Dickerson said that Barbour does not plan to look more closely at the insurance side of the equation; his focus is more reforms. Musgrove, however, recently told the JFP that he would call for hearings into industry's role in high premiums—a pledge that McMurray reiterated this week.
'It could be privatized'
Jackson Williams, a specialist in legal reform at Ralph Nader's Public Citizen in Washington, said that voters should be concerned with Barbour's "cozy relationship with special interests," such as the U.S. Chamber of Commerce, especially since the state has term limits. "You are always going to be concerned about whether his eight or four years in office are an audition for further lobbying jobs when he gets out. Is he going to be able to step out of his advocacy role and call things the way he sees it as governor?" Williams added.
The U.S. Chamber is invested in this race. The National Journal in Washington reported Sept. 20 that the American Taxpayer Alliance, a nonprofit group run by Republican lobbyist and Barbour friend Scott Reed, was investing just under a million dollars to run "leaking bucket" TV ads in Musgrove attacking Musgrove's economic record. The Taxpayer Alliance is funded in part by the U.S. Chamber's Institute for Legal Reform, set up in 1997 to fight for tort reforms. The alliance also ran "soft" ads against California Gov. Gray Davis during that state's energy crisis in 2001.
Political scientist Coleman says that Barbour's "lobbyist baggage," as she calls it, may well translate into some jobs, especially coupled with our large tax loopholes for industry and our lack of unions, but warns that they may not be good jobs. And she hasn't heard anything from Barbour's campaign that is geared to help the least fortunate. "He has not detailed any programs that would include the poorer people in the state," she said. His support for Head Start, for instance, is misleading: He is more likely to support the Bush attempts to make local Head Start programs more subject to federal accountability, while receiving less funding. "Knowing the Republicans, it could be privatized," she said of Head Start.
Likewise, Barbour has outlined few specific ways that he would help support the one institution that many Mississippians find so vital: public education. Much of his talk about education has centered around the idea of more "discipline in the classroom," an amorphous pledge that doesn't seem to have any policy behind it, beyond the three-strikes "School Safety Act" that Musgrove signed two years ago to make it easier to remove "disruptive" kids from the classroom. In education policy circles, the classroom-discipline phrase usually means an easing of the ability to expel and suspend kids—also known as "zero toleranceԗbut Dickerson denied that there is any such plan. In fact, he did not articulate any policy that would further discipline in schools. Just: "Haley would work with teachers, parents, administrators to come up with a policy."
Education advocates fear that Barbour will not fight for public education, maybe even trying to bring some sort of expanded "choice" program (beyond public charter schools) or even vouchers to the state. "Haley is not opposed to voucher programs," Dickerson said, adding that he had no plans on the topic.
One primary issue separates Musgrove and Barbour: public education. Last year, Musgrove led the fight to fully fund "adequate education" in the state (equalizes funding for poor districts), but with a budget deficit looming, some worry Barbour would support under-funding education, much as his friend President Bush has done with his "No Child Left Behind" education act. Musgrove criticizes Bush for not following through on both NCLB and special-ed mandates; Barbour's office is vague on the topic. "If there is anybody who can work with the present administration to make sure Mississippi has flexibility under No Child Left Behind, he's the one who has contacts with the administration," Dickerson said of his boss. Indeed, that is true: members of the White House, including the president and Education Secretary Rod Paige, all voucher proponents, have been in the state recently campaigning for Barbour.
Earlier in the year, Barbour used the word "whorehouse" to describe the atmosphere many Head Start children grow up in—many saw that word as similar lingo to that employed by his former bosses Reagan ("welfare queens") and Bush I ("Willie Horton") to lure the scared white vote.
Since the primaries, Barbour has not only worn a Mississippi flag lapel pin (it is the state flag, after all, like it or not), but has loudly criticized Musgrove for supporting the new flag design. One of three dramatic darts thrown at Musgrove in a current TV ad is for "Attacking Our Flagԗrhetoric that is hard to attribute to anything other than race-pandering. He also mentions the "Musgrove-Blackmon" ticket (which it isn't) at campaign stops, even after he told Blackmon he would stop, as reported by New York Times Magazine. He has been using old crime figures to scare voters about "dangerous" Jackson (where much of the black voting base in the state lives).
Barbour also refused to ask the Council of Conservative Citizens to remove a photograph of him posing with some of their leaders at the Black Hawk political rally in July. (State CofCC organizer Bill Lord is wearing a "Barbour for Governor" cap in the photo.) The Council was formed with the mailing lists of the old White Citizens Council, the group that fought for years to preserve segregation in the state with economic boycotts and harassment (not to mention by publishing propaganda that "proved" blacks were inferior and more prone to commit crimes, especially against helpless whites). First, Barbour denied knowing about the group (the same one that his friend Trent Lott made national headlines for associating with—and denying—in 1999) or that the Black Hawk rally was set up to support segregationist academies. He pointed out that Musgrove, and even black candidates, have attended Black Hawk in the past (which is true). Then he said he couldn't ask the CofCC, or any group, to take his photo off their personal Web site.
"We didn't know they used it. They just put it there," Dickerson told me. "I don't know how we can police the Internet." But would it hurt to ask the group to remove the photo if it offended the 37 percent of Mississippians who are black? "I don't know," Dickerson said, and then quickly pointed out a poll showing that Barbour might take 11 percent of the black vote in the state. "Haley said off the bat that he was going to reach out to black voters, not just because he needed the votes, but the support to govern," he said.
Coleman said some of Barbour's rhetoric has been "pregnant with racial meaning." She also said: "I don't know Haley Barbour enough to know what motivates him. I can only say that my sense is that, ideologically speaking, his politics are certainly consistent with Richard Nixon's." She worries that Barbour won't present a "safety net" for poor people. The real or imagined use of race coding may matter more this year than ever before, thanks largely to Blackmon and treasurer candidate Gary Anderson's place on the ballot. "If there is a big African-American turn-out, then Musgrove will pull out that second term. If there is a poor African-American turn-out, Barbour wins," Sabato said.
Additional reporting by Jesse Yancy.
"GOP Crosses Fingers in South": The conservative Washington Times is reporting that the Republican Party is likely to pick up the governor's mansion in Mississippi.
BTW, it was just pointed out to me at Hal & Mal's that the wedding cake in the Barbour photo we ran in the paper has Colonel Reb on top of it!!! I hadn't even noticed. I'll see about getting the picture posted. Now, Ole Miss historians, what year was Colonel Reb adopted? Maybe I'm confused, but it seems like it was after the Barbours got married. Maybe someone Photoshopped the old coot on the cake in a subtle bit of clever Southern Strategy.
It's such a hoot on many levels. I've never understood Mississippians total obsession with the colleges they attend. I mean, how many places in the world to you put your college mascot on your wedding cake? Actually, now that I think about it, I'm sure there are plenty, but still - college mascot on your wedding cake? Do people have their college mascot attend their weddings? This is one of those things I just don't get, even though I was raised right here in Jackson.
Kate, Just goes to show you that you don't have a clue about how fanatical about traditions (not in the MS sense) Texas A&M is :P. I've never been there, but I think Todd's an alum of that school. Get him to inform you about it if he's available. In the meantime, check out http://www.tamu.edu Then search the site for "traditions". They seem to have more elaborate traditions than Ole Miss ever will! But I'll let Todd have the last word on that one.
Unfortunately, though, many of the Ole Miss traditions are much more fraught with meaning and controversy than some of the others.
Read an outsider's analysis of our governor's race -- that of Robert Novak (the honorable journalist who outed the CIA operative in Iraq): "Mississippi is the most Republican of the Deep South states, won by Bush in 2000 by 17 points and represented in the U.S. Senate by two Republicans. Musgrove occupies the governor's office because of a lackluster campaign by his Republican opponent, then Rep. Mike Parker. Yet, if African-Americans (one-third of the state's population) vote in unusually high numbers, Musgrove can win. Democrats hope a black candidate for lieutenant governor, State Sen. Barbara Blackmon, brings them out Election Day." "Bush's Mississippi landslide included little more than 3 percent of the black vote, and polls now give Barbour 11 percent. However, Barbour does not match Bush in total domination of white voters. A recent survey shows Barbour ahead of Musgrove, 70 percent to 22 percent. But if the Democrats get up to 25 percent of whites, the Republican is in trouble." http://www.townhall.com/columnists/robertnovak/rn20031030.shtml Ladd: It's educational to hear that all the negative campaigning has come from the Musgrove camp, eh? This is my favorite part, which contrasts a bit with Marsha Barbour's quotes in USA Today, as quoted in the above story: "After that, his career centered on Washington -- as White House political director, Republican National Chairman and founder of a powerhouse lobbying firm. Barbour returned home every weekend to a modest house in Yazoo City, Miss." Cue the violins.
Philip, I do know a tiny bit about A&M - my brother taught there for a couple of years. But, since he's a PhD in Applied Math, and comes from a southern family of non-hunters and non-sports fanatics (for the most part, anyway), he would describe some of the activities there during football season in total awe and confusion. Totally bizarre-o article you posted, Donna. Maybe we need to send Mr. Novak some of the fliers we've been getting in the mail, from the Barbour campaign.
heh heh - Happy Halloween Donna & gang I'm not posting today (other than this) because my 4 year old son has a robot costume for tonight that needs tending & I am a designated escort this evening
A friend of mine emailed me this note about the flyer he got from the MRP yesterday (I don't have one, I must not be on the "A" list since I flunked his flag poll). I want to know what y'all think this means: ============================ The mail-out features a photo of Musgrove and Blackmon on the front with the heading, "Weak on crime. Tough on taxpayers. Against Mississippi traditions / The Blackmon/Musgrove agenda" printed above the photos. It goes on to list the agenda: Against our flag, Supports criminals' release, against choose life, against honoring the Dixie Division." =========================== What does he mean by "Dixie Division?"
C.W.
Kate: Novak's a party man all the way. You don't put the life of a covert intelligence official at risk for just anyone. Fielding: Happy Halloween, but I will count on you to answer my questions later. I look forward to your comments. C.W: Maybe "Dixie Division" is Barbour's nickname for his old home state. Seriously, it seems to another example of race pandering: From an Aug. 25, 2001 AP story: "Interstate 20 through Mississippi from Vicksburg to Meridian has been dedicated to the 31st Infantry Division in ceremonies Friday. The division, also known as the 'Dixie' Division, has a place in Mississippi fighting lore." "The whole football team at Carr Central High School in Vicksburg signed up together for the National Guard, egged on by their coach, who said they'd get to shoot rifles and sleep under the stars." "That was half a century ago, 1951, and a few months later, to the tune of Dixie played by his high school marching band, the teammates boarded a train for Fort Jackson, S.C., then went on to Korea." "The volunteers all wore the red and white D emblem of the 31st Infantry Division - the 'Dixie Division.' The division has left a legacy of valor dating back to the trenches of France in World War I. The 31st's direct ancestor, the 155th Mississippi Regiment, fought under Jefferson Davis in the Mexican War, and before that in the War of 1812. "The unit was deactivated in 1968." Ladd: That's background; here's where the juicy part comes in. Apparently, these days, the group finds the Rebel flag offensive and unneeded, to the chagrin of Rebel flag apologists, apparently including Barbour, if his TV ads and mailers are any indication: AP: "That word 'Dixie' was something we were having problems with," Sen. David Jordan, D-Greenwood, a black lawmaker, said. 'We put 'Dixie' in the same category we put the rebel flag; it reminds us of oppression and segregation and mistreatment.'" "(Tom) Logue, who is now president of the 31st Infantry Dixie Division Association, said he knew when he took over the decade-long effort to win the highway dedication the division would have to shift the focus to what they were really all about. "When I took over, I said 'lose the flag,"' he said. "We don't need it. It wasn't really a part of our division anyway." "So the battle flag came off association stationery. The large sign that went up marking the highway has "31st Infantry Division" in large letters with the division symbol, two red Ds inside a red circle, beneath. In small print under the symbol, the words "Dixie Division" explain what the two Ds stand for." (end AP) Ladd: Mr. Confederate himself Richard Barrett (who alone should be reason enough to bring the old flag down) uses the phrase in angry screeds against blacks Rebel flag opponents in the state. The only references to "Dixie Division" and "Musgrove" that I could find quickly were written by Barrett: http://www.angelfire.com/ms/barrettsite/katzenbach.html http://www.nationalist.org/speeches/democracy/sentinel.html http://www.nationalist.org/docs/ideology/tisdale.html Ladd: Does Barbour EVER stop with the Southern Strategy junk? It's breath-taking. C.W., can you ask your friend to fax (or scan and e-mail) that flyer to me? Toll-free fax: 866.728.4798
I just got another flier from the Barbour campaign myself. This one talks about "Here's the Musgrove-Blackmon Record:" (uh, wouldn't that be Musgrove-Tuck?). "Lost jobs - Mississippi had a net loss of 34,600 jobs under Musgrove - that's more jobs lost than under any governor since The Great Depression." (uh, can we do a real comparison. Becuase I think that maybe, just maybe, there are more people living in Mississippi now than in the Great Depression, and more manufacturing jobs in MS than in the Great Depression. I mean, were there even 34,600 manufacturing jobs in the state in the 1930s? Taking a guess, there are probably more people employed in MS than there were during the Great Depression. Why don't we look at percentages, for a true comparison. And why don't we look at what's happening in MS compared to the rest of the country. And why don't we analyze how many of those were lost due to NAFTA, and how many due to productivity gains?) blah blah crime "Budget Crisis - Mississippi has gone from its best financial condition ever to the worst budget mess in history with a $700 million budget hole." (uh, doesn't that pretty much describe MOST OF THE WORLD RIGHT NOW? I know it describes most of the US. And I know alot of people who blame Republicans for cutting taxes and increasing spending and the size of the government and oh, I don't know, spending billions of dollars bombing people and passing unfunded education mandates down to the states, and so forth. But hey, like the 'mission accomplished' sign, I'm sure that the Bush administration had nothing to do with that. blah blah blah education, lawsuits. "Against our state flag" Just cracks me up that that is supposed to be a negative. The flag needs to be changed, people. Anyway. I really wish that someone would send me a piece of campaign material that did not distort the truth. For real. Someone. Anyone.
Thanks, Kate. No negative slaps there, either, eh? Boy, they treat us like morons. So, we've become flyer-central for hearing about the mailers that are being sent, at least by the Republicans. Y'all keep telling us about them, regardless of party. If I had thought about it a while ago, we would have set up a truth-in-advertising part of the PoliticsBlog just to analyze all the junk, not that we haven't been doing that anyway. Next election, I promise. (That's supposed to be a major component of "civic journalism" by the way -- to analyze the claims of politicians, not just to report them.)
C.W., you wanted to know more about the Dixie Division: The 31st Infantry Division, a.k.a. the Dixie Division: http://www.grunts.net/army/31stid.html http://www.co.forrest.ms.us/campshelby.html
Oh, Donna already answered.
http://www.counterpunch.org/madsen10312003.html
Thanks, Ex, going to read them. And thanks, Donna, I'll try to read yours, too, if I don't throw up while I'm trying.
[Moved here] The Sunday New York Times Magazine is featuring Haley Barbour in a lengthy profile by Pulitzer nominee Nicholas Dawidoff. An excerpt: "While Barbour denies race-baiting, Winter says that Barbour's mention of the ticket is 'a nuanced racist message,' and Hodding Carter, president of the Knight Foundation and former editor of The Delta Democrat Times, says that Barbour's reference to liberals and tickets 'is simply code for n*gger-lover, integrationist, supporter of all the changes they've hated since 1964.' To Robert Haws, chairman of the history department at the University of Mississippi, the election has become a referendum on progress. 'If the subtle way Haley Barbour's using race is rejected by a Musgrove victory, then we may be into a genuine new era of Mississippi politics. I don't know why a middle-class white Mississippian would vote for Haley Barbour when he doesn't represent their interests at all, but race is still deep here.'" There's much more in the story.
Thanks for the info, fellas. Donna, Nia already asked me for any of the flier I could get my hands on. My friend says he'll scan the one he has - I'll send you the scan, too. Mine I can scan at the office after hours, but my scanner is down at home. I was looking for the one flier I thought I had and found another one (I know we've thrown two or three away in the early stages of this). This other one is " While Musgrove Should Hve Been Finding Solutions To Our State's Problems...." (large type, reversed on blue back ground) "- Increased Drug-Related Crime -Frivolous Lawsuits out of Control -Record Loss of Jobs -$700 Million Budget Hole (all on white "background arranged down a zigging red graph line with monkeyed photos of Musgrove's head. Underneath again in large (the largest on the page) bold type reversed against a blue background:'His Priority: Change Our Flag" The other side is all things they say are wrong with "Musgrove's Priiority: Change Our Flag" in blue bold italic type following each statement. He's blaming Musgrove for the jobs loss (which is ridiculous, right on the face of it) and also blaming the fiscal problems on Musgrove, when he was the only one of those dunderheads in Jackson who seemed to understand that we needed to be responsible with the budget, not go out on wild tears on money they hoped we'd get (when Ronnie already tried to set them straight about what the projected incoming money was going to be.). I have been so frustrated the last few years, at how irresponsible most of our legislators were being, how pigheaded in refusing to face facts on the budget. Not to mention acting like a bunch of squabbling school kids (on our money). I'm afraid I lay a lot of that at the feet of Amy Tuck - she had a lot of control over it as Lt. Gov, which is what Blackmon was trying to get across last night. I swear Tuck seemed to be working at cross purposes to Musgrove much of the time, almost as though she was trying cause him problems (even if at the expense of the taxpayers). But, then, I am biased on the subject of Tuck. Doesn't make me blind, though.
Sorry for not proofreading - I see a lot of goofs in there. I'm still rather ill, maybe I better get off for a while, and if I feel better, I'll be able to type tomorrow. (smile)
These mailers are really gross. Is someone out there getting ones from Democrats? I'd like to know what those say, too. Are they this disgusting? Republicans truly seem to think Mississippians are idiots.
The Clarion-Ledger tiptoed around Barbour's "Southern Strategy" today (and on a Saturday, no less. Wonder if it'll even be mentioned in the Sunday paper). I wonder why they don't mention that Barbour worked on that Nixon campaign as a field organizer? Isn't that a pertinent fact? And where is the reference to the current "Attacking our Flag" ads and mailers? Those are the most egregious examples of the current race-pandering. http://www.clarionledger.com/news/0311/01/m03b.html This is an interesting comment about the CofCC. Isn't he concerned that defiantly leaving his photo there implies that he agrees with the CofCC? It at least implies that he doesn't want to offend CofCC followers, and that is horrifying in itself. "The Web site, he said, would have to portray his views inaccurately for him to ask for the removal of his photograph. 'If somebody took my picture and put it on Web site or in a magazine or in a newspaper and said something that wasn't true, then I would object to it.' " Wow. Also, here's another column that ran in the C-L that is less sympathetic toward Barbour's tactics: http://www.clarionledger.com/news/0310/31/lrobert.html
The latest campaign flier from Marsha Barbour. This one is a 'letter' on 'personal stationary', written in someone's handwriting, and reproduced in blue ink, to look more personal. At least there are no hideous graphics. Anyway, it reads: "Hi, The warm response I received from my letter has been a real source of inspiration to Haley and me. After my letter went out, the Governor's ads on televions and radio became more negative than I ever imagined. it has been very hard emotionally on our family and disappointed me greatly. As Thad said on television, Mississippians deserve better than that. That is why Haley ran on the issues. The polling shows Haley slightly ahead, but the election will be extremely close. I ask you to vote for Haley and to urge your friends and family to vote for him too. Only a few votes in each neighborhood could change the result. The bigger the turnout, the better chance we have to win. Four years ago there was a small tourn out and the Legislature decided the Governor. Let's have a big turnout, so the voters will choose the Governor instead of the Legislature. I'm proud of Haley, and I know you will be too. Sincerely, Marsha Barbour" Okay - I agree with the need to vote. But Haley ran on the issues? Not in my reality. See above on this blog for examples.
On the issues?!? I guess if getting the Rebel flag-wavers stirred up is an issue, he is definitely running on an issue. Is it 1984? Anyone? You can't make it true just because you say it, can you? Oh, goodness, I hope Mississippians can see through this. Or at least enough of them. It's not like the doublespeak is likely to stop once he gets into office.
Oh, and yes, "lawsuit abuse" is apparently the issue of the century. Never mind that 13 percent more families in this country (with the most in Mississippi) are hungry than there were in 2000. Ever since I read that hunger story this morning (linked under NewsBlog), the phrase "What would ________ [your spiritual leader] Do?" keeps going through my head. Can it possibly be true that tort reform is the most important issue, or might hunger get front-page status? Sometimes I want to shake people and say, "Your apparent dedication to your spirituality is wonderful, but beware of fakes." Just because they claim to be speaking on behalf of your spiritual prophets doesn't mean that they would pass muster. People, it's about being good to other people; everything else -- including corporate profits -- pails in comparison! Greed (in any of its forms) is not going to get anybody to heaven; that's about the only thing I would say in public about religion with any amount of confidence. And, yes, you may call me a "bleeding heart" at will. I will look you in the eye and say, "thank you." I can't even imagine the alternative -- of having a heart that won't bleed over people, Americans, living in hunger. But you know what: I bet no reporter on the campaign trail raises their hand and asks a single candidate over the next three days just what they're going to do to ensure that fewer Mississippians are missing meals over the next four years. They all have something better to do during this horse race. And that's heart-breaking.
GAAAAA!!! I got canvassed today by Barbour supporters. Here's the story: As I was headed out to run some errands today, I bumped into 2 young people coming to my door, handing out Barbour campaign literature. As they started their spiel, I politely said, "thanks, but I won't be voting for Barbour." They looked slightly taken aback, so I said "but thanks for urging people to vote." When I asked them if they were going to vote, they said they weren't registered to vote in MS, since they were students at Oral Roberts University, in Tulsa, Oklahoma. I'm overwhelmed that the Barbour campaign has the resources to launch such an initiative. As I was out running errands in NE Jackson, I saw more of these kids (in blue t-shirts) in a few neighborhood. I'm wondering if they're hitting any of the neighborhoods SW of Fondren, or if it's just us, in the presumably republican part of town, that they're hitting up. GAAAA!!! Students from Oral Roberts!!!!! Outside agitators!!!!!!
Another comment on the kids out drumming up support for Barbour. One of my neighbors tried to engage them on a discussion of the issues, and they had no idea of Barbour's positions or of Musgroves. This just scares me. Kids, from out of state, campaigning for a candidate they know nothing about. The Barbour political machine must be far far larger and more frightening than I thought.
Kate, it doesn't get any larger than the Barbour Machine. The entire GOP machine is behind him; they need Mississippi to lead the way in protecting industry in lawsuits. I would also hazard to guess that we'll become a testing ground for vouchers of some kind during a Barbour administration -- not that they would make any sense here. But that hasn't stopped the, er, "school reform" crowd, yet.
Is this in the local papers? "This" being the Oral Roberts Univ students (and probably students from other schools) campaigning for Barbour. One of the saddest things that could happen if Barbour wins would be to undo the steps forward that Musgrove has made on the education front. Kate, I'm heartened by the fact that you have neighbors who tried to engage them in conversations about the issues.
Nia, so far I haven't seen anything about this in the local papers (and I have been looking). And, don't be too pleased with my neighbor - he'll argue with just about anyone, 'cause it's fun to argue (as we all know).
kate: GAAAA!!! Students from Oral Roberts!!!!! Outside agitators!!!!!!" Philip: Then again Tulsa, OK (home of the school) isn't exactly "Yankee Country". But on the other hand, I'll bet Calif. and NY Republicans would be serenated in Jackson, I'm sure. I hear Grand Rapids, Mich is just as "Bible Belt Republican" as anything in this part of the country - so I guess THEY don't count either. Not so much outside interference as it is people who don't "think like us".
Actually, Philip, it is the issue of "outside interference." It's the issue of the amount of money that's being poured into this campaign, and the fact that they brought students in from out of state to help out for a governor's election. I would not be so wierded out if it were local kids. In fact, I'd be happy. But this is just creepy to me.
Kate, I'm simply speaking from the p.o.v. of people I know well - not necessarily agreeing with them. My point was the hypocrisy of many (but not most) conservatives screaming about "outside interference", yet pulling in kids from Oklahoma to help with one of Miss's gubenatorial campaigns. In other words "we don't want any outside interference that runs contrary to our point of view. But if you are an outsider and your views match with ours, come on down!!". This isn't exclusive to Miss. , of course. You'd probably see the same thing in Ohio or Florida if a bunch of kids from Miss. started campaigning for Republican statewide candidates in those two states.
All, the CL wrote an article on the campaigning that's taking place in the hours leading up to the vote, here: http://www.clarionledger.com/news/0311/03/ma01.html Both sides are bringing in 'outside agitators': "In the last couple of days, hundreds of young Democratic activists have been bused into the state from Alabama and Louisiana to help get out the vote for Musgrove on Election Day and watch the polls to make sure no supporters are turned away. Barbour's supporters are trying to grow the ranks of the blue-shirted "72 Hour Task Force," composed of hundreds of young Republicans from Mississippi and out of state who will ring doorbells in GOP-leaning neighborhoods and to make sure their residents go to the polls." GAAA! I live in a GOP leaning neighborhood. Well, I guess I knew that already....
At least they vote!
Justice For Sale
Funny Math At The Fair
'So Be It': Ballot 'Trick' Fails
JFP Voter Guide 2003 - Statewide
Integrating Yazoo: Race and Change in Haley Barbour's Hometown
EDITOR'S NOTE: Journalism Can Beat the Hell Out of You, But It Must Go On
EDITOR'S NOTE: Goodbye, Bozo—My Friend Cedric Willis Gone Too Soon
Jackson Sues Siemens, Local Businessmen for 'Bait and Switch' Contract
EDITOR'S NOTE: Mississippi Male Leaders Again Pretend to Value 'Life'
Mayor Lumumba Endorses Former JPD Chief Lee Vance for Hinds Sheriff


text:
Botswana's first big budget movie now being shot on location
April 4 2010: Drawing inspiration from President Ian Khama's State of the Nation address last year, a Zimbabwean playwright and film producer, Tinashe Jonas, picked up on the president's hint and put into art the President's message on youth immorality.
Jonas has revealed that the upcoming movie, Monate, is about how young people tend to satisfy their insatiable appetite for alcohol, drugs and sexual desires at the expense of self development. He noted that the purpose of the movie is to encourage the nation to work together and help fight social ills and empower the youth with skills and knowledge on self reliance.
According to Jonas, who is the scriptwriter and producer, the movie is aimed at portraying some of the challenges that youth are faced with in their day to day lives and the dire consequences that come with the myopic decisions they make.
He said he had taken the burden upon himself to send the message to his fellow youth because he believes youth can decode the message with an open mind when fellow mates send out the message.
Monate will be one hour twenty minutes long and it will be 60 percent English and 40 percent Setswana with English subtitles.
Jonas revealed that Vula Vala Productions is intentionally working with new actors to help unearth new acting talent.
Monate will also depict some of the root causes of youth's immoral behavior. In the movie, there is a young girl called Lebo who is sexually abused by the stepfather at the age of 14.
Due to excessive psychological trauma that she goes through after the abuse, Lebo runs away from home and resorts to stripping, drug abuse and eventually becoming a commercial sex worker to earn a living.
Jonas said he believes this would help policymakers when they craft laws. Lorna Dintwe, who is Lebo in the movie, is a Limkokwing undergraduate student pursuing a degree in Interior Design.
Jonas said this is a milestone achievement for Botswana as a country and Batswana should take pride in it.
Monate marks the beginning of diversification in the art industry because music has been dominating the entertainment industry.
Jonas revealed that the big budget movie is expected to be out sometime in July and will be screened at the cinemas.
Jonas is appealing to the Government and the public for moral and financial support, saying the movie is entirely for Batswana in which Batswana are the actors.
Vula Vala productions is inviting youths who have talent in art to come and display their abilities and to get employment through arts and fulfill their dream.
Youths are advised that the services will be offered at no cost.
Jonas confirmed that the project has been helpful to many talented youths but had nowhere to showcase their talent.
He said about 200 youths have found employment through this project. As such, he pleaded, the government should intervene and sponsor more of these projects for they help in the fight against unemployment and also in poverty reduction.
Jonas confirmed that the soundtrack for the movie has already.
Botswana urged to upload budget data on World Bank portal
Botswana businesses focus on recruitment
Stanbic Botswana on expansionary path
Sunday Standard October 18 – 24
Online editor - 17th October 2020
Digital copy of Sunday Standard issue of October 18 - 24, 2020.
Gov't out-sourcing was not a response to 2011 strike-Makgalemele
Online editor - 20th July 2015
The introduction of out-sourcing of some operations in key government Ministries was not a response to the 2011 public sector strike, but a result...
French Ambassador preaches sustainable poverty eradication
French Ambassador to Botswana, Anne de la Bpache says Botswana should adopt a sustainable strategy of combating and eliminating poverty. Speaking in an interview...

redpajama_set_name: RedPajamaCommonCrawl


text:
19 Years Ago: Keith Urban's 'Golden Road' Is Certified Platinum
The Boot Staff Updated: August 27, 2021
Nineteen years ago today, on Aug. 27, 2003, Keith Urban had one million reasons to celebrate: His 2002 album Golden Road was certified platinum.
Golden Road, which was released in October of 2002, was produced by Urban, along with Dann Huff. Three of the singles from Golden Road became No. 1 hits, including "Somebody Like You," which became Urban's first gold-selling single. That particular song stayed at the top of the charts for six weeks.
Keith Urban Golden Road album cover
Capitol Nashville
Urban also recorded a cover of Radney Foster's "Raining on Sunday," which peaked in the Top 5, for Golden Road.
"He actually came up to me and said, 'Man, I'm cutting "Raining on Sunday," off of See What You Want to See, on my next record. I love that album,'" Foster recalls to SongFacts.com. "And, you know, I've heard that kind of loose talk before in this business. And I've learned not to take it too seriously."
The fourth and final single released from Golden Road, "You'll Think of Me," also earned gold status, as well as a Grammy Award for Best Male Country Vocal Performance. The song was a staple in the Aussie's setlist because of the way his fans responded to the tune.
""You'll Think of Me" is really high on the list, because there are a lot of jilted people out there," Urban explains to The Boot.
To date, Golden Road has sold more than 3 million copies, becoming the second best-selling album of Urban's career, behind his follow-up disc, Be Here, which was released in 2004 and has sold 4 million copies.
LOOK: Keith Urban + More Country Stars Then and Now
NEXT: Top 10 Keith Urban Songs
Source: 19 Years Ago: Keith Urban's 'Golden Road' Is Certified Platinum
Filed Under: Editor's Picks, Keith Urban
Nicole Kidman's Birthday Post for Keith Urban Includes a Spicy Smooch [Picture]
10 Things You Might Not Know About Keith Urban
Remember When Keith Urban Released His Debut Album?


text:
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.chrome.browser.tasks.tab_management;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.GradientDrawable;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.accessibility.AccessibilityEvent;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.PopupWindow;
import android.widget.RelativeLayout;
import android.widget.TextView;

import androidx.annotation.ColorInt;
import androidx.annotation.IntDef;
import androidx.annotation.VisibleForTesting;
import androidx.core.content.ContextCompat;
import androidx.core.graphics.drawable.DrawableCompat;
import androidx.core.widget.ImageViewCompat;

import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.base.Callback;
import org.chromium.chrome.tab_ui.R;
import org.chromium.components.browser_ui.widget.animation.Interpolators;
import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator;
import org.chromium.components.browser_ui.widget.scrim.ScrimProperties;
import org.chromium.ui.KeyboardVisibilityDelegate;
import org.chromium.ui.base.DeviceFormFactor;
import org.chromium.ui.base.ViewUtils;
import org.chromium.ui.interpolators.BakedBezierInterpolator;
import org.chromium.ui.modelutil.PropertyModel;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.HashMap;
import java.util.Map;

/**
 * Parent for TabGridDialog component.
 */
public class TabGridDialogView extends FrameLayout {
    private static final int DIALOG_ANIMATION_DURATION = 300;
    private static final int DIALOG_UNGROUP_ALPHA_ANIMATION_DURATION = 200;
    private static final int DIALOG_ALPHA_ANIMATION_DURATION = 150;
    private static final int CARD_FADE_ANIMATION_DURATION = 50;
    private static final int Y_TRANSLATE_DURATION_MS = 400;
    private static final int SCRIM_FADE_DURATION_MS = 450;

    private static Callback<RectF> sSourceRectCallbackForTesting;

    @IntDef({UngroupBarStatus.SHOW, UngroupBarStatus.HIDE, UngroupBarStatus.HOVERED})
    @Retention(RetentionPolicy.SOURCE)
    public @interface UngroupBarStatus {
        int SHOW = 0;
        int HIDE = 1;
        int HOVERED = 2;
        int NUM_ENTRIES = 3;
    }

    /**
     * An interface to listen to visibility related changes on this {@link TabGridDialogView}.
     */
    interface VisibilityListener {
        /**
         * Called when the animation to hide the tab grid dialog is finished.
         */
        void finishedHidingDialogView();
    }

    private final Context mContext;
    private final int mToolbarHeight;
    private final float mTabGridCardPadding;
    private View mBackgroundFrame;
    private View mAnimationCardView;
    private View mItemView;
    private View mUngroupBar;
    private ViewGroup mSnackBarContainer;
    private ViewGroup mParent;
    private TextView mUngroupBarTextView;
    private RelativeLayout mDialogContainerView;
    private PropertyModel mScrimPropertyModel;
    private ScrimCoordinator mScrimCoordinator;
    private FrameLayout.LayoutParams mContainerParams;
    private ViewTreeObserver.OnGlobalLayoutListener mParentGlobalLayoutListener;
    private VisibilityListener mVisibilityListener;
    private Animator mCurrentDialogAnimator;
    private Animator mCurrentUngroupBarAnimator;
    private AnimatorSet mBasicFadeInAnimation;
    private AnimatorSet mBasicFadeOutAnimation;
    private ObjectAnimator mYTranslateAnimation;
    private ObjectAnimator mUngroupBarShow;
    private ObjectAnimator mUngroupBarHide;
    private AnimatorSet mShowDialogAnimation;
    private AnimatorSet mHideDialogAnimation;
    private AnimatorListenerAdapter mShowDialogAnimationListener;
    private AnimatorListenerAdapter mHideDialogAnimationListener;
    private Map<View, Integer> mAccessibilityImportanceMap = new HashMap<>();
    private int mSideMargin;
    private int mTopMargin;
    private int mOrientation;
    private int mParentHeight;
    private int mParentWidth;
    private int mBackgroundDrawableColor;
    private int mUngroupBarStatus = UngroupBarStatus.HIDE;
    private int mUngroupBarBackgroundColor;
    private int mUngroupBarHoveredBackgroundColor;
    @ColorInt
    private int mUngroupBarTextColor;
    @ColorInt
    private int mUngroupBarHoveredTextColor;

    public TabGridDialogView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
        mTabGridCardPadding = TabUiThemeProvider.getTabGridCardMargin(mContext);
        mToolbarHeight =
                (int) mContext.getResources().getDimension(R.dimen.tab_group_toolbar_height);
        mBackgroundDrawableColor =
                ContextCompat.getColor(mContext, R.color.tab_grid_dialog_background_color);

        mUngroupBarTextColor =
                TabUiThemeProvider.getTabGridDialogUngroupBarTextColor(mContext, false);
        mUngroupBarHoveredTextColor =
                TabUiThemeProvider.getTabGridDialogUngroupBarHoveredTextColor(mContext, false);

        mUngroupBarBackgroundColor =
                TabUiThemeProvider.getTabGridDialogUngroupBarBackgroundColor(mContext, false);
        mUngroupBarHoveredBackgroundColor =
                TabUiThemeProvider.getTabGridDialogUngroupBarHoveredBackgroundColor(
                        mContext, false);
    }

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        mParent = (ViewGroup) getParent();
        mParentHeight = mParent.getHeight();
        mParentWidth = mParent.getWidth();
        mParentGlobalLayoutListener = () -> {
            // Skip updating the parent view size caused by keyboard showing.
            if (KeyboardVisibilityDelegate.getInstance().isKeyboardShowing(mContext, this)) return;
            mParentWidth = mParent.getWidth();
            mParentHeight = mParent.getHeight();
        };
        mParent.getViewTreeObserver().addOnGlobalLayoutListener(mParentGlobalLayoutListener);
        setVisibility(GONE);
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        if (mParent != null) {
            mParent.getViewTreeObserver().removeOnGlobalLayoutListener(mParentGlobalLayoutListener);
        }
    }

    @Override
    protected void onConfigurationChanged(Configuration newConfig) {
        updateDialogWithOrientation(newConfig.orientation);
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        mContainerParams = new FrameLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        mDialogContainerView = findViewById(R.id.dialog_container_view);
        mDialogContainerView.setLayoutParams(mContainerParams);
        mUngroupBar = findViewById(R.id.dialog_ungroup_bar);
        mUngroupBarTextView = mUngroupBar.findViewById(R.id.dialog_ungroup_bar_text);
        mBackgroundFrame = findViewById(R.id.dialog_frame);
        mBackgroundFrame.setLayoutParams(mContainerParams);
        mAnimationCardView = findViewById(R.id.dialog_animation_card_view);
        mSnackBarContainer = findViewById(R.id.dialog_snack_bar_container_view);
        updateDialogWithOrientation(mContext.getResources().getConfiguration().orientation);

        prepareAnimation();
        mDialogContainerView.setClipToOutline(true);
    }

    private void prepareAnimation() {
        mShowDialogAnimation = new AnimatorSet();
        mHideDialogAnimation = new AnimatorSet();
        mBasicFadeInAnimation = new AnimatorSet();
        ObjectAnimator dialogFadeInAnimator =
                ObjectAnimator.ofFloat(mDialogContainerView, View.ALPHA, 0f, 1f);
        mBasicFadeInAnimation.play(dialogFadeInAnimator);
        mBasicFadeInAnimation.setInterpolator(BakedBezierInterpolator.FADE_IN_CURVE);
        mBasicFadeInAnimation.setDuration(DIALOG_ANIMATION_DURATION);

        mBasicFadeOutAnimation = new AnimatorSet();
        ObjectAnimator dialogFadeOutAnimator =
                ObjectAnimator.ofFloat(mDialogContainerView, View.ALPHA, 1f, 0f);
        mBasicFadeOutAnimation.play(dialogFadeOutAnimator);
        mBasicFadeOutAnimation.setInterpolator(BakedBezierInterpolator.FADE_OUT_CURVE);
        mBasicFadeOutAnimation.setDuration(DIALOG_ANIMATION_DURATION);
        mBasicFadeOutAnimation.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                updateItemViewAlpha();
            }
        });

        final int screenHeightPx = ViewUtils.dpToPx(
                getContext(), getContext().getResources().getConfiguration().screenHeightDp);
        final float mDialogInitYPos = mDialogContainerView.getY();
        mYTranslateAnimation = ObjectAnimator.ofFloat(
                mDialogContainerView, View.TRANSLATION_Y, mDialogInitYPos, screenHeightPx);
        mYTranslateAnimation.setInterpolator(Interpolators.EMPHASIZED_ACCELERATE);
        mYTranslateAnimation.setDuration(Y_TRANSLATE_DURATION_MS);
        mYTranslateAnimation.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                updateItemViewAlpha();
                mDialogContainerView.setY(mDialogInitYPos);
            }
        });

        mShowDialogAnimationListener = new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                mCurrentDialogAnimator = null;
                mDialogContainerView.requestFocus();
                mDialogContainerView.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
                // TODO(crbug.com/1101561): Move clear/restore accessibility importance logic to
                // ScrimView so that it can be shared by all components using ScrimView.
                clearBackgroundViewAccessibilityImportance();
            }
        };
        mHideDialogAnimationListener = new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                setVisibility(View.GONE);
                mCurrentDialogAnimator = null;
                mDialogContainerView.clearFocus();
                restoreBackgroundViewAccessibilityImportance();
                if (mVisibilityListener != null) {
                    mVisibilityListener.finishedHidingDialogView();
                }
            }
        };

        mUngroupBarShow = ObjectAnimator.ofFloat(mUngroupBar, View.ALPHA, 0f, 1f);
        mUngroupBarShow.setDuration(DIALOG_UNGROUP_ALPHA_ANIMATION_DURATION);
        mUngroupBarShow.setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN_INTERPOLATOR);
        mUngroupBarShow.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationStart(Animator animation) {
                if (mCurrentUngroupBarAnimator != null) {
                    mCurrentUngroupBarAnimator.end();
                }
                mCurrentUngroupBarAnimator = mUngroupBarShow;
                mUngroupBar.setVisibility(View.VISIBLE);
                mUngroupBar.setAlpha(0f);
            }

            @Override
            public void onAnimationEnd(Animator animation) {
                mCurrentUngroupBarAnimator = null;
            }
        });

        mUngroupBarHide = ObjectAnimator.ofFloat(mUngroupBar, View.ALPHA, 1f, 0f);
        mUngroupBarHide.setDuration(DIALOG_UNGROUP_ALPHA_ANIMATION_DURATION);
        mUngroupBarHide.setInterpolator(Interpolators.FAST_OUT_LINEAR_IN_INTERPOLATOR);
        mUngroupBarHide.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationStart(Animator animation) {
                if (mCurrentUngroupBarAnimator != null) {
                    mCurrentUngroupBarAnimator.end();
                }
                mCurrentUngroupBarAnimator = mUngroupBarHide;
            }

            @Override
            public void onAnimationEnd(Animator animation) {
                mUngroupBar.setVisibility(View.INVISIBLE);
                mCurrentUngroupBarAnimator = null;
            }
        });
    }

    private void updateItemViewAlpha() {
        // Restore the original card.
        if (mItemView == null) return;
        mItemView.setAlpha(1f);
    }

    private void clearBackgroundViewAccessibilityImportance() {
        assert mAccessibilityImportanceMap.size() == 0;

        ViewGroup parent = (ViewGroup) getParent();
        for (int i = 0; i < parent.getChildCount(); i++) {
            View view = parent.getChildAt(i);
            if (view == TabGridDialogView.this) {
                continue;
            }
            mAccessibilityImportanceMap.put(view, view.getImportantForAccessibility());
            view.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
        }
    }

    private void restoreBackgroundViewAccessibilityImportance() {
        ViewGroup parent = (ViewGroup) getParent();
        for (int i = 0; i < parent.getChildCount(); i++) {
            View view = parent.getChildAt(i);
            if (view == TabGridDialogView.this) {
                continue;
            }
            assert mAccessibilityImportanceMap.containsKey(view);
            Integer importance = mAccessibilityImportanceMap.get(view);
            view.setImportantForAccessibility(
                    importance == null ? IMPORTANT_FOR_ACCESSIBILITY_AUTO : importance);
        }
        mAccessibilityImportanceMap.clear();
    }

    void setVisibilityListener(VisibilityListener visibilityListener) {
        mVisibilityListener = visibilityListener;
    }

    void setupDialogAnimation(View sourceView) {
        // In case where user jumps to a new page from dialog, clean existing animations in
        // mHideDialogAnimation and play basic fade out instead of zooming back to corresponding tab
        // grid card.
        if (sourceView == null) {
            mShowDialogAnimation = new AnimatorSet();
            mShowDialogAnimation.play(mBasicFadeInAnimation);
            mShowDialogAnimation.removeAllListeners();
            mShowDialogAnimation.addListener(mShowDialogAnimationListener);

            mHideDialogAnimation = new AnimatorSet();
            Animator hideAnimator = TabUiFeatureUtilities.isTabletTabGroupsEnabled(getContext())
                    ? mYTranslateAnimation
                    : mBasicFadeOutAnimation;
            mHideDialogAnimation.play(hideAnimator);
            mHideDialogAnimation.removeAllListeners();
            mHideDialogAnimation.addListener(mHideDialogAnimationListener);
            return;
        }

        mItemView = sourceView;
        Rect rect = new Rect();
        mItemView.getGlobalVisibleRect(rect);
        // Offset by CompositeViewHolder top offset.
        Rect parentRect = new Rect();
        mParent.getGlobalVisibleRect(parentRect);
        rect.offset(0, -parentRect.top);
        // Setup a dummy animation card that looks the same as the original tab grid card for
        // animation.
        updateAnimationCardView(mItemView);

        // Calculate dialog size.
        int dialogHeight = mParentHeight - 2 * mTopMargin;
        int dialogWidth = mParentWidth - 2 * mSideMargin;

        // Calculate position and size info about the original tab grid card.
        float sourceLeft = rect.left + mTabGridCardPadding;
        float sourceTop = rect.top + mTabGridCardPadding;
        float sourceHeight = rect.height() - 2 * mTabGridCardPadding;
        float sourceWidth = rect.width() - 2 * mTabGridCardPadding;
        if (sSourceRectCallbackForTesting != null) {
            sSourceRectCallbackForTesting.onResult(new RectF(
                    sourceLeft, sourceTop, sourceLeft + sourceWidth, sourceTop + sourceHeight));
        }

        // Setup animation position info and scale ratio of the background frame.
        float frameInitYPosition = -(dialogHeight / 2 + mTopMargin - sourceHeight / 2 - sourceTop);
        float frameInitXPosition = -(dialogWidth / 2 + mSideMargin - sourceWidth / 2 - sourceLeft);
        float frameScaleY = sourceHeight / dialogHeight;
        float frameScaleX = sourceWidth / dialogWidth;

        // Setup scale ratio of card and dialog. Height and Width for both dialog and card scale at
        // the same rate during scaling animations.
        float cardScale = mOrientation == Configuration.ORIENTATION_PORTRAIT
                ? (float) dialogWidth / rect.width()
                : (float) dialogHeight / rect.height();
        float dialogScale = frameScaleX;

        // Setup animation position info of the animation card.
        float cardScaledYPosition = mTopMargin + ((cardScale - 1f) / 2) * sourceHeight;
        float cardScaledXPosition = mSideMargin + ((cardScale - 1f) / 2) * sourceWidth;
        float cardInitYPosition = sourceTop - mTabGridCardPadding;
        float cardInitXPosition = sourceLeft - mTabGridCardPadding;

        // Setup animation position info of the dialog.
        float dialogInitYPosition =
                frameInitYPosition - (sourceHeight - (dialogHeight * dialogScale)) / 2f;
        float dialogInitXPosition = frameInitXPosition;

        // In the first half of the dialog showing animation, the animation card scales up and moves
        // towards where the dialog should be.
        final ObjectAnimator cardZoomOutMoveYAnimator = ObjectAnimator.ofFloat(
                mAnimationCardView, View.TRANSLATION_Y, cardInitYPosition, cardScaledYPosition);
        final ObjectAnimator cardZoomOutMoveXAnimator = ObjectAnimator.ofFloat(
                mAnimationCardView, View.TRANSLATION_X, cardInitXPosition, cardScaledXPosition);
        final ObjectAnimator cardZoomOutScaleXAnimator =
                ObjectAnimator.ofFloat(mAnimationCardView, View.SCALE_X, 1f, cardScale);
        final ObjectAnimator cardZoomOutScaleYAnimator =
                ObjectAnimator.ofFloat(mAnimationCardView, View.SCALE_Y, 1f, cardScale);

        AnimatorSet cardZoomOutAnimatorSet = new AnimatorSet();
        cardZoomOutAnimatorSet.setDuration(DIALOG_ANIMATION_DURATION);
        cardZoomOutAnimatorSet.setInterpolator(Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR);
        cardZoomOutAnimatorSet.play(cardZoomOutMoveYAnimator)
                .with(cardZoomOutMoveXAnimator)
                .with(cardZoomOutScaleYAnimator)
                .with(cardZoomOutScaleXAnimator);

        // In the first half of the dialog showing animation, the animation card fades out as it
        // moves and scales up.
        final ObjectAnimator cardZoomOutAlphaAnimator =
                ObjectAnimator.ofFloat(mAnimationCardView, View.ALPHA, 1f, 0f);
        cardZoomOutAlphaAnimator.setDuration(DIALOG_ALPHA_ANIMATION_DURATION);
        cardZoomOutAlphaAnimator.setInterpolator(Interpolators.LINEAR_INTERPOLATOR);

        // In the second half of the dialog showing animation, the dialog zooms out from where the
        // card stops at the end of the first half and moves towards where the dialog should be.
        final ObjectAnimator dialogZoomOutMoveYAnimator = ObjectAnimator.ofFloat(
                mDialogContainerView, View.TRANSLATION_Y, dialogInitYPosition, 0f);
        final ObjectAnimator dialogZoomOutMoveXAnimator = ObjectAnimator.ofFloat(
                mDialogContainerView, View.TRANSLATION_X, dialogInitXPosition, 0f);
        final ObjectAnimator dialogZoomOutScaleYAnimator =
                ObjectAnimator.ofFloat(mDialogContainerView, View.SCALE_Y, dialogScale, 1f);
        final ObjectAnimator dialogZoomOutScaleXAnimator =
                ObjectAnimator.ofFloat(mDialogContainerView, View.SCALE_X, dialogScale, 1f);

        AnimatorSet dialogZoomOutAnimatorSet = new AnimatorSet();
        dialogZoomOutAnimatorSet.setDuration(DIALOG_ANIMATION_DURATION);
        dialogZoomOutAnimatorSet.setInterpolator(Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR);
        dialogZoomOutAnimatorSet.play(dialogZoomOutMoveYAnimator)
                .with(dialogZoomOutMoveXAnimator)
                .with(dialogZoomOutScaleYAnimator)
                .with(dialogZoomOutScaleXAnimator);

        // In the second half of the dialog showing animation, the dialog fades in while it moves
        // and scales up.
        final ObjectAnimator dialogZoomOutAlphaAnimator =
                ObjectAnimator.ofFloat(mDialogContainerView, View.ALPHA, 0f, 1f);
        dialogZoomOutAlphaAnimator.setDuration(DIALOG_ALPHA_ANIMATION_DURATION);
        dialogZoomOutAlphaAnimator.setStartDelay(DIALOG_ALPHA_ANIMATION_DURATION);
        dialogZoomOutAlphaAnimator.setInterpolator(Interpolators.LINEAR_INTERPOLATOR);

        // During the whole dialog showing animation, the frame background scales up and moves so
        // that it looks like the card zooms out and becomes the dialog.
        final ObjectAnimator frameZoomOutMoveYAnimator = ObjectAnimator.ofFloat(
                mBackgroundFrame, View.TRANSLATION_Y, frameInitYPosition, 0f);
        final ObjectAnimator frameZoomOutMoveXAnimator = ObjectAnimator.ofFloat(
                mBackgroundFrame, View.TRANSLATION_X, frameInitXPosition, 0f);
        final ObjectAnimator frameZoomOutScaleYAnimator =
                ObjectAnimator.ofFloat(mBackgroundFrame, View.SCALE_Y, frameScaleY, 1f);
        final ObjectAnimator frameZoomOutScaleXAnimator =
                ObjectAnimator.ofFloat(mBackgroundFrame, View.SCALE_X, frameScaleX, 1f);

        AnimatorSet frameZoomOutAnimatorSet = new AnimatorSet();
        frameZoomOutAnimatorSet.setDuration(DIALOG_ANIMATION_DURATION);
        frameZoomOutAnimatorSet.setInterpolator(Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR);
        frameZoomOutAnimatorSet.play(frameZoomOutMoveYAnimator)
                .with(frameZoomOutMoveXAnimator)
                .with(frameZoomOutScaleYAnimator)
                .with(frameZoomOutScaleXAnimator);

        // After the dialog showing animation starts, the original card in grid tab switcher fades
        // out.
        final ObjectAnimator tabFadeOutAnimator =
                ObjectAnimator.ofFloat(mItemView, View.ALPHA, 1f, 0f);
        tabFadeOutAnimator.setDuration(CARD_FADE_ANIMATION_DURATION);

        dialogZoomOutAnimatorSet.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationStart(Animator animation) {
                // At the beginning of the first half of the showing animation, the white frame and
                // the animation card should be above the the dialog view, and their alpha should be
                // set to 1.
                mBackgroundFrame.bringToFront();
                mAnimationCardView.bringToFront();
                mDialogContainerView.setAlpha(0f);
                mBackgroundFrame.setAlpha(1f);
                mAnimationCardView.setAlpha(1f);
            }

            @Override
            public void onAnimationEnd(Animator animation) {
                // At the end of the showing animation, reset the alpha of animation related views
                // to 0.
                mBackgroundFrame.setAlpha(0f);
                mAnimationCardView.setAlpha(0f);
            }
        });

        dialogZoomOutAlphaAnimator.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationStart(Animator animation) {
                // At the beginning of the second half of the showing animation, the dialog should
                // be above the white frame and the animation card.
                mDialogContainerView.bringToFront();
            }
        });

        // Setup the dialog showing animation.
        mShowDialogAnimation = new AnimatorSet();
        mShowDialogAnimation.play(cardZoomOutAnimatorSet)
                .with(cardZoomOutAlphaAnimator)
                .with(frameZoomOutAnimatorSet)
                .with(dialogZoomOutAnimatorSet)
                .with(dialogZoomOutAlphaAnimator)
                .with(tabFadeOutAnimator);
        mShowDialogAnimation.addListener(mShowDialogAnimationListener);

        // In the first half of the dialog hiding animation, the dialog scales down and moves
        // towards where the tab grid card should be.
        final ObjectAnimator dialogZoomInMoveYAnimator = ObjectAnimator.ofFloat(
                mDialogContainerView, View.TRANSLATION_Y, 0f, dialogInitYPosition);
        final ObjectAnimator dialogZoomInMoveXAnimator = ObjectAnimator.ofFloat(
                mDialogContainerView, View.TRANSLATION_X, 0f, dialogInitXPosition);
        final ObjectAnimator dialogZoomInScaleYAnimator =
                ObjectAnimator.ofFloat(mDialogContainerView, View.SCALE_Y, 1f, dialogScale);
        final ObjectAnimator dialogZoomInScaleXAnimator =
                ObjectAnimator.ofFloat(mDialogContainerView, View.SCALE_X, 1f, dialogScale);

        AnimatorSet dialogZoomInAnimatorSet = new AnimatorSet();
        dialogZoomInAnimatorSet.play(dialogZoomInMoveYAnimator)
                .with(dialogZoomInMoveXAnimator)
                .with(dialogZoomInScaleYAnimator)
                .with(dialogZoomInScaleXAnimator);
        dialogZoomInAnimatorSet.setDuration(DIALOG_ANIMATION_DURATION);
        dialogZoomInAnimatorSet.setInterpolator(Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR);

        dialogZoomInAnimatorSet.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                mDialogContainerView.setTranslationX(0f);
                mDialogContainerView.setTranslationY(0f);
                mDialogContainerView.setScaleX(1f);
                mDialogContainerView.setScaleY(1f);
            }
        });

        // In the first half of the dialog hiding animation, the dialog fades out while it moves and
        // scales down.
        final ObjectAnimator dialogZoomInAlphaAnimator =
                ObjectAnimator.ofFloat(mDialogContainerView, View.ALPHA, 1f, 0f);
        dialogZoomInAlphaAnimator.setDuration(DIALOG_ALPHA_ANIMATION_DURATION);
        dialogZoomInAlphaAnimator.setInterpolator(Interpolators.LINEAR_INTERPOLATOR);

        // In the second half of the dialog hiding animation, the animation card zooms in from where
        // the dialog stops at the end of the first half and moves towards where the card should be.
        final ObjectAnimator cardZoomInMoveYAnimator = ObjectAnimator.ofFloat(
                mAnimationCardView, View.TRANSLATION_Y, cardScaledYPosition, cardInitYPosition);
        final ObjectAnimator cardZoomInMoveXAnimator = ObjectAnimator.ofFloat(
                mAnimationCardView, View.TRANSLATION_X, cardScaledXPosition, cardInitXPosition);
        final ObjectAnimator cardZoomInScaleXAnimator =
                ObjectAnimator.ofFloat(mAnimationCardView, View.SCALE_X, cardScale, 1f);
        final ObjectAnimator cardZoomInScaleYAnimator =
                ObjectAnimator.ofFloat(mAnimationCardView, View.SCALE_Y, cardScale, 1f);

        AnimatorSet cardZoomInAnimatorSet = new AnimatorSet();
        cardZoomInAnimatorSet.play(cardZoomInMoveYAnimator)
                .with(cardZoomInMoveXAnimator)
                .with(cardZoomInScaleXAnimator)
                .with(cardZoomInScaleYAnimator);
        cardZoomInAnimatorSet.setDuration(DIALOG_ANIMATION_DURATION);
        cardZoomInAnimatorSet.setInterpolator(Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR);

        // In the second half of the dialog hiding animation, the tab grid card fades in while it
        // scales down and moves.
        final ObjectAnimator cardZoomInAlphaAnimator =
                ObjectAnimator.ofFloat(mAnimationCardView, View.ALPHA, 0f, 1f);
        cardZoomInAlphaAnimator.setDuration(DIALOG_ALPHA_ANIMATION_DURATION);
        cardZoomInAlphaAnimator.setStartDelay(DIALOG_ALPHA_ANIMATION_DURATION);
        cardZoomInAlphaAnimator.setInterpolator(Interpolators.LINEAR_INTERPOLATOR);

        cardZoomInAlphaAnimator.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationStart(Animator animation) {
                // At the beginning of the second half of the hiding animation, the white frame and
                // the animation card should be above the the dialog view.
                mBackgroundFrame.bringToFront();
                mAnimationCardView.bringToFront();
            }

            @Override
            public void onAnimationEnd(Animator animation) {
                // At the end of the hiding animation, reset the alpha of animation related views to
                // 0.
                mBackgroundFrame.setAlpha(0f);
                mAnimationCardView.setAlpha(0f);
            }
        });

        // During the whole dialog hiding animation, the frame background scales down and moves so
        // that it looks like the dialog zooms in and becomes the card.
        final ObjectAnimator frameZoomInMoveYAnimator = ObjectAnimator.ofFloat(
                mBackgroundFrame, View.TRANSLATION_Y, 0f, frameInitYPosition);
        final ObjectAnimator frameZoomInMoveXAnimator = ObjectAnimator.ofFloat(
                mBackgroundFrame, View.TRANSLATION_X, 0f, frameInitXPosition);
        final ObjectAnimator frameZoomInScaleYAnimator =
                ObjectAnimator.ofFloat(mBackgroundFrame, View.SCALE_Y, 1f, frameScaleY);
        final ObjectAnimator frameZoomInScaleXAnimator =
                ObjectAnimator.ofFloat(mBackgroundFrame, View.SCALE_X, 1f, frameScaleX);

        AnimatorSet frameZoomInAnimatorSet = new AnimatorSet();
        frameZoomInAnimatorSet.play(frameZoomInMoveYAnimator)
                .with(frameZoomInMoveXAnimator)
                .with(frameZoomInScaleYAnimator)
                .with(frameZoomInScaleXAnimator);
        frameZoomInAnimatorSet.setDuration(DIALOG_ANIMATION_DURATION);
        frameZoomInAnimatorSet.setInterpolator(Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR);

        frameZoomInAnimatorSet.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationStart(Animator animation) {
                // At the beginning of the hiding animation, the alpha of white frame needs to be
                // restored to 1.
                mBackgroundFrame.setAlpha(1f);
            }
        });

        // At the end of the dialog hiding animation, the original tab grid card fades in.
        final ObjectAnimator tabFadeInAnimator =
                ObjectAnimator.ofFloat(mItemView, View.ALPHA, 0f, 1f);
        tabFadeInAnimator.setDuration(CARD_FADE_ANIMATION_DURATION);
        tabFadeInAnimator.setStartDelay(DIALOG_ANIMATION_DURATION - CARD_FADE_ANIMATION_DURATION);

        // Setup the dialog hiding animation.
        mHideDialogAnimation = new AnimatorSet();
        mHideDialogAnimation.play(dialogZoomInAnimatorSet)
                .with(dialogZoomInAlphaAnimator)
                .with(frameZoomInAnimatorSet)
                .with(cardZoomInAnimatorSet)
                .with(cardZoomInAlphaAnimator)
                .with(tabFadeInAnimator);
        mHideDialogAnimation.addListener(mHideDialogAnimationListener);
    }

    @VisibleForTesting
    void updateDialogWithOrientation(int orientation) {
        if (orientation == Configuration.ORIENTATION_PORTRAIT) {
            mSideMargin =
                    (int) mContext.getResources().getDimension(R.dimen.tab_grid_dialog_side_margin);
            mTopMargin =
                    (int) mContext.getResources().getDimension(R.dimen.tab_grid_dialog_top_margin);
        } else {
            mSideMargin =
                    (int) mContext.getResources().getDimension(R.dimen.tab_grid_dialog_top_margin);
            mTopMargin =
                    (int) mContext.getResources().getDimension(R.dimen.tab_grid_dialog_side_margin);
        }
        mContainerParams.setMargins(mSideMargin, mTopMargin, mSideMargin, mTopMargin);
        mOrientation = orientation;
    }

    private void updateAnimationCardView(View view) {
        // Update the dummy animation card view with the actual item view from grid tab switcher
        // recyclerView.
        FrameLayout.LayoutParams params =
                (FrameLayout.LayoutParams) mAnimationCardView.getLayoutParams();
        params.width = view.getWidth();
        params.height = view.getHeight();
        if (view.findViewById(R.id.tab_title) == null) return;

        mAnimationCardView.findViewById(R.id.card_view)
                .setBackground(view.findViewById(R.id.card_view).getBackground());

        ImageView sourceCardFavicon = view.findViewById(R.id.tab_favicon);
        ImageView animationCardFavicon = mAnimationCardView.findViewById(R.id.tab_favicon);
        if (sourceCardFavicon.getDrawable() != null) {
            int padding = (int) TabUiThemeProvider.getTabCardTopFaviconPadding(mContext);
            animationCardFavicon.setPadding(padding, padding, padding, padding);
            animationCardFavicon.setImageDrawable(sourceCardFavicon.getDrawable());
        } else {
            animationCardFavicon.setImageDrawable(null);
        }

        ((TextView) (mAnimationCardView.findViewById(R.id.tab_title)))
                .setText(((TextView) (view.findViewById(R.id.tab_title))).getText());
        ApiCompatibilityUtils.setTextAppearance(
                (TextView) (mAnimationCardView.findViewById(R.id.tab_title)),
                R.style.TextAppearance_TextMediumThick_Primary);
        ((TextView) (mAnimationCardView.findViewById(R.id.tab_title)))
                .setTextColor(((TextView) (view.findViewById(R.id.tab_title))).getTextColors());

        ((ImageView) (mAnimationCardView.findViewById(R.id.tab_thumbnail)))
                .setImageDrawable(
                        ((ImageView) (view.findViewById(R.id.tab_thumbnail))).getDrawable());

        ImageView actionButton = mAnimationCardView.findViewById(R.id.action_button);
        actionButton.setImageDrawable(
                ((ImageView) (view.findViewById(R.id.action_button))).getDrawable());
        ApiCompatibilityUtils.setImageTintList(actionButton,
                ImageViewCompat.getImageTintList((view.findViewById(R.id.action_button))));

        View dividerView = mAnimationCardView.findViewById(R.id.divider_view);
        dividerView.setBackgroundColor(
                ((ColorDrawable) view.findViewById(R.id.divider_view).getBackground()).getColor());

        mAnimationCardView.findViewById(R.id.background_view).setBackground(null);
    }

    /**
     * Setup the {@link PropertyModel} used to show scrim view.
     *
     * @param scrimClickRunnable The {@link Runnable} that runs when scrim view is clicked.
     */
    void setScrimClickRunnable(Runnable scrimClickRunnable) {
        mScrimPropertyModel = new PropertyModel.Builder(ScrimProperties.ALL_KEYS)
                                      .with(ScrimProperties.ANCHOR_VIEW, mDialogContainerView)
                                      .with(ScrimProperties.SHOW_IN_FRONT_OF_ANCHOR_VIEW, false)
                                      .with(ScrimProperties.AFFECTS_STATUS_BAR, true)
                                      .with(ScrimProperties.TOP_MARGIN, 0)
                                      .with(ScrimProperties.CLICK_DELEGATE, scrimClickRunnable)
                                      .with(ScrimProperties.AFFECTS_NAVIGATION_BAR, true)
                                      .build();
    }

    void setupScrimCoordinator(ScrimCoordinator scrimCoordinator) {
        mScrimCoordinator = scrimCoordinator;
    }

    /**
     * Reset the dialog content with {@code toolbarView} and {@code recyclerView}.
     *
     * @param toolbarView The toolbarview to be added to dialog.
     * @param recyclerView The recyclerview to be added to dialog.
     */
    void resetDialog(View toolbarView, View recyclerView) {
        mDialogContainerView.removeAllViews();
        mDialogContainerView.addView(toolbarView);
        mDialogContainerView.addView(recyclerView);
        mDialogContainerView.addView(mUngroupBar);
        mDialogContainerView.addView(mSnackBarContainer);
        RelativeLayout.LayoutParams params =
                (RelativeLayout.LayoutParams) recyclerView.getLayoutParams();
        params.setMargins(0, mToolbarHeight, 0, 0);
        recyclerView.setVisibility(View.VISIBLE);
    }

    /**
     * Show {@link PopupWindow} for dialog with animation.
     */
    void showDialog() {
        if (mCurrentDialogAnimator != null && mCurrentDialogAnimator != mShowDialogAnimation) {
            mCurrentDialogAnimator.end();
        }
        mCurrentDialogAnimator = mShowDialogAnimation;
        assert mScrimCoordinator != null && mScrimPropertyModel != null;
        mScrimCoordinator.showScrim(mScrimPropertyModel);
        setVisibility(View.VISIBLE);
        mShowDialogAnimation.start();
    }

    /**
     * Hide {@link PopupWindow} for dialog with animation.
     */
    void hideDialog() {
        // Skip the hideDialog call caused by initializing the dialog visibility as false.
        if (getVisibility() != VISIBLE) return;
        assert mScrimCoordinator != null && mScrimPropertyModel != null;
        if (mCurrentDialogAnimator != null && mCurrentDialogAnimator != mHideDialogAnimation) {
            mCurrentDialogAnimator.end();
        }
        mCurrentDialogAnimator = mHideDialogAnimation;
        if (mScrimCoordinator.isShowingScrim()) {
            if (DeviceFormFactor.isNonMultiDisplayContextOnTablet(mContext)) {
                mScrimCoordinator.hideScrim(true, SCRIM_FADE_DURATION_MS);
            } else {
                mScrimCoordinator.hideScrim(true);
            }
        }
        mHideDialogAnimation.start();
    }

    /**
     * Update the ungroup bar based on {@code status}.
     *
     * @param status The status in {@link TabGridDialogView.UngroupBarStatus} that the ungroup bar
     *         should be updated to.
     */
    void updateUngroupBar(int status) {
        if (status == mUngroupBarStatus) return;
        switch (status) {
            case UngroupBarStatus.SHOW:
                updateUngroupBarTextView(false);
                if (mUngroupBarStatus == UngroupBarStatus.HIDE) {
                    mUngroupBarShow.start();
                }
                break;
            case UngroupBarStatus.HIDE:
                mUngroupBarHide.start();
                break;
            case UngroupBarStatus.HOVERED:
                updateUngroupBarTextView(true);
                if (mUngroupBarStatus == UngroupBarStatus.HIDE) {
                    mUngroupBarShow.start();
                }
                break;
            default:
                assert false;
        }
        mUngroupBarStatus = status;
    }

    private void updateUngroupBarTextView(boolean isHovered) {
        assert mUngroupBarTextView.getBackground() instanceof GradientDrawable;
        mUngroupBar.bringToFront();
        GradientDrawable background = (GradientDrawable) mUngroupBarTextView.getBackground();
        background.setColor(
                isHovered ? mUngroupBarHoveredBackgroundColor : mUngroupBarBackgroundColor);
        mUngroupBarTextView.setTextColor(
                isHovered ? mUngroupBarHoveredTextColor : mUngroupBarTextColor);
    }

    /**
     * Update the dialog container background color.
     * @param backgroundColor The new background color to use.
     */
    void updateDialogContainerBackgroundColor(int backgroundColor) {
        mBackgroundDrawableColor = backgroundColor;
        DrawableCompat.setTint(mDialogContainerView.getBackground(), backgroundColor);
        DrawableCompat.setTint(mBackgroundFrame.getBackground(), backgroundColor);
    }

    /**
     * Update the ungroup bar background color.
     * @param colorInt The new background color to use when ungroup bar is visible.
     */
    void updateUngroupBarBackgroundColor(int colorInt) {
        mUngroupBarBackgroundColor = colorInt;
    }

    /**
     * Update the ungroup bar background color when the ungroup bar is hovered.
     * @param colorInt The new background color to use when ungroup bar is visible and hovered.
     */
    void updateUngroupBarHoveredBackgroundColor(int colorInt) {
        mUngroupBarHoveredBackgroundColor = colorInt;
    }

    /**
     * Update the ungroup bar text color when the ungroup bar is visible but not hovered.
     * @param colorInt The new text color to use when ungroup bar is visible.
     */
    void updateUngroupBarTextColor(int colorInt) {
        mUngroupBarTextColor = colorInt;
    }

    /**
     * Update the ungroup bar text color when the ungroup bar is hovered.
     * @param colorInt The new text color to use when ungroup bar is visible and hovered.
     */
    void updateUngroupBarHoveredTextColor(int colorInt) {
        mUngroupBarHoveredTextColor = colorInt;
    }

    /**
     * Return the container view for undo closure snack bar.
     */
    ViewGroup getSnackBarContainer() {
        return mSnackBarContainer;
    }

    @VisibleForTesting
    Animator getCurrentDialogAnimatorForTesting() {
        return mCurrentDialogAnimator;
    }

    @VisibleForTesting
    Animator getCurrentUngroupBarAnimatorForTesting() {
        return mCurrentUngroupBarAnimator;
    }

    @VisibleForTesting
    int getUngroupBarStatusForTesting() {
        return mUngroupBarStatus;
    }

    @VisibleForTesting
    AnimatorSet getShowDialogAnimationForTesting() {
        return mShowDialogAnimation;
    }

    @VisibleForTesting
    int getBackgroundColorForTesting() {
        return mBackgroundDrawableColor;
    }

    @VisibleForTesting
    int getUngroupBarBackgroundColorForTesting() {
        return mUngroupBarBackgroundColor;
    }

    @VisibleForTesting
    int getUngroupBarHoveredBackgroundColorForTesting() {
        return mUngroupBarHoveredBackgroundColor;
    }

    @VisibleForTesting
    int getUngroupBarTextColorForTesting() {
        return mUngroupBarTextColor;
    }

    @VisibleForTesting
    int getUngroupBarHoveredTextColorForTesting() {
        return mUngroupBarHoveredTextColor;
    }

    @VisibleForTesting
    static void setSourceRectCallbackForTesting(Callback<RectF> callback) {
        sSourceRectCallbackForTesting = callback;
    }

    @VisibleForTesting
    ScrimCoordinator getScrimCoordinatorForTesting() {
        return mScrimCoordinator;
    }

    @VisibleForTesting
    VisibilityListener getVisibilityListenerForTesting() {
        return mVisibilityListener;
    }
}

redpajama_set_name: RedPajamaGithub