Skip to content

Commit cc7bf6a

Browse files
committed
feat: add resizeMode prop to ImageWidget
1 parent 0f23d85 commit cc7bf6a

12 files changed

Lines changed: 219 additions & 0 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1010
### Added
1111

1212
- Add `lineHeight` and `lineSpacingExtra` style props to `TextWidget`
13+
- Add `resizeMode` prop to `ImageWidget`
1314

1415
### Fixed
1516

android/src/main/java/com/reactnativeandroidwidget/builder/widget/ImageWidget.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ protected void applyProps() {
3636
bitmapDrawable.setCornerRadius(dpToPx(props.getDouble("radius")));
3737
}
3838

39+
if (props.hasKey("resizeMode")) {
40+
view.setScaleType(getScaleType(props.getString("resizeMode")));
41+
}
42+
3943
view.setImageDrawable(bitmapDrawable);
4044
}
4145

@@ -51,4 +55,18 @@ private Bitmap getBitmapFromURL(String src, int width, int height) {
5155
return null;
5256
}
5357
}
58+
59+
private ImageView.ScaleType getScaleType(String resizeMode) {
60+
switch (resizeMode) {
61+
case "cover":
62+
return ImageView.ScaleType.CENTER_CROP;
63+
case "stretch":
64+
return ImageView.ScaleType.FIT_XY;
65+
case "center":
66+
return ImageView.ScaleType.CENTER;
67+
case "contain":
68+
default:
69+
return ImageView.ScaleType.FIT_CENTER;
70+
}
71+
}
5472
}

