• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env python2.5
2
3import cgi
4import os
5import shutil
6import sys
7import sqlite3
8
9SCREENS = 5
10COLUMNS = 4
11ROWS = 4
12CELL_SIZE = 110
13
14DIR = "db_files"
15AUTO_FILE = DIR + "/launcher.db"
16INDEX_FILE = DIR + "/index.html"
17
18def usage():
19  print "usage: print_db.py launcher.db -- prints a launcher.db"
20  print "usage: print_db.py -- adb pulls a launcher.db from a device"
21  print "       and prints it"
22  print
23  print "The dump will be created in a directory called db_files in cwd."
24  print "This script will delete any db_files directory you have now"
25
26
27def make_dir():
28  shutil.rmtree(DIR, True)
29  os.makedirs(DIR)
30
31def pull_file(fn):
32  print "pull_file: " + fn
33  rv = os.system("adb pull"
34    + " /data/data/com.android.launcher/databases/launcher.db"
35    + " " + fn);
36  if rv != 0:
37    print "adb pull failed"
38    sys.exit(1)
39
40def get_favorites(conn):
41  c = conn.cursor()
42  c.execute("SELECT * FROM favorites")
43  columns = [d[0] for d in c.description]
44  rows = []
45  for row in c:
46    rows.append(row)
47  return columns,rows
48
49def print_intent(out, id, i, cell):
50  if cell:
51    out.write("""<span class="intent" title="%s">shortcut</span>""" % (
52        cgi.escape(cell, True)
53      ))
54
55
56def print_icon(out, id, i, cell):
57  if cell:
58    icon_fn = "icon_%d.png" % id
59    out.write("""<img src="%s">""" % ( icon_fn ))
60    f = file(DIR + "/" + icon_fn, "w")
61    f.write(cell)
62    f.close()
63
64def print_cell(out, id, i, cell):
65  if not cell is None:
66    out.write(cgi.escape(str(cell)))
67
68FUNCTIONS = {
69  "intent": print_intent,
70  "icon": print_icon
71}
72
73def process_file(fn):
74  print "process_file: " + fn
75  conn = sqlite3.connect(fn)
76  columns,rows = get_favorites(conn)
77  data = [dict(zip(columns,row)) for row in rows]
78
79  out = file(INDEX_FILE, "w")
80  out.write("""<html>
81<head>
82<style type="text/css">
83.intent {
84  font-style: italic;
85}
86</style>
87</head>
88<body>
89""")
90
91  # Data table
92  out.write("<b>Favorites table</b><br/>\n")
93  out.write("""<html>
94<table border=1 cellspacing=0 cellpadding=4>
95<tr>
96""")
97  print_functions = []
98  for col in columns:
99    print_functions.append(FUNCTIONS.get(col, print_cell))
100  for i in range(0,len(columns)):
101    col = columns[i]
102    out.write("""  <th>%s</th>
103""" % ( col ))
104  out.write("""
105</tr>
106""")
107  for row in rows:
108    out.write("""<tr>
109""")
110    for i in range(0,len(row)):
111      cell = row[i]
112      # row[0] is always _id
113      out.write("""  <td>""")
114      print_functions[i](out, row[0], row, cell)
115      out.write("""</td>
116""")
117    out.write("""</tr>
118""")
119  out.write("""</table>
120""")
121
122  # Pages
123  screens = []
124  for i in range(0,SCREENS):
125    screen = []
126    for j in range(0,ROWS):
127      m = []
128      for k in range(0,COLUMNS):
129        m.append(None)
130      screen.append(m)
131    screens.append(screen)
132  occupied = "occupied"
133  for row in data:
134    screen = screens[row["screen"]]
135    # desktop
136    if row["container"] != -100:
137      continue
138    cellX = row["cellX"]
139    cellY = row["cellY"]
140    spanX = row["spanX"]
141    spanY = row["spanY"]
142    for j in range(cellY, cellY+spanY):
143      for k in range(cellX, cellX+spanX):
144        screen[j][k] = occupied
145    screen[cellY][cellX] = row
146  i=0
147  for screen in screens:
148    out.write("<br/><b>Screen %d</b><br/>\n" % i)
149    out.write("<table class=layout border=1 cellspacing=0 cellpadding=4>\n")
150    for m in screen:
151      out.write("  <tr>\n")
152      for cell in m:
153        if cell is None:
154          out.write("    <td width=%d height=%d></td>\n" %
155              (CELL_SIZE, CELL_SIZE))
156        elif cell == occupied:
157          pass
158        else:
159          cellX = cell["cellX"]
160          cellY = cell["cellY"]
161          spanX = cell["spanX"]
162          spanY = cell["spanY"]
163          intent = cell["intent"]
164          if intent:
165            title = "title=\"%s\"" % cgi.escape(cell["intent"], True)
166          else:
167            title = ""
168          out.write(("    <td colspan=%d rowspan=%d width=%d height=%d"
169              + " bgcolor=#dddddd align=center valign=middle %s>") % (
170                spanX, spanY,
171                (CELL_SIZE*spanX), (CELL_SIZE*spanY),
172                title))
173          itemType = cell["itemType"]
174          if itemType == 0:
175            out.write("""<img src="icon_%d.png">\n""" % ( cell["_id"] ))
176            out.write("<br/>\n")
177            out.write(cgi.escape(cell["title"]) + " <br/><i>(app)</i>")
178          elif itemType == 1:
179            out.write("""<img src="icon_%d.png">\n""" % ( cell["_id"] ))
180            out.write("<br/>\n")
181            out.write(cgi.escape(cell["title"]) + " <br/><i>(shortcut)</i>")
182          elif itemType == 2:
183            out.write("""<i>folder</i>""")
184          elif itemType == 3:
185            out.write("""<i>live folder</i>""")
186          elif itemType == 4:
187            out.write("<i>widget %d</i><br/>\n" % cell["appWidgetId"])
188          elif itemType == 1000:
189            out.write("""<i>clock</i>""")
190          elif itemType == 1001:
191            out.write("""<i>search</i>""")
192          elif itemType == 1002:
193            out.write("""<i>photo frame</i>""")
194          else:
195            out.write("<b>unknown type: %d</b>" % itemType)
196          out.write("</td>\n")
197      out.write("</tr>\n")
198    out.write("</table>\n")
199    i=i+1
200
201  out.write("""
202</body>
203</html>
204""")
205
206  out.close()
207
208def main(argv):
209  if len(argv) == 1:
210    make_dir()
211    pull_file(AUTO_FILE)
212    process_file(AUTO_FILE)
213  elif len(argv) == 2:
214    make_dir()
215    process_file(argv[1])
216  else:
217    usage()
218
219if __name__=="__main__":
220  main(sys.argv)
221