Logging to disk for more reliable logging

-> Re-adding basic distinction btw apps and shortcuts
-> Adding functionality to e-mail dump file, but not using

Change-Id: I2b635004ab082af79445158ab61f20aac62d2e2f
This commit is contained in:
Adam Cohen 2013-08-20 18:54:31 -07:00 committed by Winson Chung
parent 414300a79d
commit 4caf298a2c
4 changed files with 276 additions and 78 deletions

View File

@ -687,6 +687,10 @@ public class DragController {
}
}
mDragObject.dragSource.onDropCompleted((View) dropTarget, mDragObject, false, accepted);
// Write all the logs to disk
Launcher.addDumpLog(TAG, "10249126 - DragController.drop() - dumping logs to disk", true);
mLauncher.dumpLogsToLocalData(false);
}
private DropTarget findDropTarget(int x, int y, int[] dropCoordinates) {

View File

@ -101,12 +101,21 @@ import com.android.launcher3.DropTarget.DragObject;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@ -302,6 +311,11 @@ public class Launcher extends Activity
private final ArrayList<Integer> mSynchronouslyBoundPages = new ArrayList<Integer>();
static final ArrayList<String> sDumpLogs = new ArrayList<String>();
static Date sDateStamp = new Date();
static DateFormat sDateFormat =
DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);
static long sRunStart = System.currentTimeMillis();
static final String CORRUPTION_EMAIL_SENT_KEY = "corruptionEmailSent";
// We only want to get the SharedPreferences once since it does an FS stat each time we get
// it from the context.
@ -853,6 +867,10 @@ public class Launcher extends Activity
if (DEBUG_RESUME_TIME) {
Log.d(TAG, "Time spent in onResume: " + (System.currentTimeMillis() - startTime));
}
// Write all the logs to disk
Launcher.addDumpLog(TAG, "10249126 - onResume() - dumping logs to disk", true);
dumpLogsToLocalData(false);
}
@Override
@ -869,6 +887,10 @@ public class Launcher extends Activity
mPaused = true;
mDragController.cancelDrag();
mDragController.resetLastGestureUpTime();
// Write all the logs to disk
Launcher.addDumpLog(TAG, "10249126 - onPause() - dumping logs to disk", true);
dumpLogsToLocalData(false);
}
protected void onFinishBindingItems() {
@ -3527,7 +3549,7 @@ public class Launcher extends Activity
public void bindAddScreens(ArrayList<Long> orderedScreenIds) {
int count = orderedScreenIds.size();
for (int i = 0; i < count; i++) {
Log.w(TAG, "10249126 - bindAddScreens(" + orderedScreenIds.get(i) + ")");
Launcher.addDumpLog(TAG, "10249126 - bindAddScreens(" + orderedScreenIds.get(i) + ")", true);
mWorkspace.insertNewWorkspaceScreenBeforeEmptyScreen(orderedScreenIds.get(i));
}
}
@ -3540,6 +3562,22 @@ public class Launcher extends Activity
return show;
}
private boolean emailSent() {
String spKey = LauncherAppState.getSharedPreferencesKey();
SharedPreferences sp = getSharedPreferences(spKey, Context.MODE_PRIVATE);
boolean show = sp.getBoolean(CORRUPTION_EMAIL_SENT_KEY, false);
return show;
}
private void setEmailSent(boolean sent) {
String spKey = LauncherAppState.getSharedPreferencesKey();
SharedPreferences sp = getSharedPreferences(spKey, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putBoolean(CORRUPTION_EMAIL_SENT_KEY, sent);
editor.commit();
}
private void toggleShowWeightWatcher() {
String spKey = LauncherAppState.getSharedPreferencesKey();
SharedPreferences sp = getSharedPreferences(spKey, Context.MODE_PRIVATE);
@ -3568,7 +3606,7 @@ public class Launcher extends Activity
return;
}
Log.w(TAG, "10249126 - bindAppsAdded(" + newScreens.size() + ")");
Launcher.addDumpLog(TAG, "10249126 - bindAppsAdded(" + newScreens.size() + ")", true);
// Add the new screens
bindAddScreens(newScreens);
@ -3777,8 +3815,8 @@ public class Launcher extends Activity
mWorkspaceLoading = false;
if (upgradePath) {
mWorkspace.stripDuplicateApps();
mIntentsOnWorkspaceFromUpgradePath = mWorkspace.stripDuplicateApps();
mWorkspace.getUniqueComponents(true, null);
mIntentsOnWorkspaceFromUpgradePath = mWorkspace.getUniqueComponents(true, null);
}
mWorkspace.post(new Runnable() {
@ -3787,6 +3825,10 @@ public class Launcher extends Activity
onFinishBindingItems();
}
});
// Write all the logs to disk
Launcher.addDumpLog(TAG, "10249126 - finishBindingItems() - dumping logs to disk", true);
dumpLogsToLocalData(false);
}
private boolean canRunNewAppsAnimation() {
@ -4154,22 +4196,131 @@ public class Launcher extends Activity
@Override
public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
super.dump(prefix, fd, writer, args);
writer.println(" ");
writer.println("Debug logs: ");
for (int i = 0; i < sDumpLogs.size(); i++) {
writer.println(" " + sDumpLogs.get(i));
synchronized (sDumpLogs) {
writer.println(" ");
writer.println("Debug logs: ");
for (int i = 0; i < sDumpLogs.size(); i++) {
writer.println(" " + sDumpLogs.get(i));
}
}
}
public static void dumpDebugLogsToConsole() {
Log.d(TAG, "");
Log.d(TAG, "*********************");
Log.d(TAG, "Launcher debug logs: ");
for (int i = 0; i < sDumpLogs.size(); i++) {
Log.d(TAG, " " + sDumpLogs.get(i));
synchronized (sDumpLogs) {
Log.d(TAG, "");
Log.d(TAG, "*********************");
Log.d(TAG, "Launcher debug logs: ");
for (int i = 0; i < sDumpLogs.size(); i++) {
Log.d(TAG, " " + sDumpLogs.get(i));
}
Log.d(TAG, "*********************");
Log.d(TAG, "");
}
Log.d(TAG, "*********************");
Log.d(TAG, "");
}
public static void addDumpLog(String tag, String log, boolean debugLog) {
if (debugLog) {
Log.d(tag, log);
}
sDateStamp.setTime(System.currentTimeMillis());
synchronized (sDumpLogs) {
sDumpLogs.add(sDateFormat.format(sDateStamp) + ": " + tag + ", " + log);
}
}
public void dumpLogsToLocalData(final boolean email) {
new Thread("DumpLogsToLocalData") {
@Override
public void run() {
boolean success = false;
sDateStamp.setTime(sRunStart);
String FILENAME = sDateStamp.getMonth() + "-"
+ sDateStamp.getDay() + "_"
+ sDateStamp.getHours() + "-"
+ sDateStamp.getMinutes() + "_"
+ sDateStamp.getSeconds() + ".txt";
FileOutputStream fos = null;
File outFile = null;
try {
outFile = new File(getFilesDir(), FILENAME);
outFile.createNewFile();
fos = new FileOutputStream(outFile);
} catch (Exception e) {
e.printStackTrace();
}
if (fos != null) {
PrintWriter writer = new PrintWriter(fos);
writer.println(" ");
writer.println("Debug logs: ");
synchronized (sDumpLogs) {
for (int i = 0; i < sDumpLogs.size(); i++) {
writer.println(" " + sDumpLogs.get(i));
}
}
writer.close();
}
try {
if (fos != null) {
fos.close();
success = true;
}
} catch (IOException e) {
e.printStackTrace();
}
if (success && email) {
if (!emailSent()) {
emailFile(outFile);
}
}
}
}.start();
}
private void emailFile(File file) {
File publicCopy = new File(Environment.getExternalStorageDirectory(), file.getName());
try {
copyFile(file, publicCopy);
} catch (IOException e) {
e.printStackTrace();
return;
}
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_EMAIL, new String[] {"adamcohen@google.com, winsonc@google.com," +
"mikejurka@google"});
intent.putExtra(Intent.EXTRA_SUBJECT, "Data corruption " + file.getName());
intent.putExtra(Intent.EXTRA_TEXT, "Data corruption has occurred, logs attached");
if (!file.exists() || !file.canRead()) {
Toast.makeText(this, "Attachment Error", Toast.LENGTH_SHORT).show();
finish();
return;
}
Toast.makeText(this, "Data corruption has occurred, please send e-mail", Toast.LENGTH_LONG);
Uri uri = Uri.fromFile(publicCopy);
intent.putExtra(Intent.EXTRA_STREAM, uri);
startActivity(Intent.createChooser(intent, "Please send logs, consider clearing data"));
setEmailSent(true);
}
public void copyFile(File src, File dst) throws IOException {
InputStream in = new FileInputStream(src);
OutputStream out = new FileOutputStream(dst);
// Transfer bytes from in to out
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.close();
}
}