example-expo/app.config.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,13 @@ const widgetConfig: WithAndroidWidgetsParams = {
1515
description: 'Track your fitness level',
1616
previewImage: './assets/widget-preview/fitness.png',
1717
},
18+
{
19+
name: 'ImageResize',
20+
label: 'Image Resize',
21+
minHeight: '160dp',
22+
minWidth: '300dp',
23+
description: 'Test image resize modes',
24+
},
1825
{
1926
name: 'Resizable',
2027
minHeight: '100dp',

example/android/app/src/main/AndroidManifest.xml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,19 @@
5656
android:resource="@xml/widgetprovider_fitness" />
5757
</receiver>
5858

59+
<receiver
60+
android:name=".widget.ImageResize"
61+
android:exported="false"
62+
android:label="Image Resize">
63+
<intent-filter>
64+
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
65+
<action android:name="com.androidwidgetexample.WIDGET_CLICK" />
66+
</intent-filter>
67+
<meta-data
68+
android:name="android.appwidget.provider"
69+
android:resource="@xml/widgetprovider_imageresize" />
70+
</receiver>
71+
5972
<receiver
6073
android:name=".widget.Resizable"
6174
android:exported="false"
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.androidwidgetexample.widget;
2+
3+
import com.reactnativeandroidwidget.RNWidgetProvider;
4+
5+
public class ImageResize extends RNWidgetProvider {
6+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:minWidth="300dp"
4+
android:minHeight="160dp"
5+
6+
android:updatePeriodMillis="0"
7+
8+
android:initialLayout="@layout/rn_widget"
9+
10+
android:resizeMode="none"
11+
12+
android:widgetCategory="home_screen">
13+
</appwidget-provider>

example/src/App.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { ClickDemoWidgetPreviewScreen } from './screens/widget-preview/ClickDemo
1212
import { DarkModeDemoWidgetPreviewScreen } from './screens/widget-preview/DarkModeDemoWidgetPreviewScreen';
1313
import { DebugEventsWidgetPreviewScreen } from './screens/widget-preview/DebugEventsWidgetPreviewScreen';
1414
import { FitnessWidgetPreviewScreen } from './screens/widget-preview/FitnessWidgetPreviewScreen';
15+
import { ImageResizeWidgetPreviewScreen } from './screens/widget-preview/ImageResizeWidgetPreviewScreen';
1516
import { ListDemoWidgetPreviewDeepLinkScreen } from './screens/widget-preview/ListDemoWidgetPreviewDeepLinkScreen';
1617
import { ListDemoWidgetPreviewScreen } from './screens/widget-preview/ListDemoWidgetPreviewScreen';
1718
import { ResizableMusicWidgetPreviewScreen } from './screens/widget-preview/ResizableMusicWidgetPreviewScreen';
@@ -59,6 +60,11 @@ export function App() {
5960
component={FitnessWidgetPreviewScreen}
6061
options={{ title: 'Fitness Widget Preview' }}
6162
/>
63+
<Stack.Screen
64+
name="ImageResizeWidgetPreviewScreen"
65+
component={ImageResizeWidgetPreviewScreen}
66+
options={{ title: 'Image Resize Widget Preview' }}
67+
/>
6268
<Stack.Screen
6369
name="ResizableMusicWidgetPreviewScreen"
6470
component={ResizableMusicWidgetPreviewScreen}

example/src/screens/ListScreen.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ function Separator() {
1616
export type ExampleScreens = {
1717
ListScreen: undefined;
1818
FitnessWidgetPreviewScreen: undefined;
19+
ImageResizeWidgetPreviewScreen: undefined;
1920
ResizableMusicWidgetPreviewScreen: undefined;
2021
RotatedWidgetPreviewScreen: undefined;
2122
ShopifyWidgetPreviewScreen: undefined;
@@ -41,6 +42,10 @@ const items: Item[] = [
4142
title: 'Fitness Widget Preview',
4243
screen: 'FitnessWidgetPreviewScreen',
4344
},
45+
{
46+
title: 'Image Resize Widget Preview',
47+
screen: 'ImageResizeWidgetPreviewScreen',
48+
},
4449
{
4550
title: 'Resizable Music Widget Preview',
4651
screen: 'ResizableMusicWidgetPreviewScreen',
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import * as React from 'react';
2+
3+
import { Button, StyleSheet, View } from 'react-native';
4+
import {
5+
WidgetPreview,
6+
type ImageWidgetResizeMode,
7+
} from 'react-native-android-widget';
8+
9+
import { ImageResizeWidget } from '../../widgets/ImageResizeWidget';
10+
11+
const resizeModes: ImageWidgetResizeMode[] = [
12+
'cover',
13+
'contain',
14+
'stretch',
15+
'center',
16+
];
17+
18+
export function ImageResizeWidgetPreviewScreen() {
19+
const [resizeMode, setResizeMode] =
20+
React.useState<ImageWidgetResizeMode>('cover');
21+
22+
return (
23+
<View style={styles.container}>
24+
<View style={styles.buttonContainer}>
25+
{resizeModes.map((mode) => (
26+
<View key={mode} style={styles.button}>
27+
<Button
28+
title={mode}
29+
onPress={() => setResizeMode(mode)}
30+
color={resizeMode === mode ? '#1f6feb' : undefined}
31+
/>
32+
</View>
33+
))}
34+
</View>
35+
36+
<WidgetPreview
37+
renderWidget={({ width, height }) => (
38+
<ImageResizeWidget
39+
height={height}
40+
width={width}
41+
resizeMode={resizeMode}
42+
/>
43+
)}
44+
height={180}
45+
width={320}
46+
showBorder
47+
/>
48+
</View>
49+
);
50+
}
51+
52+
const styles = StyleSheet.create({
53+
container: {
54+
flex: 1,
55+
alignItems: 'center',
56+
justifyContent: 'center',
57+
},
58+
buttonContainer: {
59+
flexDirection: 'row',
60+
flexWrap: 'wrap',
61+
justifyContent: 'center',
62+
marginBottom: 16,
63+
},
64+
button: {
65+
margin: 4,
66+
},
67+
});

example/src/widgetTaskHandler.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
DebugEventsWidget,
1111
} from './widgets/DebugEventsWidget';
1212
import { FitnessWidget } from './widgets/FitnessWidget';
13+
import { ImageResizeWidget } from './widgets/ImageResizeWidget';
1314
import { ListDemoWidget } from './widgets/ListDemoWidget';
1415
import { ResizableMusicWidget } from './widgets/ResizableMusicWidget';
1516
import { RotatedWidget } from './widgets/RotatedWidget';
@@ -25,6 +26,7 @@ const nameToWidget = {
2526
List: ListDemoWidget,
2627
DebugEvents: DebugEventsWidget,
2728
Configurable: ConfigurableWidget,
29+
ImageResize: ImageResizeWidget,
2830
};
2931

3032
const COUNTER_STORAGE_KEY = 'CounterWidget:count';

0 commit comments

Comments
 (0)