SlideShare une entreprise Scribd logo
1  sur  78
Télécharger pour lire hors ligne
Android Wear Essen-als
Improve your Android skills, building watch faces
What you should know about
Android Wear
Android Wear
• Android SDK
• Specific wear APIs in external libraries (support:wearable,
play-services-wearable)
• All devices are compa>ble with API 23 (minSdkVersion 23)
• Only a few devices are compa>ble with API > 23 ("Android Wear
2.0")
Crea%ng a wear app
h"ps://developer.android.com/training/building-wearables.html
Crea%ng a wear app
• Ac$vity
• AndroidManifest.xml
• LayoutInflater
• You know the stuff...
Crea%ng a watch face
h"ps://developer.android.com/training/wearables/watch-faces/index.html
Crea%ng a watch face
1. Create a class that extends
CanvasWatchFaceService.Engine
2. Create a Service that extends CanvasWatchFaceService and
override onCreateEngine
Prefer OpenGL ES instead of the Canvas API ?
Use Gles2WatchFaceService instead
Create a watch face project
Ba#ery usage
AMOLED
Interac(ve mode (default)
Ambient mode / Low-bit Ambient
Low-bit Ambient / Ambient
Burn-in effect
Burn-in effect
h"ps://en.wikipedia.org/wiki/Screen_burn-in
Burn-in effect
Burn-in effect
Avoid burn-in
• Do not draw large areas of pixels in ambient mode
• Do not place content within 10 pixels of the edge of the screen
I'm bored, can I see some code?
class Engine extends CanvasWatchFaceService.Engine {
Paint paint;
@Override void onCreate(SurfaceHolder holder) {
paint = new Paint();
paint.setTextSize(80_DIP);
paint.setStyle(Style.FILL);
paint.setColor(Color.MAGENTA);
paint.setTextAlign(Align.CENTER);
paint.setAntiAlias(true);
}
@Override void onDraw(Canvas canvas, Rect bounds) {
canvas.drawText("18:42", bounds.centerX(), bounds.centerY(), paint);
}
}
Style.STROKE
if (inAmbientMode) {
paint.setColor(WHITE);
paint.setStyle(STROKE);
paint.setStrokeWidth(1_DIP);
if (lowBitEnabled) {
paint.setAntiAlias(false);
}
}
Lifecycle
Enough theory
10mn to create a watch face
#1: Draw the background
Paint backgroundPaint = new Paint();
@Override void onCreate(SurfaceHolder holder) {
super.onCreate(holder);
backgroundPaint.setStyle(FILL);
backgroundPaint.setColor(DKGRAY);
backgroundPaint.setAntiAlias(true);
}
@Override void onDraw(Canvas canvas, Rect bounds) {
canvas.drawRect(0, 0, bounds.width(), bounds.height(), backgroundPaint);
}
Background
Gradient: Linear / Sweep / Radial
LinearGradient(0, centerY, width, centerY, WHITE, BLACK, CLAMP));
SweepGradient(radius, radius, WHITE, BLACK));
RadialGradient(centerX, centerY, radius, WHITE, BLACK, CLAMP));
paint.setShader(shader);
Tile mode: Clamp / Mirror / Repeat
tileMode = Shader.TileMode.CLAMP;
tileMode = Shader.TileMode.MIRROR;
tileMode = Shader.TileMode.REPEAT;
new RadialGradient(radius, radius, radius / 10, WHITE, BLACK, tileMode));
Gradient posi-ons
int[] colors = new int[] { RED, GREEN, BLUE, MAGENTA, CYAN};
float[] positions = new float[] { 0f, 0.1f, 0.4f, 0.8f, 1.0f};
gradient = new LinearGradient(0, radius, width, radius, colors, positions, CLAMP);
Gradient posi-ons
Shader shader = new LinearGradient(
0, centerY, width, centerY,
new int[] {blue, blue, white, white, red, red},
new float[] {0f, 0.33f, 0.33f, 0.66f, 0.66f, 1f},
CLAMP);
bgPaint.setShader(shader);
Back to our background
int[] colors = new int[] {DKGRAY, DKGRAY, BLACK, BLACK};
float[] positions = new float[] {0, 0.25f, 0.25f, 1f};
bgPaint.setShader(new RadialGradient(centerX, centerY, 6_DIP, colors, positions, REPEAT));
#2 Place the minutes indicators
Path path;
@Override void onApplyWindowInsets(WindowInsets insets) {
[...]
path = createMinutesIndicators(centerX, centerY, radius - 10_DP);
}
@Override void onDraw(Canvas canvas, Rect bounds) {
[...]
canvas.drawPath(path, paint);
}
Minutes indicators
Add shadow
mnPaint.setShadowLayer(4f, 2f, 2f, Color.GRAY);
#3 Create the watch hands
Paint handHourPaint;
Path handHourPath;
@Override void onCreate(SurfaceHolder holder) { [...]
handHourPaint = new Paint();
handHourPaint.setStyle(Paint.Style.FILL);
handHourPaint.setColor(Color.WHITE);
handHourPaint.setAntiAlias(true);
handHourPaint.setPathEffect(new CornerPathEffect(2_DP));
}
@Override void onApplyWindowInsets(WindowInsets insets) { [...]
handHourPath = createHandHour(centerX, centerY, radius - 20_DP);
}
@Override void onDraw(Canvas canvas, Rect bounds) { [...]
canvas.drawPath(handHourPath, handHourPaint);
}
Hour hand
path.moveTo(
centerX - 16_DIP, centerY
);
path.lineTo(
centerX - 10_DIP, centerY
);
path.arcTo(
new RectF(
centerX - 10_DIP,
centerY - 10_DIP,
centerX + 10_DIP,
centerY + 10_DIP
),
180f, -180f
);
path.lineTo(
centerX + 16_DIP, centerY
);
path.quadTo(
centerX,
centerY - 20_DIP,
centerX + 1_DIP,
centerY - needleHeight
);
path.quadTo(
centerX,
centerY - 20_DIP,
centerX - 16_DIP,
centerY
);
int[] colors = new int[] {
0xff878191, 0xffaba6b3,
0xffb9b1c5, 0xffa9a2b3
};
float[] positions = new float[] {
0, 0.49f, 0.51f, 1f
},
Shader gradient = new LinearGradient(
radius - 10_DIP, 0,
radius + 10_DIP, 0,
colors, positions,
Shader.TileMode.CLAMP
);
handHourPaint.setShader(gradient);
canvas.save();
canvas.rotate(
10 * 360 / 12,
centerX, centerY
);
canvas.drawPath(path, paint);
canvas.restore();
Paint shadowPaint = new Paint();
shadowPaint.setAntiAlias(true);
shadowPaint.setColor(GRAY);
shadowPaint.setShadowLayer(4f, 4f, 2f, GRAY);
[...]
canvas.drawPath(handHourPath, shadowPaint);
canvas.drawPath(handHourPath, watchHandPaint);
Add the minute
hand
Add the second
hand
#4 Create the ambient mode
#5 No step 5
Source code
github.com/Nilhcem/the-10mn-watchface
Tips & Tricks
#1: Official documenta2on is !
developer.android.com/wear/index.html
#2: Share code with a common module
#3: Custom WatchFrame
Layout
h"ps://github.com/Nilhcem/hexawatch/
blob/master/companion/src/main/java/
com/nilhcem/hexawatch/ui/widget/
WearFrameLayout.java
<com.nilhcem.hexawatch.ui.widget.WearFrameLayout
android:layout_width="wrap_content"
android:layout_height="match_parent">
<com.nilhcem.hexawatch.ui.widget.HexawatchView
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</com.nilhcem.hexawatch.ui.widget.WearFrameLayout>
#4: Consider using Protobuf over
Json
#5: Want to cut bitmaps? Use Xfermode
#6: Check out ustwo clockwise SDK
h"ps://github.com/ustwo/clockwise
#7: Stripes shader
aka "A burn-in friendly way to fill a large surface"
paint.setStyle(Paint.Style.FILL);
paint.setShader(new LinearGradient(
0f, 0f, TWO_DIP, TWO_DIP,
new int[] {
WHITE, WHITE, TRANSPARENT, TRANSPARENT
},
new float[] {
0, 0.25f, 0.25f, 1f
},
Shader.TileMode.REPEAT
)
);
#8: Bitmap shader
github.com/Nilhcem/shammane-
androidwear
Bitmap dotPattern = BitmapFactory.decodeResource(
context.getResources(),
R.drawable.dot_pattern
);
paint.setShader(
new BitmapShader(
dotPattern, TileMode.REPEAT, TileMode.REPEAT
)
);
#9: Experiment in an
Android (not wear) custom
View
<com.nilhcem.experiments.ui.widget.WearFrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.nilhcem.experiments.ui.ExperimentalView
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</com.nilhcem.experiments.ui.widget.WearFrameLayout>
#10: Use ValueAnimator
for onDraw anima7ons
private ValueAnimator animator;
private final Handler handler = new Handler();
public void onTapCommand(int tapType, int x, int y, long e) {
if (tapType == TAP_TYPE_TAP) {
animator = ValueAnimator.ofInt(0, Math.round(MAX_RADIUS));
animator.setDuration(600L);
animator.setInterpolator(new AccelerateDecelerateInterpolator());
animator.start();
invalidate();
}
}
public void onDraw(Canvas canvas, Rect bounds) {
if (animator != null && animator.isRunning()) {
int value = (Integer) animator.getAnimatedValue();
canvas.drawCircle(centerX, centerY, value, paint);
// Invalidate at a 30fps ratio
handler.postDelayed(() -> invalidate()), 1000L / 30);
}
}
#11: Path Interpolator
Anima3on
Path path = new Path();
path.moveTo(0, 0);
path.lineTo(0.250f, 0.250f);
path.lineTo(0.500f, -0.500f);
path.lineTo(0.750f, 0.625f);
path.lineTo(0.875f, 0.500f);
path.lineTo(1f, 1f);
ObjectAnimator animator =
ObjectAnimator.ofFloat(bugdroid, View.TRANSLATION_X, 0, 100);
animator.setRepeatCount(ObjectAnimator.INFINITE);
animator.setRepeatMode(ObjectAnimator.REVERSE);
animator.setInterpolator(PathInterpolatorCompat.create(path));
animator.setDuration(2000);
animator.start();
#11: Path Interpolator
Anima3on
#12: Move a view along a
Path
h"p://stackoverflow.com/ques5ons/6154370/
android-move-object-along-a-path
Path path = new Path();
path.arcTo(new RectF(0, 0, 300, 300), 0, 180); // 1 -> 2
path.quadTo(200, 80, 400, 400); // 2 -> 3
path.lineTo(500f, 300f); // 3 -> 4
path.close(); // 4 -> 1
ObjectAnimator animator =
ObjectAnimator.ofFloat(bugdroid, "x", "y", path);
animator.setRepeatCount(ObjectAnimator.INFINITE);
animator.setInterpolator(new DecelerateInterpolator());
animator.setDuration(7000);
animator.start();
#13: Vector Drawables
• M (x,y): Absolute move to (x,y)
• m (x,y): Rela5ve move to (x,y)
• L or l (x,y): Line to (x,y)
• C or c (x1,y1,x2,y2): Curve from (x1,y1) to (x2,y2)
• Q or q (x1,y1,x,y): Quadra5c curve to (x,y) using (x1,y1) as the control point
• Z or z: Close path
h#ps://www.w3.org/TR/SVG/paths.html
#13: Vector Drawables
#14: Port your app to
Tizen
• HTML5 Canvas api
• Low-Bit Ambient mode
• Burn-in support
• onTimeTick() becomes
window.addEventListener("time
tick", drawWatchContent);
Hexawatch
github.com/Nilhcem/hexawatch
• Square / Circular shapes
• Se1ngs app
• Protobuf
• Gear s2 port
• Custom views
• Custom wear frame layout
• Common module
From a hoodie to a watch face
nilhcem.com/android-wear/watchfaces-
design
• Android Wear 1 + 2 support
• Square / Circular shapes
• Chin support
• Textures + Xfer modes
Conclusion
• Good to be curious
• Improve your skills
• Fun
• Rewarding
Android Wear Essen-als
• Twi%er: @Nilhcem
• Slides: slideshare.net/Nilhcem/android-wear-essen:als
• 10mn-watchface: github.com/Nilhcem/the-10mn-watchface
• Hexawatch: github.com/Nilhcem/hexawatch
• Hoodie watch face making-of: nilhcem.com/android-wear/
watchfaces-design

Contenu connexe

Tendances

Android code puzzlers + tips & tricks
Android code puzzlers + tips & tricksAndroid code puzzlers + tips & tricks
Android code puzzlers + tips & tricks
NLJUG
 
2011 py con
2011 py con2011 py con
2011 py con
Eing Ong
 
Курсы по мобильной разработке под iOS. 4 лекция. Возможности телефона
Курсы по мобильной разработке под iOS. 4 лекция. Возможности телефонаКурсы по мобильной разработке под iOS. 4 лекция. Возможности телефона
Курсы по мобильной разработке под iOS. 4 лекция. Возможности телефона
Глеб Тарасов
 

Tendances (19)

package org dev
package org devpackage org dev
package org dev
 
Android Design Patterns
Android Design PatternsAndroid Design Patterns
Android Design Patterns
 
More android code puzzles
More android code puzzlesMore android code puzzles
More android code puzzles
 
Enhance your world with ARKit. UA Mobile 2017.
Enhance your world with ARKit. UA Mobile 2017.Enhance your world with ARKit. UA Mobile 2017.
Enhance your world with ARKit. UA Mobile 2017.
 
Android TDD
Android TDDAndroid TDD
Android TDD
 
Capture image on eye blink
Capture image on eye blinkCapture image on eye blink
Capture image on eye blink
 
Android camera2
Android camera2Android camera2
Android camera2
 
Google Fit, Android Wear & Xamarin
Google Fit, Android Wear & XamarinGoogle Fit, Android Wear & Xamarin
Google Fit, Android Wear & Xamarin
 
Android code puzzlers + tips & tricks
Android code puzzlers + tips & tricksAndroid code puzzlers + tips & tricks
Android code puzzlers + tips & tricks
 
303 TANSTAAFL: Using Open Source iPhone UI Code
303 TANSTAAFL: Using Open Source iPhone UI Code303 TANSTAAFL: Using Open Source iPhone UI Code
303 TANSTAAFL: Using Open Source iPhone UI Code
 
PVS-Studio and Continuous Integration: TeamCity. Analysis of the Open RollerC...
PVS-Studio and Continuous Integration: TeamCity. Analysis of the Open RollerC...PVS-Studio and Continuous Integration: TeamCity. Analysis of the Open RollerC...
PVS-Studio and Continuous Integration: TeamCity. Analysis of the Open RollerC...
 
Introduction to Android Wear
Introduction to Android WearIntroduction to Android Wear
Introduction to Android Wear
 
2011 py con
2011 py con2011 py con
2011 py con
 
Blending Culture in Twitter Client
Blending Culture in Twitter ClientBlending Culture in Twitter Client
Blending Culture in Twitter Client
 
Android swedroid
Android swedroidAndroid swedroid
Android swedroid
 
Android Unit Testing With Robolectric
Android Unit Testing With RobolectricAndroid Unit Testing With Robolectric
Android Unit Testing With Robolectric
 
YQL Tutorial
YQL TutorialYQL Tutorial
YQL Tutorial
 
mobl
moblmobl
mobl
 
Курсы по мобильной разработке под iOS. 4 лекция. Возможности телефона
Курсы по мобильной разработке под iOS. 4 лекция. Возможности телефонаКурсы по мобильной разработке под iOS. 4 лекция. Возможности телефона
Курсы по мобильной разработке под iOS. 4 лекция. Возможности телефона
 

En vedette

Cerivcal spine speacial test (3)
Cerivcal spine speacial test (3)Cerivcal spine speacial test (3)
Cerivcal spine speacial test (3)
abdul alim
 

En vedette (17)

Fxos
FxosFxos
Fxos
 
Presentation1
Presentation1Presentation1
Presentation1
 
Van hoa ca phe viet
Van hoa ca phe vietVan hoa ca phe viet
Van hoa ca phe viet
 
What is Eventivous?
What is Eventivous?What is Eventivous?
What is Eventivous?
 
Git & Git Workflows
Git & Git WorkflowsGit & Git Workflows
Git & Git Workflows
 
Theoldvirginian
TheoldvirginianTheoldvirginian
Theoldvirginian
 
Dinas pengabdian masyarakat
Dinas pengabdian masyarakatDinas pengabdian masyarakat
Dinas pengabdian masyarakat
 
Kotlin cheat sheet by ekito
Kotlin cheat sheet by ekitoKotlin cheat sheet by ekito
Kotlin cheat sheet by ekito
 
Inria - Bilan social 2014
Inria - Bilan social 2014Inria - Bilan social 2014
Inria - Bilan social 2014
 
New microsoft office power point presentation (2)
New microsoft office power point presentation (2)New microsoft office power point presentation (2)
New microsoft office power point presentation (2)
 
Teknik analisis semiotika
Teknik analisis semiotikaTeknik analisis semiotika
Teknik analisis semiotika
 
Plancton
PlanctonPlancton
Plancton
 
EJAAN YANG DISEMPURNAKAN
EJAAN YANG DISEMPURNAKANEJAAN YANG DISEMPURNAKAN
EJAAN YANG DISEMPURNAKAN
 
Reconfigurer un site chimique ancien grâce au Lean par J.Ferradini
Reconfigurer un site chimique ancien grâce au Lean par J.FerradiniReconfigurer un site chimique ancien grâce au Lean par J.Ferradini
Reconfigurer un site chimique ancien grâce au Lean par J.Ferradini
 
Pelatihan singkat olah data dengan software spss
Pelatihan singkat olah data dengan software spssPelatihan singkat olah data dengan software spss
Pelatihan singkat olah data dengan software spss
 
ANKLE FRACTURES
ANKLE FRACTURESANKLE FRACTURES
ANKLE FRACTURES
 
Cerivcal spine speacial test (3)
Cerivcal spine speacial test (3)Cerivcal spine speacial test (3)
Cerivcal spine speacial test (3)
 

Similaire à Android Wear Essentials

Android design and Custom views
Android design and Custom views Android design and Custom views
Android design and Custom views
Lars Vogel
 
Android Best Practices
Android Best PracticesAndroid Best Practices
Android Best Practices
Yekmer Simsek
 
Android Studio (Java)The SimplePaint app (full code given below).docx
Android Studio (Java)The SimplePaint app (full code given below).docxAndroid Studio (Java)The SimplePaint app (full code given below).docx
Android Studio (Java)The SimplePaint app (full code given below).docx
amrit47
 
Android app development basics
Android app development basicsAndroid app development basics
Android app development basics
Anton Narusberg
 
ProTips DroidCon Paris 2013
ProTips DroidCon Paris 2013ProTips DroidCon Paris 2013
ProTips DroidCon Paris 2013
Mathias Seguy
 

Similaire à Android Wear Essentials (20)

Android design and Custom views
Android design and Custom views Android design and Custom views
Android design and Custom views
 
What's New in Android
What's New in AndroidWhat's New in Android
What's New in Android
 
Enhancing UI/UX using Java animations
Enhancing UI/UX using Java animationsEnhancing UI/UX using Java animations
Enhancing UI/UX using Java animations
 
Android Best Practices
Android Best PracticesAndroid Best Practices
Android Best Practices
 
Advance ui development and design
Advance ui  development and design Advance ui  development and design
Advance ui development and design
 
Android 3
Android 3Android 3
Android 3
 
CocoaHeads Toulouse - Guillaume Cerquant - UIView
CocoaHeads Toulouse - Guillaume Cerquant - UIViewCocoaHeads Toulouse - Guillaume Cerquant - UIView
CocoaHeads Toulouse - Guillaume Cerquant - UIView
 
Android Studio (Java)The SimplePaint app (full code given below).docx
Android Studio (Java)The SimplePaint app (full code given below).docxAndroid Studio (Java)The SimplePaint app (full code given below).docx
Android Studio (Java)The SimplePaint app (full code given below).docx
 
Intro to computer vision in .net
Intro to computer vision in .netIntro to computer vision in .net
Intro to computer vision in .net
 
Android app development basics
Android app development basicsAndroid app development basics
Android app development basics
 
MOPCON 2014 - Best software architecture in app development
MOPCON 2014 - Best software architecture in app developmentMOPCON 2014 - Best software architecture in app development
MOPCON 2014 - Best software architecture in app development
 
Android classes in mumbai
Android classes in mumbaiAndroid classes in mumbai
Android classes in mumbai
 
Package org dev
Package org devPackage org dev
Package org dev
 
Introduction to Android Wear
Introduction to Android WearIntroduction to Android Wear
Introduction to Android Wear
 
Android UI Tips, Tricks and Techniques
Android UI Tips, Tricks and TechniquesAndroid UI Tips, Tricks and Techniques
Android UI Tips, Tricks and Techniques
 
Android UI Development: Tips, Tricks, and Techniques
Android UI Development: Tips, Tricks, and TechniquesAndroid UI Development: Tips, Tricks, and Techniques
Android UI Development: Tips, Tricks, and Techniques
 
Building a dashboard using AngularJS
Building a dashboard using AngularJSBuilding a dashboard using AngularJS
Building a dashboard using AngularJS
 
ProTips DroidCon Paris 2013
ProTips DroidCon Paris 2013ProTips DroidCon Paris 2013
ProTips DroidCon Paris 2013
 
Getting Started in VR with JS
Getting Started in VR with JSGetting Started in VR with JS
Getting Started in VR with JS
 
Workshop 26: React Native - The Native Side
Workshop 26: React Native - The Native SideWorkshop 26: React Native - The Native Side
Workshop 26: React Native - The Native Side
 

Dernier

IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
Enterprise Knowledge
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
Earley Information Science
 

Dernier (20)

GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 

Android Wear Essentials