#!/usr/bin/env python
#
# Copyright (C) 2008 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""
A faux Setup Wizard.  Stuffs one or two usernames + passwords into the
database on the device.
"""

import sys
if sys.hexversion < 0x02040000:
  print "This script requires python 2.4 or higher."
  sys.exit(1)

import getpass
import subprocess
import time
import sha

DB = "/data/data/com.google.android.googleapps/databases/accounts.db"

def RunCmd(args):
  proc = subprocess.Popen(args, stdout=subprocess.PIPE)
  out = proc.stdout.read()
  if proc.wait():
    print
    print "failed: %s" % " ".join(args)
    return None
  return out

def GetProp(adb_flags, name):
  args = ("adb",) + adb_flags + ("shell", "su", "root",
                                 "/system/bin/getprop", name)
  return RunCmd(args)

def SetProp(adb_flags, name, value):
  args = ("adb",) + adb_flags + ("shell", "su", "root",
                                 "/system/bin/setprop", name, value)
  return RunCmd(args)

def DbExists(adb_flags):
  args = ("adb",) + adb_flags + ("shell", "su", "root",
                                 "/system/bin/ls", DB)
  result = RunCmd(args)
  if result is None: return None
  return "No such file" not in result

def main(argv):
  if len(argv) == 1:
    print ("usage: %s [adb flags] "
           "[<dasher address[:password]>] "
           "[<gmail address[:password]>]") % (argv[0],)
    sys.exit(2)

  argv = argv[1:]

  gmail = None
  dasher = None
  while argv and "@" in argv[-1]:
    addr = argv.pop()
    if "@gmail.com" in addr or "@googlemail.com" in addr:
      gmail = addr
    else:
      dasher = addr

  adb_flags = tuple(argv)

  while True:
    db = DbExists(adb_flags)
    if db is None:
      print "failed to contact device; will retry in 3 seconds"
      time.sleep(3)
      continue

    if db:
      print
      print "GoogleLoginService has already started on this device;"
      print "it's too late to use this script to add accounts."
      print
      print "This script only works on a freshly-wiped device (or "
      print "emulator) while booting for the first time."
      print
      break

    hosted_account = GetProp(adb_flags, "ro.config.hosted_account").strip()
    google_account = GetProp(adb_flags, "ro.config.google_account").strip()

    if dasher and hosted_account:
      print
      print "A dasher account is already configured on this device;"
      print "can't add", hosted_account
      print
      dasher = None

    if gmail and google_account:
      print
      print "A google account is already configured on this device;"
      print "can't add", google_account
      print
      gmail = None

    if not gmail and not dasher: break

    if dasher:
      SetProp(adb_flags, "ro.config.hosted_account", dasher)
      print "set hosted_account to", dasher
    if gmail:
      SetProp(adb_flags, "ro.config.google_account", gmail)
      print "set google_account to", gmail

    break






if __name__ == "__main__":
  main(sys.argv)
