1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
package com.android.launcher3.dragndrop;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.RemoteViews;
import com.android.launcher3.BaseActivity;
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.LauncherAppWidgetProviderInfo;
import com.android.launcher3.widget.WidgetCell;
/**
* Extension of {@link WidgetCell} which supports generating previews from {@link RemoteViews}
*/
public class LivePreviewWidgetCell extends WidgetCell {
private RemoteViews mPreview;
public LivePreviewWidgetCell(Context context) {
this(context, null);
}
public LivePreviewWidgetCell(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public LivePreviewWidgetCell(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public void setPreview(RemoteViews view) {
mPreview = view;
}
@Override
public void ensurePreview() {
if (mPreview != null && mActiveRequest == null) {
Bitmap preview = generateFromRemoteViews(
mActivity, mPreview, mItem.widgetInfo, mPresetPreviewSize, new int[1]);
if (preview != null) {
applyPreview(preview);
return;
}
}
super.ensurePreview();
}
/**
* Generates a bitmap by inflating {@param views}.
* @see com.android.launcher3.WidgetPreviewLoader#generateWidgetPreview
*
* TODO: Consider moving this to the background thread.
*/
public static Bitmap generateFromRemoteViews(BaseActivity activity, RemoteViews views,
LauncherAppWidgetProviderInfo info, int previewSize, int[] preScaledWidthOut) {
DeviceProfile dp = activity.getDeviceProfile();
int viewWidth = dp.cellWidthPx * info.spanX;
int viewHeight = dp.cellHeightPx * info.spanY;
final View v;
try {
v = views.apply(activity, new FrameLayout(activity));
v.measure(MeasureSpec.makeMeasureSpec(viewWidth, MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(viewHeight, MeasureSpec.EXACTLY));
viewWidth = v.getMeasuredWidth();
viewHeight = v.getMeasuredHeight();
v.layout(0, 0, viewWidth, viewHeight);
} catch (Exception e) {
return null;
}
preScaledWidthOut[0] = viewWidth;
final int bitmapWidth, bitmapHeight;
final float scale;
if (viewWidth > previewSize) {
scale = ((float) previewSize) / viewWidth;
bitmapWidth = previewSize;
bitmapHeight = (int) (viewHeight * scale);
} else {
scale = 1;
bitmapWidth = viewWidth;
bitmapHeight = viewHeight;
}
Bitmap preview = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(preview);
c.scale(scale, scale);
v.draw(c);
c.setBitmap(null);
return preview;
}
}
|