am 36a62885: Merge "Adding in-activity intro screen (issue 12905636)" into ub-now-mister-ugly

* commit '36a6288545060415189803f24bb6252b98e071e3':
  Adding in-activity intro screen (issue 12905636)
This commit is contained in:
Adam Cohen
2014-03-20 22:37:38 +00:00
committed by Android Git Automerger
2 changed files with 114 additions and 27 deletions
+32 -10
View File
@@ -73,7 +73,8 @@ public class DragLayer extends FrameLayout implements ViewGroup.OnHierarchyChang
private final Rect mInsets = new Rect(); private final Rect mInsets = new Rect();
private int mDragViewIndex; private View mOverlayView;
private int mTopViewIndex;
/** /**
* Used to create a new DragLayer from XML. * Used to create a new DragLayer from XML.
@@ -120,6 +121,16 @@ public class DragLayer extends FrameLayout implements ViewGroup.OnHierarchyChang
setInsets(child, mInsets, new Rect()); setInsets(child, mInsets, new Rect());
} }
public void showOverlayView(View introScreen) {
LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
mOverlayView = introScreen;
addView(introScreen, lp);
}
public void dismissOverlayView() {
removeView(mOverlayView);
}
private void setInsets(View child, Rect newInsets, Rect oldInsets) { private void setInsets(View child, Rect newInsets, Rect oldInsets) {
final FrameLayout.LayoutParams flp = (FrameLayout.LayoutParams) child.getLayoutParams(); final FrameLayout.LayoutParams flp = (FrameLayout.LayoutParams) child.getLayoutParams();
if (child instanceof Insettable) { if (child instanceof Insettable) {
@@ -770,27 +781,38 @@ public class DragLayer extends FrameLayout implements ViewGroup.OnHierarchyChang
updateChildIndices(); updateChildIndices();
} }
@Override
public void bringChildToFront(View child) {
super.bringChildToFront(child);
updateChildIndices();
}
private void updateChildIndices() { private void updateChildIndices() {
mDragViewIndex = -1; mTopViewIndex = -1;
int childCount = getChildCount(); int childCount = getChildCount();
for (int i = 0; i < childCount; i++) { for (int i = 0; i < childCount; i++) {
if (getChildAt(i) instanceof DragView) { if (getChildAt(i) instanceof DragView ||
mDragViewIndex = i; getChildAt(i) == mOverlayView) {
mTopViewIndex = i;
} }
} }
} }
@Override @Override
protected int getChildDrawingOrder(int childCount, int i) { protected int getChildDrawingOrder(int childCount, int i) {
if (mDragViewIndex == -1) { // i represents the current draw iteration
if (mTopViewIndex == -1) {
// in general we do nothing
return i; return i;
} else if (i == mDragViewIndex) { } else if (i == childCount - 1) {
return getChildCount()-1; // if we have a top index, we return it when drawing last item (highest z-order)
} else if (i < mDragViewIndex) { return mTopViewIndex;
} else if (i < mTopViewIndex) {
return i; return i;
} else { } else {
// i > mDragViewIndex // for indexes greater than the top index, we fetch one item above to shift for the
return i-1; // displacement of the top index
return i + 1;
} }
} }
+82 -17
View File
@@ -191,6 +191,7 @@ public class Launcher extends Activity
private static final String RUNTIME_STATE_VIEW_IDS = "launcher.view_ids"; private static final String RUNTIME_STATE_VIEW_IDS = "launcher.view_ids";
static final String INTRO_SCREEN_DISMISSED = "launcher.intro_screen_dismissed";
static final String FIRST_RUN_ACTIVITY_DISPLAYED = "launcher.first_run_activity_displayed"; static final String FIRST_RUN_ACTIVITY_DISPLAYED = "launcher.first_run_activity_displayed";
private static final String TOOLBAR_ICON_METADATA_NAME = "com.android.launcher.toolbar_icon"; private static final String TOOLBAR_ICON_METADATA_NAME = "com.android.launcher.toolbar_icon";
@@ -213,6 +214,7 @@ public class Launcher extends Activity
public static final int EXIT_SPRINGLOADED_MODE_SHORT_TIMEOUT = 300; public static final int EXIT_SPRINGLOADED_MODE_SHORT_TIMEOUT = 300;
public static final int EXIT_SPRINGLOADED_MODE_SHORT_TIMEOUT_FOLDER_CLOSE = 400; public static final int EXIT_SPRINGLOADED_MODE_SHORT_TIMEOUT_FOLDER_CLOSE = 400;
private static final int ON_ACTIVITY_RESULT_ANIMATION_DELAY = 500; private static final int ON_ACTIVITY_RESULT_ANIMATION_DELAY = 500;
private static final int ACTIVITY_START_DELAY = 500;
private static final Object sLock = new Object(); private static final Object sLock = new Object();
private static int sScreen = DEFAULT_SCREEN; private static int sScreen = DEFAULT_SCREEN;
@@ -481,10 +483,15 @@ public class Launcher extends Activity
// On large interfaces, we want the screen to auto-rotate based on the current orientation // On large interfaces, we want the screen to auto-rotate based on the current orientation
unlockScreenOrientation(true); unlockScreenOrientation(true);
if (shouldShowIntroScreen()) {
showIntroScreen();
} else {
showFirstRunActivity();
}
// The two first run cling paths are mutually exclusive, if the launcher is preinstalled // The two first run cling paths are mutually exclusive, if the launcher is preinstalled
// on the device, then we always show the first run cling experience (or if there is no // on the device, then we always show the first run cling experience (or if there is no
// launcher2). Otherwise, we prompt the user upon started for migration // launcher2). Otherwise, we prompt the user upon started for migration
showFirstRunActivity();
if (mLauncherClings.shouldShowFirstRunOrMigrationClings()) { if (mLauncherClings.shouldShowFirstRunOrMigrationClings()) {
if (mModel.canMigrateFromOldLauncherDb(this)) { if (mModel.canMigrateFromOldLauncherDb(this)) {
mLauncherClings.showMigrationCling(); mLauncherClings.showMigrationCling();
@@ -517,21 +524,6 @@ public class Launcher extends Activity
protected void populateCustomContentContainer() { protected void populateCustomContentContainer() {
} }
/**
* To be overridden by subclasses to indicate that there is an activity to launch
* before showing the standard launcher experience.
*/
protected boolean hasFirstRunActivity() {
return false;
}
/**
* To be overridden by subclasses to launch any first run activity
*/
protected Intent getFirstRunActivity() {
return null;
}
/** /**
* Invoked by subclasses to signal a change to the {@link #addCustomContentToLeft} value to * Invoked by subclasses to signal a change to the {@link #addCustomContentToLeft} value to
* ensure the custom content page is added or removed if necessary. * ensure the custom content page is added or removed if necessary.
@@ -4441,20 +4433,38 @@ public class Launcher extends Activity
mLauncherClings.dismissFolderCling(v); mLauncherClings.dismissFolderCling(v);
} }
/**
* To be overridden by subclasses to indicate that there is an activity to launch
* before showing the standard launcher experience.
*/
protected boolean hasFirstRunActivity() {
return false;
}
/**
* To be overridden by subclasses to launch any first run activity
*/
protected Intent getFirstRunActivity() {
return null;
}
private boolean shouldRunFirstRunActivity() { private boolean shouldRunFirstRunActivity() {
return !ActivityManager.isRunningInTestHarness() && return !ActivityManager.isRunningInTestHarness() &&
!mSharedPrefs.getBoolean(FIRST_RUN_ACTIVITY_DISPLAYED, false); !mSharedPrefs.getBoolean(FIRST_RUN_ACTIVITY_DISPLAYED, false);
} }
public void showFirstRunActivity() { public boolean showFirstRunActivity() {
if (shouldRunFirstRunActivity() && if (shouldRunFirstRunActivity() &&
hasFirstRunActivity()) { hasFirstRunActivity()) {
Intent firstRunIntent = getFirstRunActivity(); Intent firstRunIntent = getFirstRunActivity();
if (firstRunIntent != null) { if (firstRunIntent != null) {
startActivity(firstRunIntent); startActivity(firstRunIntent);
markFirstRunActivityShown(); markFirstRunActivityShown();
return true;
} }
} }
return false;
} }
private void markFirstRunActivityShown() { private void markFirstRunActivityShown() {
@@ -4463,6 +4473,61 @@ public class Launcher extends Activity
editor.apply(); editor.apply();
} }
/**
* To be overridden by subclasses to indicate that there is an in-activity full-screen intro
* screen that must be displayed and dismissed.
*/
protected boolean hasDismissableIntroScreen() {
return false;
}
/**
* Full screen intro screen to be shown and dismissed before the launcher can be used.
*/
protected View getIntroScreen() {
return null;
}
/**
* To be overriden by subclasses to indicate whether the in-activity intro screen has been
* dismissed. This method is ignored if #hasDismissableIntroScreen returns false.
*/
private boolean shouldShowIntroScreen() {
return hasDismissableIntroScreen() &&
!mSharedPrefs.getBoolean(INTRO_SCREEN_DISMISSED, false);
}
protected void showIntroScreen() {
View introScreen = getIntroScreen();
changeWallpaperVisiblity(false);
if (introScreen != null) {
mDragLayer.showOverlayView(introScreen);
}
}
public void dismissIntroScreen() {
markIntroScreenDismissed();
if (showFirstRunActivity()) {
// We delay hiding the intro view until the first run activity is showing. This
// avoids a blip.
mWorkspace.postDelayed(new Runnable() {
@Override
public void run() {
mDragLayer.dismissOverlayView();
}
}, ACTIVITY_START_DELAY);
} else {
mDragLayer.dismissOverlayView();
}
changeWallpaperVisiblity(true);
}
private void markIntroScreenDismissed() {
SharedPreferences.Editor editor = mSharedPrefs.edit();
editor.putBoolean(INTRO_SCREEN_DISMISSED, true);
editor.apply();
}
void showWorkspaceSearchAndHotseat() { void showWorkspaceSearchAndHotseat() {
if (mWorkspace != null) mWorkspace.setAlpha(1f); if (mWorkspace != null) mWorkspace.setAlpha(1f);
if (mHotseat != null) mHotseat.setAlpha(1f); if (mHotseat != null) mHotseat.setAlpha(1f);