Merge "Jailing the saved instance state of all the dynamically generated views" into ub-launcher3-burnaby-polish
This commit is contained in:
@@ -81,6 +81,9 @@
|
||||
<!-- View ID to use for QSB widget -->
|
||||
<item type="id" name="qsb_widget" />
|
||||
|
||||
<!-- View ID used by cell layout to jail its content -->
|
||||
<item type="id" name="cell_layout_jail_id" />
|
||||
|
||||
<!-- Accessibility actions -->
|
||||
<item type="id" name="action_remove" />
|
||||
<item type="id" name="action_uninstall" />
|
||||
|
||||
@@ -25,7 +25,6 @@ import android.animation.ValueAnimator.AnimatorUpdateListener;
|
||||
import android.annotation.TargetApi;
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.content.res.TypedArray;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Color;
|
||||
@@ -48,13 +47,13 @@ import android.view.ViewDebug;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.accessibility.AccessibilityEvent;
|
||||
import android.view.animation.DecelerateInterpolator;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.android.launcher3.BubbleTextView.BubbleTextShadowHandler;
|
||||
import com.android.launcher3.FolderIcon.FolderRingAnimator;
|
||||
import com.android.launcher3.accessibility.DragAndDropAccessibilityDelegate;
|
||||
import com.android.launcher3.accessibility.FolderAccessibilityHelper;
|
||||
import com.android.launcher3.accessibility.WorkspaceAccessibilityHelper;
|
||||
import com.android.launcher3.util.ParcelableSparseArray;
|
||||
import com.android.launcher3.util.Thunk;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -86,6 +85,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler {
|
||||
private int mMaxGap;
|
||||
private boolean mDropPending = false;
|
||||
private boolean mIsDragTarget = true;
|
||||
private boolean mJailContent = true;
|
||||
|
||||
// These are temporary variables to prevent having to allocate a new object just to
|
||||
// return an (x, y) value from helper functions. Do NOT use them to maintain other state.
|
||||
@@ -189,7 +189,6 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler {
|
||||
mLauncher = (Launcher) context;
|
||||
|
||||
DeviceProfile grid = mLauncher.getDeviceProfile();
|
||||
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CellLayout, defStyle, 0);
|
||||
|
||||
mCellWidth = mCellHeight = -1;
|
||||
mFixedCellWidth = mFixedCellHeight = -1;
|
||||
@@ -203,10 +202,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler {
|
||||
mPreviousReorderDirection[0] = INVALID_DIRECTION;
|
||||
mPreviousReorderDirection[1] = INVALID_DIRECTION;
|
||||
|
||||
a.recycle();
|
||||
|
||||
setAlwaysDrawnWithCacheEnabled(false);
|
||||
|
||||
final Resources res = getResources();
|
||||
mHotseatScale = (float) grid.hotseatIconSizePx / grid.iconSizePx;
|
||||
|
||||
@@ -426,10 +422,36 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler {
|
||||
}
|
||||
}
|
||||
|
||||
boolean getIsDragOverlapping() {
|
||||
public boolean getIsDragOverlapping() {
|
||||
return mIsDragOverlapping;
|
||||
}
|
||||
|
||||
public void disableJailContent() {
|
||||
mJailContent = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void dispatchSaveInstanceState(SparseArray<Parcelable> container) {
|
||||
if (mJailContent) {
|
||||
ParcelableSparseArray jail = getJailedArray(container);
|
||||
super.dispatchSaveInstanceState(jail);
|
||||
container.put(R.id.cell_layout_jail_id, jail);
|
||||
} else {
|
||||
super.dispatchSaveInstanceState(container);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void dispatchRestoreInstanceState(SparseArray<Parcelable> container) {
|
||||
super.dispatchRestoreInstanceState(mJailContent ? getJailedArray(container) : container);
|
||||
}
|
||||
|
||||
private ParcelableSparseArray getJailedArray(SparseArray<Parcelable> container) {
|
||||
final Parcelable parcelable = container.get(R.id.cell_layout_jail_id);
|
||||
return parcelable instanceof ParcelableSparseArray ?
|
||||
(ParcelableSparseArray) parcelable : new ParcelableSparseArray();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDraw(Canvas canvas) {
|
||||
if (!mIsDragTarget) {
|
||||
|
||||
@@ -124,7 +124,6 @@ import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
/**
|
||||
* Default launcher application.
|
||||
@@ -193,8 +192,6 @@ public class Launcher extends Activity
|
||||
private static final String RUNTIME_STATE_PENDING_ADD_WIDGET_INFO = "launcher.add_widget_info";
|
||||
// Type: parcelable
|
||||
private static final String RUNTIME_STATE_PENDING_ADD_WIDGET_ID = "launcher.add_widget_id";
|
||||
// Type: int[]
|
||||
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";
|
||||
@@ -228,9 +225,6 @@ public class Launcher extends Activity
|
||||
private static final int ON_ACTIVITY_RESULT_ANIMATION_DELAY = 500;
|
||||
private static final int ACTIVITY_START_DELAY = 1000;
|
||||
|
||||
private HashMap<Integer, Integer> mItemIdToViewId = new HashMap<Integer, Integer>();
|
||||
private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1);
|
||||
|
||||
// How long to wait before the new-shortcut animation automatically pans the workspace
|
||||
private static int NEW_APPS_PAGE_MOVE_DELAY = 500;
|
||||
private static int NEW_APPS_ANIMATION_INACTIVE_TIMEOUT_SECONDS = 5;
|
||||
@@ -656,34 +650,12 @@ public class Launcher extends Activity
|
||||
return !isWorkspaceLoading();
|
||||
}
|
||||
|
||||
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
|
||||
public static int generateViewId() {
|
||||
if (Utilities.ATLEAST_JB_MR1) {
|
||||
return View.generateViewId();
|
||||
} else {
|
||||
// View.generateViewId() is not available. The following fallback logic is a copy
|
||||
// of its implementation.
|
||||
for (;;) {
|
||||
final int result = sNextGeneratedId.get();
|
||||
// aapt-generated IDs have the high byte nonzero; clamp to the range under that.
|
||||
int newValue = result + 1;
|
||||
if (newValue > 0x00FFFFFF) newValue = 1; // Roll over to 1, not 0.
|
||||
if (sNextGeneratedId.compareAndSet(result, newValue)) {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public int getViewIdForItem(ItemInfo info) {
|
||||
// This cast is safe given the > 2B range for int.
|
||||
int itemId = (int) info.id;
|
||||
if (mItemIdToViewId.containsKey(itemId)) {
|
||||
return mItemIdToViewId.get(itemId);
|
||||
}
|
||||
int viewId = generateViewId();
|
||||
mItemIdToViewId.put(itemId, viewId);
|
||||
return viewId;
|
||||
// aapt-generated IDs have the high byte nonzero; clamp to the range under that.
|
||||
// This cast is safe as long as the id < 0x00FFFFFF
|
||||
// Since we jail all the dynamically generated views, there should be no clashes
|
||||
// with any other views.
|
||||
return (int) info.id;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1339,7 +1311,6 @@ public class Launcher extends Activity
|
||||
*
|
||||
* @param savedState The previous state.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
private void restoreState(Bundle savedState) {
|
||||
if (savedState == null) {
|
||||
return;
|
||||
@@ -1375,9 +1346,6 @@ public class Launcher extends Activity
|
||||
setWaitingForResult(true);
|
||||
mRestoring = true;
|
||||
}
|
||||
|
||||
mItemIdToViewId = (HashMap<Integer, Integer>)
|
||||
savedState.getSerializable(RUNTIME_STATE_VIEW_IDS);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2021,7 +1989,6 @@ public class Launcher extends Activity
|
||||
|
||||
// Save the current widgets tray?
|
||||
// TODO(hyunyoungs)
|
||||
outState.putSerializable(RUNTIME_STATE_VIEW_IDS, mItemIdToViewId);
|
||||
|
||||
if (mLauncherCallbacks != null) {
|
||||
mLauncherCallbacks.onSaveInstanceState(outState);
|
||||
|
||||
@@ -579,6 +579,7 @@ public class Workspace extends PagedView
|
||||
CellLayout customScreen = (CellLayout)
|
||||
mLauncher.getLayoutInflater().inflate(R.layout.workspace_screen, this, false);
|
||||
customScreen.disableDragTarget();
|
||||
customScreen.disableJailContent();
|
||||
|
||||
mWorkspaceScreens.put(CUSTOM_CONTENT_SCREEN_ID, customScreen);
|
||||
mScreenOrder.add(0, CUSTOM_CONTENT_SCREEN_ID);
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
/**
|
||||
* Copyright (C) 2015 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.
|
||||
*/
|
||||
package com.android.launcher3.util;
|
||||
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import android.util.SparseArray;
|
||||
|
||||
public class ParcelableSparseArray extends SparseArray<Parcelable> implements Parcelable {
|
||||
public int describeContents() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
public void writeToParcel(Parcel dest, int flags) {
|
||||
final int count = size();
|
||||
dest.writeInt(count);
|
||||
for (int i = 0; i < count; i++) {
|
||||
dest.writeInt(keyAt(i));
|
||||
dest.writeParcelable(valueAt(i), 0);
|
||||
}
|
||||
}
|
||||
|
||||
public static final Parcelable.Creator<ParcelableSparseArray> CREATOR =
|
||||
new Parcelable.Creator<ParcelableSparseArray>() {
|
||||
public ParcelableSparseArray createFromParcel(Parcel source) {
|
||||
final ParcelableSparseArray array = new ParcelableSparseArray();
|
||||
final ClassLoader loader = array.getClass().getClassLoader();
|
||||
final int count = source.readInt();
|
||||
for (int i = 0; i < count; i++) {
|
||||
array.put(source.readInt(), source.readParcelable(loader));
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
public ParcelableSparseArray[] newArray(int size) {
|
||||
return new ParcelableSparseArray[size];
|
||||
}
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user