View File

@ -108,7 +108,7 @@ public class LauncherModel extends BroadcastReceiver {
private WeakReference<Callbacks> mCallbacks;
// < only access in worker thread >
private AllAppsList mBgAllAppsList;
AllAppsList mBgAllAppsList;
// The lock that must be acquired before referencing any static bg data structures. Unlike
// other locks, this one can generally be held long-term because we never expect any of these
@ -167,6 +167,7 @@ public class LauncherModel extends BroadcastReceiver {
public void bindPackagesUpdated(ArrayList<Object> widgetsAndShortcuts);
public void bindSearchablesChanged();
public void onPageBoundSynchronously(int page);
public void dumpLogsToLocalData(boolean email);
}
public interface ItemInfoFilter {
@ -281,7 +282,7 @@ public class LauncherModel extends BroadcastReceiver {
}
public void addAndBindAddedApps(final Context context, final ArrayList<ItemInfo> added,
final Callbacks callbacks) {
Log.w(TAG, "10249126 - addAndBindAddedApps()");
Launcher.addDumpLog(TAG, "10249126 - addAndBindAddedApps()", true);
if (added.isEmpty()) {
return;
}
@ -328,7 +329,7 @@ public class LauncherModel extends BroadcastReceiver {
workspaceScreens.size());
while (numPagesToAdd > 0) {
long screenId = lp.generateNewScreenId();
Log.w(TAG, "10249126 - addAndBindAddedApps(" + screenId + ")");
Launcher.addDumpLog(TAG, "10249126 - addAndBindAddedApps(" + screenId + ")", true);
// Save the screen id for binding in the workspace
workspaceScreens.add(screenId);
addedWorkspaceScreensFinal.add(screenId);
@ -360,7 +361,7 @@ public class LauncherModel extends BroadcastReceiver {
}
}
Log.w(TAG, "10249126 - addAndBindAddedApps - updateWorkspaceScreenOrder(" + workspaceScreens.size() + ")");
Launcher.addDumpLog(TAG, "10249126 - addAndBindAddedApps - updateWorkspaceScreenOrder(" + workspaceScreens.size() + ")", true);
// Update the workspace screens
updateWorkspaceScreenOrder(context, workspaceScreens);
@ -630,8 +631,8 @@ public class LauncherModel extends BroadcastReceiver {
String transaction = "DbDebug Modify item (" + item.title + ") in db, id: " + item.id +
" (" + item.container + ", " + item.screenId + ", " + item.cellX + ", " + item.cellY +
") --> " + "(" + container + ", " + screenId + ", " + cellX + ", " + cellY + ")";
Launcher.sDumpLogs.add(transaction);
Log.d(TAG, transaction);
Launcher.addDumpLog(TAG, transaction, true);
item.container = container;
item.cellX = cellX;
item.cellY = cellY;
@ -670,7 +671,7 @@ public class LauncherModel extends BroadcastReceiver {
+ item.id + " (" + item.container + ", " + item.screenId + ", " + item.cellX
+ ", " + item.cellY + ") --> " + "(" + container + ", " + screen + ", "
+ item.cellX + ", " + item.cellY + ")";
Launcher.sDumpLogs.add(transaction);
Launcher.addDumpLog(TAG, transaction, true);
item.container = container;
// We store hotseat items in canonical form which is this orientation invariant position
@ -702,8 +703,8 @@ public class LauncherModel extends BroadcastReceiver {
String transaction = "DbDebug Modify item (" + item.title + ") in db, id: " + item.id +
" (" + item.container + ", " + item.screenId + ", " + item.cellX + ", " + item.cellY +
") --> " + "(" + container + ", " + screenId + ", " + cellX + ", " + cellY + ")";
Launcher.sDumpLogs.add(transaction);
Log.d(TAG, transaction);
Launcher.addDumpLog(TAG, transaction, true);
item.cellX = cellX;
item.cellY = cellY;
item.spanX = spanX;
@ -872,8 +873,7 @@ public class LauncherModel extends BroadcastReceiver {
String transaction = "DbDebug Add item (" + item.title + ") to db, id: "
+ item.id + " (" + container + ", " + screenId + ", " + cellX + ", "
+ cellY + ")";
Launcher.sDumpLogs.add(transaction);
Log.d(TAG, transaction);
Launcher.addDumpLog(TAG, transaction, true);
cr.insert(notify ? LauncherSettings.Favorites.CONTENT_URI :
LauncherSettings.Favorites.CONTENT_URI_NO_NOTIFICATION, values);
@ -934,8 +934,7 @@ public class LauncherModel extends BroadcastReceiver {
String transaction = "DbDebug Delete item (" + item.title + ") from db, id: "
+ item.id + " (" + item.container + ", " + item.screenId + ", " + item.cellX +
", " + item.cellY + ")";
Launcher.sDumpLogs.add(transaction);
Log.d(TAG, transaction);
Launcher.addDumpLog(TAG, transaction, true);
cr.delete(uriToDelete, null, null);
@ -977,7 +976,7 @@ public class LauncherModel extends BroadcastReceiver {
* a list of screen ids in the order that they should appear.
*/
void updateWorkspaceScreenOrder(Context context, final ArrayList<Long> screens) {
Log.w(TAG, "10249126 - updateWorkspaceScreenOrder()");
Launcher.addDumpLog(TAG, "10249126 - updateWorkspaceScreenOrder()", true);
final ArrayList<Long> screensCopy = new ArrayList<Long>(screens);
final ContentResolver cr = context.getContentResolver();
final Uri uri = LauncherSettings.WorkspaceScreens.CONTENT_URI;
@ -987,15 +986,15 @@ public class LauncherModel extends BroadcastReceiver {
while (iter.hasNext()) {
long id = iter.next();
if (id < 0) {
Log.w(TAG, "10249126 - updateWorkspaceScreenOrder - remove: " + id + ")");
Launcher.addDumpLog(TAG, "10249126 - updateWorkspaceScreenOrder - remove: " + id + ")", true);
iter.remove();
}
}
// Dump the screens copy
Log.w(TAG, "10249126 - updateWorkspaceScreenOrder - screensCopy");
Launcher.addDumpLog(TAG, "10249126 - updateWorkspaceScreenOrder - screensCopy", true);
for (Long l : screensCopy) {
Log.w(TAG, "10249126\t- " + l);
Launcher.addDumpLog(TAG, "10249126\t- " + l, true);
}
Runnable r = new Runnable() {
@ -1010,20 +1009,25 @@ public class LauncherModel extends BroadcastReceiver {
long screenId = screensCopy.get(i);
v.put(LauncherSettings.WorkspaceScreens._ID, screenId);
v.put(LauncherSettings.WorkspaceScreens.SCREEN_RANK, i);
Log.w(TAG, "10249126 - updateWorkspaceScreenOrder - add: " +
screenId + ", " + i + ")");
Launcher.addDumpLog(TAG, "10249126 - updateWorkspaceScreenOrder(" + screenId + ", " + i + ")", true);
values[i] = v;
}
cr.bulkInsert(uri, values);
// Dump the sBgWorkspaceScreens
Log.w(TAG, "10249126 - updateWorkspaceScreenOrder - sBgWorkspaceScreens");
Launcher.addDumpLog(TAG, "10249126 - updateWorkspaceScreenOrder - sBgWorkspaceScreens", true);
for (Long l : sBgWorkspaceScreens) {
Log.w(TAG, "10249126\t- " + l);
Launcher.addDumpLog(TAG, "10249126\t- " + l, true);
}
sBgWorkspaceScreens.clear();
sBgWorkspaceScreens.addAll(screensCopy);
// Dump the sBgWorkspaceScreens
Launcher.addDumpLog(TAG, "10249126 - updateWorkspaceScreenOrder - sBgWorkspaceScreens", true);
for (Long l : sBgWorkspaceScreens) {
Launcher.addDumpLog(TAG, "10249126\t- " + l, true);
}
}
};
runOnWorkerThread(r);
@ -1264,7 +1268,7 @@ public class LauncherModel extends BroadcastReceiver {
long screenId = sc.getLong(idIndex);
int rank = sc.getInt(rankIndex);
Log.w(TAG, "10249126 - loadWorkspaceScreensDb(" + screenId + ", " + rank + ")");
Launcher.addDumpLog(TAG, "10249126 - loadWorkspaceScreensDb(" + screenId + ", " + rank + ")", true);
orderedScreens.put(rank, screenId);
} catch (Exception e) {
@ -1472,9 +1476,10 @@ public class LauncherModel extends BroadcastReceiver {
// Ensure that all the applications that are in the system are represented on the home
// screen.
Log.w(TAG, "10249126 - verifyApplications - useMoreApps="
+ UPGRADE_USE_MORE_APPS_FOLDER + " isUpgrade=" + isUpgrade);
Launcher.addDumpLog(TAG, "10249126 - verifyApplications - useMoreApps="
+ UPGRADE_USE_MORE_APPS_FOLDER + " isUpgrade=" + isUpgrade, true);
if (!UPGRADE_USE_MORE_APPS_FOLDER || !isUpgrade) {
Launcher.addDumpLog(TAG, "10249126 - verifyApplications(" + isUpgrade + ")", true);
verifyApplications();
}
@ -1537,7 +1542,7 @@ public class LauncherModel extends BroadcastReceiver {
synchronized (sBgLock) {
for (ApplicationInfo app : mBgAllAppsList.data) {
tmpInfos = getItemInfoForComponentName(app.componentName);
Log.w(TAG, "10249126 - \t" + app.componentName.getPackageName() + ", " + tmpInfos.isEmpty());
Launcher.addDumpLog(TAG, "10249126 - \t" + app.componentName.getPackageName() + ", " + tmpInfos.isEmpty(), true);
if (tmpInfos.isEmpty()) {
// We are missing an application icon, so add this to the workspace
added.add(app);
@ -1645,7 +1650,7 @@ public class LauncherModel extends BroadcastReceiver {
sBgItemsIdMap.clear();
sBgDbIconCache.clear();
sBgWorkspaceScreens.clear();
Log.w(TAG, "10249126 - loadWorkspace()");
Launcher.addDumpLog(TAG, "10249126 - loadWorkspace()", true);
final ArrayList<Long> itemsToRemove = new ArrayList<Long>();
final Uri contentUri = LauncherSettings.Favorites.CONTENT_URI;
@ -1843,7 +1848,7 @@ public class LauncherModel extends BroadcastReceiver {
String log = "Deleting widget that isn't installed anymore: id="
+ id + " appWidgetId=" + appWidgetId;
Log.e(TAG, log);
Launcher.sDumpLogs.add(log);
Launcher.addDumpLog(TAG, log, false);
itemsToRemove.add(id);
} else {
appWidgetInfo = new LauncherAppWidgetInfo(appWidgetId,
@ -1895,7 +1900,7 @@ public class LauncherModel extends BroadcastReceiver {
if (itemsToRemove.size() > 0) {
ContentProviderClient client = contentResolver.acquireContentProviderClient(
LauncherSettings.Favorites.CONTENT_URI);
LauncherSettings.Favorites.CONTENT_URI);
// Remove dead items
for (long id : itemsToRemove) {
if (DEBUG_LOADERS) {
@ -1912,14 +1917,14 @@ public class LauncherModel extends BroadcastReceiver {
}
if (loadedOldDb) {
Log.w(TAG, "10249126 - loadWorkspace - loadedOldDb");
Launcher.addDumpLog(TAG, "10249126 - loadWorkspace - loadedOldDb", true);
long maxScreenId = 0;
// If we're importing we use the old screen order.
for (ItemInfo item: sBgItemsIdMap.values()) {
long screenId = item.screenId;
if (item.container == LauncherSettings.Favorites.CONTAINER_DESKTOP &&
!sBgWorkspaceScreens.contains(screenId)) {
Log.w(TAG, "10249126 - loadWorkspace-loadedOldDb(" + screenId + ")");
Launcher.addDumpLog(TAG, "10249126 - loadWorkspace-loadedOldDb(" + screenId + ")", true);
sBgWorkspaceScreens.add(screenId);
if (screenId > maxScreenId) {
maxScreenId = screenId;
@ -1929,9 +1934,9 @@ public class LauncherModel extends BroadcastReceiver {
Collections.sort(sBgWorkspaceScreens);
// Dump the sBgWorkspaceScreens
Log.w(TAG, "10249126 - updateWorkspaceScreenOrder - sBgWorkspaceScreens");
Launcher.addDumpLog(TAG, "10249126 - updateWorkspaceScreenOrder - sBgWorkspaceScreens", true);
for (Long l : sBgWorkspaceScreens) {
Log.w(TAG, "10249126\t- " + l);
Launcher.addDumpLog(TAG, "10249126\t- " + l, true);
}
LauncherAppState.getLauncherProvider().updateMaxScreenId(maxScreenId);
@ -1945,7 +1950,7 @@ public class LauncherModel extends BroadcastReceiver {
}
LauncherAppState.getLauncherProvider().updateMaxItemId(maxItemId);
} else {
Log.w(TAG, "10249126 - loadWorkspace - !loadedOldDb");
Launcher.addDumpLog(TAG, "10249126 - loadWorkspace - !loadedOldDb", true);
TreeMap<Integer, Long> orderedScreens = loadWorkspaceScreensDb(mContext);
for (Integer i : orderedScreens.keySet()) {
sBgWorkspaceScreens.add(orderedScreens.get(i));
@ -1969,11 +1974,10 @@ public class LauncherModel extends BroadcastReceiver {
sBgWorkspaceScreens.removeAll(unusedScreens);
// Dump the sBgWorkspaceScreens
Log.w(TAG, "10249126 - updateWorkspaceScreenOrder - sBgWorkspaceScreens");
Launcher.addDumpLog(TAG, "10249126 - updateWorkspaceScreenOrder - sBgWorkspaceScreens", true);
for (Long l : sBgWorkspaceScreens) {
Log.w(TAG, "10249126\t- " + l);
Launcher.addDumpLog(TAG, "10249126\t- " + l, true);
}
updateWorkspaceScreenOrder(context, sBgWorkspaceScreens);
}
}
@ -2126,12 +2130,12 @@ public class LauncherModel extends BroadcastReceiver {
private void bindWorkspaceScreens(final Callbacks oldCallbacks,
final ArrayList<Long> orderedScreens) {
Log.w(TAG, "10249126 - bindWorkspaceScreens()");
Launcher.addDumpLog(TAG, "10249126 - bindWorkspaceScreens()", true);
// Dump the orderedScreens
Log.w(TAG, "10249126 - orderedScreens");
Launcher.addDumpLog(TAG, "10249126 - orderedScreens", true);
for (Long l : sBgWorkspaceScreens) {
Log.w(TAG, "10249126\t- " + l);
Launcher.addDumpLog(TAG, "10249126\t- " + l, true);
}
final Runnable r = new Runnable() {
@ -2613,6 +2617,17 @@ public class LauncherModel extends BroadcastReceiver {
}
}
});
// Write all the logs to disk
Launcher.addDumpLog(TAG, "10249126 - PackageUpdatedTask - dumping logs to disk", true);
mHandler.post(new Runnable() {
public void run() {
Callbacks cb = mCallbacks != null ? mCallbacks.get() : null;
if (callbacks == cb && cb != null) {
callbacks.dumpLogsToLocalData(false);
}
}
});
}
}

View File

@ -40,6 +40,7 @@ import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.Region.Op;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.IBinder;
import android.os.Parcelable;
import android.util.AttributeSet;
@ -455,7 +456,7 @@ public class Workspace extends SmoothPagedView
}
public void removeAllWorkspaceScreens() {
Log.w(TAG, "10249126 - removeAllWorkspaceScreens()");
Launcher.addDumpLog(TAG, "10249126 - removeAllWorkspaceScreens()", true);
// Remove the pages and clear the screen models
removeAllViews();
mScreenOrder.clear();
@ -466,7 +467,7 @@ public class Workspace extends SmoothPagedView
// Find the index to insert this view into. If the empty screen exists, then
// insert it before that.
int insertIndex = mScreenOrder.indexOf(EXTRA_EMPTY_SCREEN_ID);
Log.w(TAG, "10249126 - insertNewWorkspaceScreenBeforeEmptyScreen(" + insertIndex + ")");
Launcher.addDumpLog(TAG, "10249126 - insertNewWorkspaceScreenBeforeEmptyScreen(" + insertIndex + ")", true);
if (insertIndex < 0) {
insertIndex = mScreenOrder.size();
}
@ -478,7 +479,9 @@ public class Workspace extends SmoothPagedView
}
public long insertNewWorkspaceScreen(long screenId, int insertIndex) {
Log.w(TAG, "10249126 - insertNewWorkspaceScreen(" + screenId + ", " + insertIndex + ")");
String log = "10249126 - insertNewWorkspaceScreen(" + screenId + ", " + insertIndex + ")";
Launcher.addDumpLog(TAG, log, true);
CellLayout newScreen = (CellLayout)
mLauncher.getLayoutInflater().inflate(R.layout.workspace_screen, null);
@ -491,7 +494,7 @@ public class Workspace extends SmoothPagedView
}
public void createCustomContentPage() {
Log.w(TAG, "10249126 - createCustomContentPage()");
Launcher.addDumpLog(TAG, "10249126 - createCustomContentPage()", true);
CellLayout customScreen = (CellLayout)
mLauncher.getLayoutInflater().inflate(R.layout.workspace_screen, null);
@ -526,7 +529,12 @@ public class Workspace extends SmoothPagedView
}
public long commitExtraEmptyScreen() {
Log.w(TAG, "10249126 - commitExtraEmptyScreen()");
Launcher.addDumpLog(TAG, "10249126 - commitExtraEmptyScreen()", true);
// Write all the logs to disk
Launcher.addDumpLog(TAG, "10249126 - commitExtraEmptyScreen() - dumping logs to disk", true);
mLauncher.dumpLogsToLocalData(false);
CellLayout cl = mWorkspaceScreens.get(EXTRA_EMPTY_SCREEN_ID);
mWorkspaceScreens.remove(EXTRA_EMPTY_SCREEN_ID);
mScreenOrder.remove(EXTRA_EMPTY_SCREEN_ID);
@ -548,13 +556,13 @@ public class Workspace extends SmoothPagedView
}
public CellLayout getScreenWithId(long screenId) {
Log.w(TAG, "10249126 - getScreenWithId(" + screenId + ")");
Launcher.addDumpLog(TAG, "10249126 - getScreenWithId(" + screenId + ")", true);
CellLayout layout = mWorkspaceScreens.get(screenId);
return layout;
}
public long getIdForScreen(CellLayout layout) {
Log.w(TAG, "10249126 - getIdForScreen()");
Launcher.addDumpLog(TAG, "10249126 - getIdForScreen()", true);
Iterator<Long> iter = mWorkspaceScreens.keySet().iterator();
while (iter.hasNext()) {
long id = iter.next();
@ -566,7 +574,7 @@ public class Workspace extends SmoothPagedView
}
public int getPageIndexForScreenId(long screenId) {
Log.w(TAG, "10249126 - getPageIndexForScreenId(" + screenId + ")");
Launcher.addDumpLog(TAG, "10249126 - getPageIndexForScreenId(" + screenId + ")", true);
return indexOfChild(mWorkspaceScreens.get(screenId));
}
@ -578,7 +586,7 @@ public class Workspace extends SmoothPagedView
}
public boolean hasNonCustomEmptyScreens() {
Log.w(TAG, "10249126 - hasNonCustomEmptyScreens()");
Launcher.addDumpLog(TAG, "10249126 - hasNonCustomEmptyScreens()", true);
Iterator<Long> iter = mWorkspaceScreens.keySet().iterator();
while (iter.hasNext()) {
long id = iter.next();
@ -599,7 +607,7 @@ public class Workspace extends SmoothPagedView
return;
}
Log.w(TAG, "10249126 - stripEmptyScreens()");
Launcher.addDumpLog(TAG, "10249126 - stripEmptyScreens()", true);
int currentPage = getNextPage();
ArrayList<Long> removeScreens = new ArrayList<Long>();
@ -612,7 +620,7 @@ public class Workspace extends SmoothPagedView
int pageShift = 0;
for (Long id: removeScreens) {
Log.w(TAG, "10249126 - \tremove(" + id + ")");
Launcher.addDumpLog(TAG, "10249126 - \tremove(" + id + ")", true);
CellLayout cl = mWorkspaceScreens.get(id);
mWorkspaceScreens.remove(id);
mScreenOrder.remove(id);
@ -729,7 +737,7 @@ public class Workspace extends SmoothPagedView
// TODO: This branch occurs when the workspace is adding views
// outside of the defined grid
// maybe we should be deleting these items from the LauncherModel?
Log.w(TAG, "Failed to add to item at (" + lp.cellX + "," + lp.cellY + ") to CellLayout");
Launcher.addDumpLog(TAG, "Failed to add to item at (" + lp.cellX + "," + lp.cellY + ") to CellLayout", true);
}
if (!(child instanceof Folder)) {
@ -1633,7 +1641,7 @@ public class Workspace extends SmoothPagedView
mScreenOrder.add(getIdForScreen(cl));
}
Log.w(TAG, "10249126 - onEndReordering()");
Launcher.addDumpLog(TAG, "10249126 - onEndReordering()", true);
mLauncher.getModel().updateWorkspaceScreenOrder(mLauncher, mScreenOrder);
// Re-enable auto layout transitions for page deletion.
@ -3513,18 +3521,19 @@ public class Workspace extends SmoothPagedView
}
}
ArrayList<ComponentName> stripDuplicateApps() {
ArrayList<ComponentName> getUniqueComponents(boolean stripDuplicates, ArrayList<ComponentName> duplicates) {
ArrayList<ComponentName> uniqueIntents = new ArrayList<ComponentName>();
stripDuplicateApps((CellLayout) mLauncher.getHotseat().getLayout(), uniqueIntents);
getUniqueIntents((CellLayout) mLauncher.getHotseat().getLayout(), uniqueIntents, duplicates, false);
int count = getChildCount();
for (int i = 0; i < count; i++) {
CellLayout cl = (CellLayout) getChildAt(i);
stripDuplicateApps(cl, uniqueIntents);
getUniqueIntents(cl, uniqueIntents, duplicates, false);
}
return uniqueIntents;
}
void stripDuplicateApps(CellLayout cl, ArrayList<ComponentName> uniqueIntents) {
void getUniqueIntents(CellLayout cl, ArrayList<ComponentName> uniqueIntents,
ArrayList<ComponentName> duplicates, boolean stripDuplicates) {
int count = cl.getShortcutsAndWidgets().getChildCount();
ArrayList<View> children = new ArrayList<View>();
@ -3541,15 +3550,24 @@ public class Workspace extends SmoothPagedView
ShortcutInfo si = (ShortcutInfo) info;
ComponentName cn = si.intent.getComponent();
if (si.itemType == LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT) {
Uri dataUri = si.intent.getData();
// If dataUri is not null / empty or if this component isn't one that would
// have previously showed up in the AllApps list, then this is a widget-type
// shortcut, so ignore it.
if (dataUri != null && !dataUri.equals(Uri.EMPTY)) {
continue;
}
if (!uniqueIntents.contains(cn)) {
uniqueIntents.add(cn);
} else {
cl.removeViewInLayout(v);
LauncherModel.deleteItemFromDatabase(mLauncher, si);
if (stripDuplicates) {
cl.removeViewInLayout(v);
LauncherModel.deleteItemFromDatabase(mLauncher, si);
}
if (duplicates != null) {
duplicates.add(cn);
}
}
}
if (v instanceof FolderIcon) {
@ -3560,14 +3578,24 @@ public class Workspace extends SmoothPagedView
ShortcutInfo si = (ShortcutInfo) items.get(j).getTag();
ComponentName cn = si.intent.getComponent();
if (si.itemType == LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT) {
Uri dataUri = si.intent.getData();
// If dataUri is not null / empty or if this component isn't one that would
// have previously showed up in the AllApps list, then this is a widget-type
// shortcut, so ignore it.
if (dataUri != null && !dataUri.equals(Uri.EMPTY)) {
continue;
}
if (!uniqueIntents.contains(cn)) {
uniqueIntents.add(cn);
} else {
fi.getFolderInfo().remove(si);
LauncherModel.deleteItemFromDatabase(mLauncher, si);
} else {
if (stripDuplicates) {
fi.getFolderInfo().remove(si);
LauncherModel.deleteItemFromDatabase(mLauncher, si);
}
if (duplicates != null) {
duplicates.add(cn);
}
}
}
}