summaryrefslogtreecommitdiffstats
path: root/src/com/cyanogenmod
diff options
context:
space:
mode:
authornebkat <nebkat@teamhacksung.org>2012-11-30 19:41:34 +0000
committernebkat <nebkat@teamhacksung.org>2012-12-01 21:55:43 +0000
commit9180c157cc84b76ee92d26d2ee4f199da4fc0038 (patch)
tree320b5552014dfb15bf000c15a728c02796bd8704 /src/com/cyanogenmod
parente74a54343ce7896b5005154e8bcbc7d5f06c7808 (diff)
downloadpackages_apps_trebuchet-9180c157cc84b76ee92d26d2ee4f199da4fc0038.zip
packages_apps_trebuchet-9180c157cc84b76ee92d26d2ee4f199da4fc0038.tar.gz
packages_apps_trebuchet-9180c157cc84b76ee92d26d2ee4f199da4fc0038.tar.bz2
Wallpaper Hack
Normally the wallpaper is drawn by the system in a separate window. This means that the wallpaper can often be drawn out of sync with the launcher. This hack gets the wallpaper bitmap and draws it manually (in sync with the rest of the launcher). This increases performance greatly. Change-Id: I6aaf9c574cabcf2ee0bfeef1076140421108331d
Diffstat (limited to 'src/com/cyanogenmod')
-rw-r--r--src/com/cyanogenmod/trebuchet/Launcher.java13
-rw-r--r--src/com/cyanogenmod/trebuchet/Workspace.java72
-rw-r--r--src/com/cyanogenmod/trebuchet/preference/PreferencesProvider.java4
3 files changed, 84 insertions, 5 deletions
diff --git a/src/com/cyanogenmod/trebuchet/Launcher.java b/src/com/cyanogenmod/trebuchet/Launcher.java
index 9ef20c6..e5ef20e 100644
--- a/src/com/cyanogenmod/trebuchet/Launcher.java
+++ b/src/com/cyanogenmod/trebuchet/Launcher.java
@@ -311,6 +311,8 @@ public final class Launcher extends Activity
private boolean mHideIconLabels;
private boolean mAutoRotate;
+ private boolean mWallpaperVisible;
+
private Runnable mBuildLayersRunnable = new Runnable() {
public void run() {
if (mWorkspace != null) {
@@ -772,6 +774,7 @@ public final class Launcher extends Activity
// (framework issue). On resuming, we ensure that any widgets are inflated for the current
// orientation.
getWorkspace().reinflateWidgetsIfNecessary();
+ getWorkspace().checkWallpaper();
// Again, as with the above scenario, it's possible that one or more of the global icons
// were updated in the wrong orientation.
@@ -1251,6 +1254,8 @@ public final class Launcher extends Activity
} else if (Intent.ACTION_USER_PRESENT.equals(action)) {
mUserPresent = true;
updateRunning();
+ } else if (Intent.ACTION_SET_WALLPAPER.equals(action)) {
+ mWorkspace.checkWallpaper();
}
}
};
@@ -1263,6 +1268,7 @@ public final class Launcher extends Activity
final IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_USER_PRESENT);
+ filter.addAction(Intent.ACTION_SET_WALLPAPER);
registerReceiver(mReceiver, filter);
mAttached = true;
@@ -2469,8 +2475,13 @@ public final class Launcher extends Activity
}
}
+ void setWallpaperVisibility(boolean visible) {
+ mWallpaperVisible = visible;
+ updateWallpaperVisibility(visible);
+ }
+
void updateWallpaperVisibility(boolean visible) {
- int wpflags = visible ? WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER : 0;
+ int wpflags = visible && mWallpaperVisible ? WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER : 0;
int curflags = getWindow().getAttributes().flags
& WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
if (wpflags != curflags) {
diff --git a/src/com/cyanogenmod/trebuchet/Workspace.java b/src/com/cyanogenmod/trebuchet/Workspace.java
index e404b5c..bcaaccf 100644
--- a/src/com/cyanogenmod/trebuchet/Workspace.java
+++ b/src/com/cyanogenmod/trebuchet/Workspace.java
@@ -36,10 +36,12 @@ import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
+import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.Region.Op;
+import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.IBinder;
@@ -106,8 +108,14 @@ public class Workspace extends SmoothPagedView
private int mOriginalPageSpacing;
private final WallpaperManager mWallpaperManager;
+ private boolean mWallpaperHack;
+ private Bitmap mWallpaperBitmap;
+ private float mWallpaperScrollX;
+ private float mWallpaperScrollY;
+ private int[] mWallpaperOffsets = new int[2];
+ private Paint mPaint = new Paint();
private IBinder mWindowToken;
- private static final float WALLPAPER_SCREENS_SPAN = 2f;
+ private static final float DEFAULT_WALLPAPER_SCREENS_SPAN = 2f;
/**
* CellInfo for the cell that is currently being dragged
@@ -349,17 +357,20 @@ public class Workspace extends SmoothPagedView
if (mDefaultHomescreen >= mNumberHomescreens) {
mDefaultHomescreen = mNumberHomescreens / 2;
}
+
mScreenPaddingVertical = PreferencesProvider.Interface.Homescreen.getScreenPaddingVertical(context);
mScreenPaddingHorizontal = PreferencesProvider.Interface.Homescreen.getScreenPaddingHorizontal(context);
mShowSearchBar = PreferencesProvider.Interface.Homescreen.getShowSearchBar(context);
mResizeAnyWidget = PreferencesProvider.Interface.Homescreen.getResizeAnyWidget(context);
mHideIconLabels = PreferencesProvider.Interface.Homescreen.getHideIconLabels(context);
mScrollWallpaper = PreferencesProvider.Interface.Homescreen.Scrolling.getScrollWallpaper(context);
+ mWallpaperHack = PreferencesProvider.Interface.Homescreen.Scrolling.getWallpaperHack(context);
mShowScrollingIndicator = PreferencesProvider.Interface.Homescreen.Indicator.getShowScrollingIndicator(context);
mFadeScrollingIndicator = PreferencesProvider.Interface.Homescreen.Indicator.getFadeScrollingIndicator(context);
mShowDockDivider = PreferencesProvider.Interface.Homescreen.Indicator.getShowDockDivider(context);
initWorkspace();
+ checkWallpaper();
// Disable multitouch across the workspace/all apps/customize tray
setMotionEventSplittingEnabled(true);
@@ -503,6 +514,21 @@ public class Workspace extends SmoothPagedView
mFlingThresholdVelocity = (int) (FLING_THRESHOLD_VELOCITY * mDensity);
}
+ protected void checkWallpaper() {
+ if (mWallpaperHack) {
+ if (mWallpaperBitmap != null) {
+ mWallpaperBitmap = null;
+ }
+ if (mWallpaperManager.getWallpaperInfo() == null) {
+ Drawable wallpaper = mWallpaperManager.getDrawable();
+ if (wallpaper instanceof BitmapDrawable) {
+ mWallpaperBitmap = ((BitmapDrawable) wallpaper).getBitmap();
+ }
+ }
+ }
+ mLauncher.setWallpaperVisibility(mWallpaperBitmap == null);
+ }
+
@Override
protected int getScrollMode() {
return SmoothPagedView.X_LARGE_MODE;
@@ -943,7 +969,7 @@ public class Workspace extends SmoothPagedView
mWallpaperWidth = (int) (maxDim * wallpaperTravelToScreenWidthRatio(maxDim, minDim));
mWallpaperHeight = maxDim;
} else {
- mWallpaperWidth = Math.max((int) (minDim * WALLPAPER_SCREENS_SPAN), maxDim);
+ mWallpaperWidth = Math.max((int) (minDim * DEFAULT_WALLPAPER_SCREENS_SPAN), maxDim);
mWallpaperHeight = maxDim;
}
new Thread("setWallpaperDimension") {
@@ -995,7 +1021,9 @@ public class Workspace extends SmoothPagedView
}
private void centerWallpaperOffset() {
- if (mWindowToken != null) {
+ if (mWallpaperHack) {
+ mWallpaperScrollX = 0.5f;
+ } else if (mWindowToken != null) {
mWallpaperManager.setWallpaperOffsetSteps(0.5f, 0);
mWallpaperManager.setWallpaperOffsets(mWindowToken, 0.5f, 0);
}
@@ -1017,7 +1045,10 @@ public class Workspace extends SmoothPagedView
updateNow = keepUpdating = mWallpaperOffset.computeScrollOffset();
}
if (updateNow) {
- if (mWindowToken != null) {
+ if (mWallpaperHack) {
+ mWallpaperScrollX = mWallpaperOffset.getCurrX();
+ mWallpaperScrollY = mWallpaperOffset.getCurrY();
+ } else if (mWindowToken != null) {
mWallpaperManager.setWallpaperOffsets(mWindowToken,
mWallpaperOffset.getCurrX(), mWallpaperOffset.getCurrY());
}
@@ -1391,12 +1422,45 @@ public class Workspace extends SmoothPagedView
super.onLayout(changed, left, top, right, bottom);
}
+
+ protected void onSizeChanged (int w, int h, int oldw, int oldh) {
+ super.onSizeChanged(w, h, oldw, oldh);
+
+ getLocationOnScreen(mWallpaperOffsets);
+ }
+
@Override
protected void onDraw(Canvas canvas) {
if (mScrollWallpaper) {
updateWallpaperOffsets();
}
+ // Draw the wallpaper if necessary
+ if (mWallpaperHack && mWallpaperBitmap != null) {
+ float x = getScrollX();
+ float y = getScrollY();
+
+ int width = getWidth();
+ int height = getHeight();
+ int wallpaperWidth = mWallpaperBitmap.getWidth();
+ int wallpaperHeight = mWallpaperBitmap.getHeight();
+
+ if (width + mWallpaperOffsets[0] > wallpaperWidth) {
+ // Wallpaper is smaller than screen
+ x += (width - wallpaperWidth) / 2;
+ } else {
+ x -= mWallpaperScrollX * (wallpaperWidth - width) + mWallpaperOffsets[0];
+ }
+ if (height + mWallpaperOffsets[1] > wallpaperHeight) {
+ // Wallpaper is smaller than screen
+ y += (height - wallpaperHeight) / 2;
+ } else {
+ y -= mWallpaperScrollY * (wallpaperHeight - height) + mWallpaperOffsets[1];
+ }
+
+ canvas.drawBitmap(mWallpaperBitmap, x, y, mPaint);
+ }
+
// Draw the background gradient if necessary
if (mBackground != null && mBackgroundAlpha > 0.0f && mDrawBackground) {
int alpha = (int) (mBackgroundAlpha * 255);
diff --git a/src/com/cyanogenmod/trebuchet/preference/PreferencesProvider.java b/src/com/cyanogenmod/trebuchet/preference/PreferencesProvider.java
index b4228c3..b6c983b 100644
--- a/src/com/cyanogenmod/trebuchet/preference/PreferencesProvider.java
+++ b/src/com/cyanogenmod/trebuchet/preference/PreferencesProvider.java
@@ -83,6 +83,10 @@ public final class PreferencesProvider {
final SharedPreferences preferences = context.getSharedPreferences(PREFERENCES_KEY, 0);
return preferences.getBoolean("ui_homescreen_scrolling_scroll_wallpaper", true);
}
+ public static boolean getWallpaperHack(Context context) {
+ final SharedPreferences preferences = context.getSharedPreferences(PREFERENCES_KEY, 0);
+ return preferences.getBoolean("ui_homescreen_scrolling_wallpaper_hack", true);
+ }
}
public static class Indicator {
public static boolean getShowScrollingIndicator(Context context) {