mirror of
https://github.com/LawnchairLauncher/lawnchair.git
synced 2026-02-19 18:58:19 +00:00
Merge "Fixing work folder addition logic > Showing animation when folder is added > Not showing animation while cling is visible > Checking is loader completed from UI thread > Running bind complete runnables when bind is completed" into ub-launcher3-burnaby
This commit is contained in:
@@ -301,6 +301,8 @@ public class Launcher extends Activity
|
||||
private boolean mHasFocus = false;
|
||||
private boolean mAttached = false;
|
||||
|
||||
private LauncherClings mClings;
|
||||
|
||||
private static LongArrayMap<FolderInfo> sFolders = new LongArrayMap<>();
|
||||
|
||||
private View.OnTouchListener mHapticFeedbackTouchListener;
|
||||
@@ -648,7 +650,7 @@ public class Launcher extends Activity
|
||||
public boolean isDraggingEnabled() {
|
||||
// We prevent dragging when we are loading the workspace as it is possible to pick up a view
|
||||
// that is subsequently removed from the workspace in startBinding().
|
||||
return !mModel.isLoadingWorkspace();
|
||||
return !isWorkspaceLoading();
|
||||
}
|
||||
|
||||
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
|
||||
@@ -3755,11 +3757,12 @@ public class Launcher extends Activity
|
||||
continue;
|
||||
}
|
||||
|
||||
final View view;
|
||||
switch (item.itemType) {
|
||||
case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION:
|
||||
case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT:
|
||||
ShortcutInfo info = (ShortcutInfo) item;
|
||||
View shortcut = createShortcut(info);
|
||||
view = createShortcut(info);
|
||||
|
||||
/*
|
||||
* TODO: FIX collision case
|
||||
@@ -3778,28 +3781,26 @@ public class Launcher extends Activity
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
workspace.addInScreenFromBind(shortcut, item.container, item.screenId, item.cellX,
|
||||
item.cellY, 1, 1);
|
||||
if (animateIcons) {
|
||||
// Animate all the applications up now
|
||||
shortcut.setAlpha(0f);
|
||||
shortcut.setScaleX(0f);
|
||||
shortcut.setScaleY(0f);
|
||||
bounceAnims.add(createNewAppBounceAnimation(shortcut, i));
|
||||
newShortcutsScreenId = item.screenId;
|
||||
}
|
||||
break;
|
||||
case LauncherSettings.Favorites.ITEM_TYPE_FOLDER:
|
||||
FolderIcon newFolder = FolderIcon.fromXml(R.layout.folder_icon, this,
|
||||
view = FolderIcon.fromXml(R.layout.folder_icon, this,
|
||||
(ViewGroup) workspace.getChildAt(workspace.getCurrentPage()),
|
||||
(FolderInfo) item, mIconCache);
|
||||
workspace.addInScreenFromBind(newFolder, item.container, item.screenId, item.cellX,
|
||||
item.cellY, 1, 1);
|
||||
break;
|
||||
default:
|
||||
throw new RuntimeException("Invalid Item Type");
|
||||
}
|
||||
|
||||
workspace.addInScreenFromBind(view, item.container, item.screenId, item.cellX,
|
||||
item.cellY, 1, 1);
|
||||
if (animateIcons) {
|
||||
// Animate all the applications up now
|
||||
view.setAlpha(0f);
|
||||
view.setScaleX(0f);
|
||||
view.setScaleY(0f);
|
||||
bounceAnims.add(createNewAppBounceAnimation(view, i));
|
||||
newShortcutsScreenId = item.screenId;
|
||||
}
|
||||
}
|
||||
|
||||
if (animateIcons) {
|
||||
@@ -4064,7 +4065,8 @@ public class Launcher extends Activity
|
||||
|
||||
private boolean canRunNewAppsAnimation() {
|
||||
long diff = System.currentTimeMillis() - mDragController.getLastGestureUpTime();
|
||||
return diff > (NEW_APPS_ANIMATION_INACTIVE_TIMEOUT_SECONDS * 1000);
|
||||
return diff > (NEW_APPS_ANIMATION_INACTIVE_TIMEOUT_SECONDS * 1000)
|
||||
&& (mClings == null || !mClings.isVisible());
|
||||
}
|
||||
|
||||
private ValueAnimator createNewAppBounceAnimation(View v, int i) {
|
||||
@@ -4491,6 +4493,7 @@ public class Launcher extends Activity
|
||||
// launcher2). Otherwise, we prompt the user upon started for migration
|
||||
LauncherClings launcherClings = new LauncherClings(this);
|
||||
if (launcherClings.shouldShowFirstRunOrMigrationClings()) {
|
||||
mClings = launcherClings;
|
||||
if (mModel.canMigrateFromOldLauncherDb(this)) {
|
||||
launcherClings.showMigrationCling();
|
||||
} else {
|
||||
|
||||
@@ -51,6 +51,7 @@ class LauncherClings implements OnClickListener {
|
||||
|
||||
@Thunk Launcher mLauncher;
|
||||
private LayoutInflater mInflater;
|
||||
@Thunk boolean mIsVisible;
|
||||
|
||||
/** Ctor */
|
||||
public LauncherClings(Launcher launcher) {
|
||||
@@ -91,6 +92,7 @@ class LauncherClings implements OnClickListener {
|
||||
* package was not preinstalled and there exists a db to migrate from.
|
||||
*/
|
||||
public void showMigrationCling() {
|
||||
mIsVisible = true;
|
||||
mLauncher.hideWorkspaceSearchAndHotseat();
|
||||
|
||||
ViewGroup root = (ViewGroup) mLauncher.findViewById(R.id.launcher);
|
||||
@@ -117,6 +119,7 @@ class LauncherClings implements OnClickListener {
|
||||
}
|
||||
|
||||
public void showLongPressCling(boolean showWelcome) {
|
||||
mIsVisible = true;
|
||||
ViewGroup root = (ViewGroup) mLauncher.findViewById(R.id.launcher);
|
||||
View cling = mInflater.inflate(R.layout.longpress_cling, root, false);
|
||||
|
||||
@@ -196,6 +199,7 @@ class LauncherClings implements OnClickListener {
|
||||
mLauncher.getSharedPrefs().edit()
|
||||
.putBoolean(flag, true)
|
||||
.apply();
|
||||
mIsVisible = false;
|
||||
if (postAnimationCb != null) {
|
||||
postAnimationCb.run();
|
||||
}
|
||||
@@ -209,6 +213,10 @@ class LauncherClings implements OnClickListener {
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isVisible() {
|
||||
return mIsVisible;
|
||||
}
|
||||
|
||||
/** Returns whether the clings are enabled or should be shown */
|
||||
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
|
||||
private boolean areClingsEnabled() {
|
||||
|
||||
@@ -34,7 +34,6 @@ import android.content.pm.ResolveInfo;
|
||||
import android.database.Cursor;
|
||||
import android.graphics.Bitmap;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.Environment;
|
||||
import android.os.Handler;
|
||||
import android.os.HandlerThread;
|
||||
@@ -259,7 +258,7 @@ public class LauncherModel extends BroadcastReceiver
|
||||
|
||||
/** Runs the specified runnable immediately if called from the worker thread, otherwise it is
|
||||
* posted on the worker thread handler. */
|
||||
private static void runOnWorkerThread(Runnable r) {
|
||||
@Thunk static void runOnWorkerThread(Runnable r) {
|
||||
if (sWorkerThread.getThreadId() == Process.myTid()) {
|
||||
r.run();
|
||||
} else {
|
||||
@@ -268,19 +267,6 @@ public class LauncherModel extends BroadcastReceiver
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs the specified runnable after the loader is complete
|
||||
*/
|
||||
@Thunk void runAfterBindCompletes(Runnable r) {
|
||||
if (isLoadingWorkspace() || !mHasLoaderCompletedOnce) {
|
||||
synchronized (mBindCompleteRunnables) {
|
||||
mBindCompleteRunnables.add(r);
|
||||
}
|
||||
} else {
|
||||
runOnWorkerThread(r);
|
||||
}
|
||||
}
|
||||
|
||||
boolean canMigrateFromOldLauncherDb(Launcher launcher) {
|
||||
return mOldContentProviderExists && !launcher.isLauncherPreinstalled() ;
|
||||
}
|
||||
@@ -894,8 +880,13 @@ public class LauncherModel extends BroadcastReceiver
|
||||
}
|
||||
|
||||
private void assertWorkspaceLoaded() {
|
||||
if (LauncherAppState.isDogfoodBuild() && (isLoadingWorkspace() || !mHasLoaderCompletedOnce)) {
|
||||
throw new RuntimeException("Trying to add shortcut while loader is running");
|
||||
if (LauncherAppState.isDogfoodBuild()) {
|
||||
synchronized (mLock) {
|
||||
if (!mHasLoaderCompletedOnce ||
|
||||
(mLoaderTask != null && mLoaderTask.mIsLoadingAndBindingWorkspace)) {
|
||||
throw new RuntimeException("Trying to add shortcut while loader is running");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1390,16 +1381,6 @@ public class LauncherModel extends BroadcastReceiver
|
||||
mHandler.post(r);
|
||||
}
|
||||
}
|
||||
|
||||
// Run all the bind complete runnables after workspace is bound.
|
||||
if (!mBindCompleteRunnables.isEmpty()) {
|
||||
synchronized (mBindCompleteRunnables) {
|
||||
for (final Runnable r : mBindCompleteRunnables) {
|
||||
runOnWorkerThread(r);
|
||||
}
|
||||
mBindCompleteRunnables.clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void stopLoader() {
|
||||
@@ -1441,15 +1422,6 @@ public class LauncherModel extends BroadcastReceiver
|
||||
return mAllAppsLoaded;
|
||||
}
|
||||
|
||||
boolean isLoadingWorkspace() {
|
||||
synchronized (mLock) {
|
||||
if (mLoaderTask != null) {
|
||||
return mLoaderTask.isLoadingWorkspace();
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Runnable for the thread that loads the contents of the launcher:
|
||||
* - workspace icons
|
||||
@@ -1468,10 +1440,6 @@ public class LauncherModel extends BroadcastReceiver
|
||||
mFlags = flags;
|
||||
}
|
||||
|
||||
boolean isLoadingWorkspace() {
|
||||
return mIsLoadingAndBindingWorkspace;
|
||||
}
|
||||
|
||||
private void loadAndBindWorkspace() {
|
||||
mIsLoadingAndBindingWorkspace = true;
|
||||
|
||||
@@ -2697,13 +2665,24 @@ public class LauncherModel extends BroadcastReceiver
|
||||
callbacks.finishBindingItems();
|
||||
}
|
||||
|
||||
mIsLoadingAndBindingWorkspace = false;
|
||||
|
||||
// Run all the bind complete runnables after workspace is bound.
|
||||
if (!mBindCompleteRunnables.isEmpty()) {
|
||||
synchronized (mBindCompleteRunnables) {
|
||||
for (final Runnable r : mBindCompleteRunnables) {
|
||||
runOnWorkerThread(r);
|
||||
}
|
||||
mBindCompleteRunnables.clear();
|
||||
}
|
||||
}
|
||||
|
||||
// If we're profiling, ensure this is the last thing in the queue.
|
||||
if (DEBUG_LOADERS) {
|
||||
Log.d(TAG, "bound workspace in "
|
||||
+ (SystemClock.uptimeMillis()-t) + "ms");
|
||||
}
|
||||
|
||||
mIsLoadingAndBindingWorkspace = false;
|
||||
}
|
||||
};
|
||||
if (isLoadingSynchronously) {
|
||||
@@ -2832,12 +2811,27 @@ public class LauncherModel extends BroadcastReceiver
|
||||
|
||||
final ManagedProfileHeuristic heuristic = ManagedProfileHeuristic.get(mContext, user);
|
||||
if (heuristic != null) {
|
||||
runAfterBindCompletes(new Runnable() {
|
||||
final Runnable r = new Runnable() {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
heuristic.processUserApps(apps);
|
||||
}
|
||||
};
|
||||
runOnMainThread(new Runnable() {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
// Check isLoadingWorkspace on the UI thread, as it is updated on
|
||||
// the UI thread.
|
||||
if (mIsLoadingAndBindingWorkspace) {
|
||||
synchronized (mBindCompleteRunnables) {
|
||||
mBindCompleteRunnables.add(r);
|
||||
}
|
||||
} else {
|
||||
runOnWorkerThread(r);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user