SlideShare a Scribd company logo
1 of 29
Download to read offline
Creating a Facebook Clone - Part VI
The SignupForm abstracts the whole process and generalizes most of the common features in the signup stages.
© Codename One 2017 all rights reserved
All of these forms are handled by one class: SignupForm. Lets start by reviewing the generic aspect of that class and then dig into every stage.
public class SignupForm extends Form {
Container content = new Container(BoxLayout.y(), "PaddedContainer");
Container south = new Container(BoxLayout.y());
protected SignupForm(String title, String backLabel, Form previous) {
super(title, new BorderLayout());
setUIID("SignupForm");
content.setScrollableY(true);
add(CENTER, content);
getToolbar().setBackCommand(backLabel,
Toolbar.BackCommandPolicy.WHEN_USES_TITLE_OTHERWISE_ARROW,
e -> previous.showBack());
getToolbar().getTitleComponent().setUIID("Title", "TitleLandscape");
Button problem = new Button("Report a Problem", "BlueLink");
south.add(problem);
problem.addActionListener(e ->
sendMessage("Problem with Facebook Clone",
new Message("Details..."),
"mark@facebook.com"));
add(SOUTH, south);
}
Button createNextButton(ActionListener al) {
SignupForm
The signup form is a form that encapsulates common functionality in all of these forms.

We use the content Container to place the main UI and the south Container for the links on the bottom
public class SignupForm extends Form {
Container content = new Container(BoxLayout.y(), "PaddedContainer");
Container south = new Container(BoxLayout.y());
protected SignupForm(String title, String backLabel, Form previous) {
super(title, new BorderLayout());
setUIID("SignupForm");
content.setScrollableY(true);
add(CENTER, content);
getToolbar().setBackCommand(backLabel,
Toolbar.BackCommandPolicy.WHEN_USES_TITLE_OTHERWISE_ARROW,
e -> previous.showBack());
getToolbar().getTitleComponent().setUIID("Title", "TitleLandscape");
Button problem = new Button("Report a Problem", "BlueLink");
south.add(problem);
problem.addActionListener(e ->
sendMessage("Problem with Facebook Clone",
new Message("Details..."),
"mark@facebook.com"));
add(SOUTH, south);
}
Button createNextButton(ActionListener al) {
SignupForm
The constructor is protected as it's used only within this class
public class SignupForm extends Form {
Container content = new Container(BoxLayout.y(), "PaddedContainer");
Container south = new Container(BoxLayout.y());
protected SignupForm(String title, String backLabel, Form previous) {
super(title, new BorderLayout());
setUIID("SignupForm");
content.setScrollableY(true);
add(CENTER, content);
getToolbar().setBackCommand(backLabel,
Toolbar.BackCommandPolicy.WHEN_USES_TITLE_OTHERWISE_ARROW,
e -> previous.showBack());
getToolbar().getTitleComponent().setUIID("Title", "TitleLandscape");
Button problem = new Button("Report a Problem", "BlueLink");
south.add(problem);
problem.addActionListener(e ->
sendMessage("Problem with Facebook Clone",
new Message("Details..."),
"mark@facebook.com"));
add(SOUTH, south);
}
Button createNextButton(ActionListener al) {
SignupForm
Only the content pane should be scrollable, everything else should be fixed in place
public class SignupForm extends Form {
Container content = new Container(BoxLayout.y(), "PaddedContainer");
Container south = new Container(BoxLayout.y());
protected SignupForm(String title, String backLabel, Form previous) {
super(title, new BorderLayout());
setUIID("SignupForm");
content.setScrollableY(true);
add(CENTER, content);
getToolbar().setBackCommand(backLabel,
Toolbar.BackCommandPolicy.WHEN_USES_TITLE_OTHERWISE_ARROW,
e -> previous.showBack());
getToolbar().getTitleComponent().setUIID("Title", "TitleLandscape");
Button problem = new Button("Report a Problem", "BlueLink");
south.add(problem);
problem.addActionListener(e ->
sendMessage("Problem with Facebook Clone",
new Message("Details..."),
"mark@facebook.com"));
add(SOUTH, south);
}
Button createNextButton(ActionListener al) {
SignupForm
This supports the back behavior where an arrow is shown on Android & backLabel is shown in iOS
public class SignupForm extends Form {
Container content = new Container(BoxLayout.y(), "PaddedContainer");
Container south = new Container(BoxLayout.y());
protected SignupForm(String title, String backLabel, Form previous) {
super(title, new BorderLayout());
setUIID("SignupForm");
content.setScrollableY(true);
add(CENTER, content);
getToolbar().setBackCommand(backLabel,
Toolbar.BackCommandPolicy.WHEN_USES_TITLE_OTHERWISE_ARROW,
e -> previous.showBack());
getToolbar().getTitleComponent().setUIID("Title", "TitleLandscape");
Button problem = new Button("Report a Problem", "BlueLink");
south.add(problem);
problem.addActionListener(e ->
sendMessage("Problem with Facebook Clone",
new Message("Details..."),
"mark@facebook.com"));
add(SOUTH, south);
}
Button createNextButton(ActionListener al) {
SignupForm
We give the title a different UIID when it's in landscape mode so it can shrink when we rotate the device
public class SignupForm extends Form {
Container content = new Container(BoxLayout.y(), "PaddedContainer");
Container south = new Container(BoxLayout.y());
protected SignupForm(String title, String backLabel, Form previous) {
super(title, new BorderLayout());
setUIID("SignupForm");
content.setScrollableY(true);
add(CENTER, content);
getToolbar().setBackCommand(backLabel,
Toolbar.BackCommandPolicy.WHEN_USES_TITLE_OTHERWISE_ARROW,
e -> previous.showBack());
getToolbar().getTitleComponent().setUIID("Title", "TitleLandscape");
Button problem = new Button("Report a Problem", "BlueLink");
south.add(problem);
problem.addActionListener(e ->
sendMessage("Problem with Facebook Clone",
new Message("Details..."),
"mark@facebook.com"));
add(SOUTH, south);
}
Button createNextButton(ActionListener al) {
SignupForm
The problems link is added to the bottom of the UI inside a container so we can add additional elements there
add(CENTER, content);
getToolbar().setBackCommand(backLabel,
Toolbar.BackCommandPolicy.WHEN_USES_TITLE_OTHERWISE_ARROW,
e -> previous.showBack());
getToolbar().getTitleComponent().setUIID("Title", "TitleLandscape");
Button problem = new Button("Report a Problem", "BlueLink");
south.add(problem);
problem.addActionListener(e ->
sendMessage("Problem with Facebook Clone",
new Message("Details..."),
"mark@facebook.com"));
add(SOUTH, south);
}
Button createNextButton(ActionListener al) {
Button next = new Button("Next", "NextButton");
next.addActionListener(al);
return next;
}
public static SignupForm createTerms() {
SignupForm s = new SignupForm("Create Account", "Sign In",
getCurrentForm());
Label title = new Label("Terms & Conditions", "SignupSubHeader");
RichTextView rt = new RichTextView("By signing up you agree to our "
SignupForm
This is the next button that appears in each stage. The static methods below create each stage of the wizard. Now we have all the infrastructure in place to build the
individual stages of signup…
© Codename One 2017 all rights reserved
The first stage is the Terms & Conditions form which we create in the createTerms() method.
© Codename One 2017 all rights reserved
In this form we have some highlighted text, for this we will need the RichTextView control that provides rich text viewing capabilities. We could use a BrowserComponent
but that might lead us down a problematic path of matching fonts/behaviors with the HTML renderer. For this case I'd rather have something simple.
next.addActionListener(al);
return next;
}
public static SignupForm createTerms() {
SignupForm s = new SignupForm("Create Account", "Sign In",
getCurrentForm());
Label title = new Label("Terms & Conditions", "SignupSubHeader");
RichTextView rt = new RichTextView("By signing up you agree to our "
+ "<a href="terms">Facebook Terms</a> and that you have "
+ "read our <a href="data-policy">Data Policy</a>, including "
+ "our <a href="cookie-use">Cookie Use</a>.");
rt.setAlignment(CENTER);
rt.setUIID("PaddedContainer");
Button next = s.createNextButton(e -> createName().show());
next.setText("I Agree");
rt.addLinkListener(e -> {
String link = (String)e.getSource();
execute("https://www.codenameone.com/");
});
s.content.addAll(title, rt, next);
return s;
}
createTerms
The code for this form is simple. The "Sign In" label appears in the iOS back button
next.addActionListener(al);
return next;
}
public static SignupForm createTerms() {
SignupForm s = new SignupForm("Create Account", "Sign In",
getCurrentForm());
Label title = new Label("Terms & Conditions", "SignupSubHeader");
RichTextView rt = new RichTextView("By signing up you agree to our "
+ "<a href="terms">Facebook Terms</a> and that you have "
+ "read our <a href="data-policy">Data Policy</a>, including "
+ "our <a href="cookie-use">Cookie Use</a>.");
rt.setAlignment(CENTER);
rt.setUIID("PaddedContainer");
Button next = s.createNextButton(e -> createName().show());
next.setText("I Agree");
rt.addLinkListener(e -> {
String link = (String)e.getSource();
execute("https://www.codenameone.com/");
});
s.content.addAll(title, rt, next);
return s;
}
createTerms
We center align the HTML, since it renders into FlowLayout this is pretty easy
next.addActionListener(al);
return next;
}
public static SignupForm createTerms() {
SignupForm s = new SignupForm("Create Account", "Sign In",
getCurrentForm());
Label title = new Label("Terms & Conditions", "SignupSubHeader");
RichTextView rt = new RichTextView("By signing up you agree to our "
+ "<a href="terms">Facebook Terms</a> and that you have "
+ "read our <a href="data-policy">Data Policy</a>, including "
+ "our <a href="cookie-use">Cookie Use</a>.");
rt.setAlignment(CENTER);
rt.setUIID("PaddedContainer");
Button next = s.createNextButton(e -> createName().show());
next.setText("I Agree");
rt.addLinkListener(e -> {
String link = (String)e.getSource();
execute("https://www.codenameone.com/");
});
s.content.addAll(title, rt, next);
return s;
}
createTerms
We need a different label for the next button, we show the createName form on the next operation
next.addActionListener(al);
return next;
}
public static SignupForm createTerms() {
SignupForm s = new SignupForm("Create Account", "Sign In",
getCurrentForm());
Label title = new Label("Terms & Conditions", "SignupSubHeader");
RichTextView rt = new RichTextView("By signing up you agree to our "
+ "<a href="terms">Facebook Terms</a> and that you have "
+ "read our <a href="data-policy">Data Policy</a>, including "
+ "our <a href="cookie-use">Cookie Use</a>.");
rt.setAlignment(CENTER);
rt.setUIID("PaddedContainer");
Button next = s.createNextButton(e -> createName().show());
next.setText("I Agree");
rt.addLinkListener(e -> {
String link = (String)e.getSource();
execute("https://www.codenameone.com/");
});
s.content.addAll(title, rt, next);
return s;
}
createTerms
I left this as a mockup, clicking the links isn't used but you can implement these links in any way you want...
next.addActionListener(al);
return next;
}
public static SignupForm createTerms() {
SignupForm s = new SignupForm("Create Account", "Sign In",
getCurrentForm());
Label title = new Label("Terms & Conditions", "SignupSubHeader");
RichTextView rt = new RichTextView("By signing up you agree to our "
+ "<a href="terms">Facebook Terms</a> and that you have "
+ "read our <a href="data-policy">Data Policy</a>, including "
+ "our <a href="cookie-use">Cookie Use</a>.");
rt.setAlignment(CENTER);
rt.setUIID("PaddedContainer");
Button next = s.createNextButton(e -> createName().show());
next.setText("I Agree");
rt.addLinkListener(e -> {
String link = (String)e.getSource();
execute("https://www.codenameone.com/");
});
s.content.addAll(title, rt, next);
return s;
}
createTerms
The content is in the center of the Form and uses BoxLayout on the Y axis. We add elements directly to it. Simple.
© Codename One 2017 all rights reserved
Next we need to style a lot of elements for this form, a lot of these will apply to the following SignupForm methods so this CSS listing will be a bit longer. First lets look at
the UIID's involved.
#Constants {
includeNativeBool: true;
scrollVisibleBool: false;
labelGap: 2;
capsButtonUiids: "BlueText,GreenButton,BlueButton,NextButton";
landscapeTitleUiidBool: true;
}
/** unchanged **/
Toolbar {
padding: 1mm;
border: none;
background-color: #4367b3;
}
Title {
font-family: "native:MainLight";
font-size: 4mm;
padding: 2mm 1mm 2mm 1mm;
margin: 0px;
color: white;
}
theme.css
Next lets look at the CSS needed for this. First we need to change two things in the #Constants entry.

We need to add the NextButton UIID to the list of caps buttons. landscapeTitleUiidBool indicates that we should use Landscape suffixed UIID's for the title elements.
Notice that Facebook didn't uppercase the next button on Android. I chose to do that as it fits better to the platform. I didn't do that for the problems link (or other links)
as that's not the convention on Android.
#Constants {
includeNativeBool: true;
scrollVisibleBool: false;
labelGap: 2;
capsButtonUiids: "BlueText,GreenButton,BlueButton,NextButton";
landscapeTitleUiidBool: true;
}
/** unchanged **/
Toolbar {
padding: 1mm;
border: none;
background-color: #4367b3;
}
Title {
font-family: "native:MainLight";
font-size: 4mm;
padding: 2mm 1mm 2mm 1mm;
margin: 0px;
color: white;
}
theme.css
Lets go over the new additions to the css now. The Toolbar just has a bit of padding and the right background color
/** unchanged **/
Toolbar {
padding: 1mm;
border: none;
background-color: #4367b3;
}
Title {
font-family: "native:MainLight";
font-size: 4mm;
padding: 2mm 1mm 2mm 1mm;
margin: 0px;
color: white;
}
TitleCommand {
font-family: "native:MainLight";
font-size: 2.5mm;
padding: 1mm;
margin: 0px;
color: white;
}
BackCommand {
font-family: "native:MainLight";
font-size: 2.5mm;
padding: 3mm 0.5mm 3mm 0.5mm;
theme.css
The Title is 4mm with a large font, this doesn't look like the more understated Facebook font but I think it looks better
/** unchanged **/
Toolbar {
padding: 1mm;
border: none;
background-color: #4367b3;
}
Title {
font-family: "native:MainLight";
font-size: 4mm;
padding: 2mm 1mm 2mm 1mm;
margin: 0px;
color: white;
}
TitleCommand {
font-family: "native:MainLight";
font-size: 2.5mm;
padding: 1mm;
margin: 0px;
color: white;
}
BackCommand {
font-family: "native:MainLight";
font-size: 2.5mm;
padding: 3mm 0.5mm 3mm 0.5mm;
theme.css
The TitleCommand is smaller than the Title so it won't take up too much space
}
TitleCommand {
font-family: "native:MainLight";
font-size: 2.5mm;
padding: 1mm;
margin: 0px;
color: white;
}
BackCommand {
font-family: "native:MainLight";
font-size: 2.5mm;
padding: 3mm 0.5mm 3mm 0.5mm;
margin: 0px;
color: white;
}
ToolbarLandscpae {
padding: 0.5mm;
border: none;
background-color: #4367b3;
}
TitleLandscape {
font-family: "native:MainLight";
font-size: 3mm;
padding: 0px;
margin: 0px;
theme.css
BackCommand is only used in iOS so we keep it even smaller so it will fit with the title which can be a problem with long text
}
TitleCommand {
font-family: "native:MainLight";
font-size: 2.5mm;
padding: 1mm;
margin: 0px;
color: white;
}
BackCommand {
font-family: "native:MainLight";
font-size: 2.5mm;
padding: 3mm 0.5mm 3mm 0.5mm;
margin: 0px;
color: white;
}
ToolbarLandscpae {
padding: 0.5mm;
border: none;
background-color: #4367b3;
}
TitleLandscape {
font-family: "native:MainLight";
font-size: 3mm;
padding: 0px;
margin: 0px;
theme.css
Next we'll discuss the landscape UIID’s. ToolbarLandscape reduces the padding further in the Toolbar
color: white;
}
ToolbarLandscpae {
padding: 0.5mm;
border: none;
background-color: #4367b3;
}
TitleLandscape {
font-family: "native:MainLight";
font-size: 3mm;
padding: 0px;
margin: 0px;
color: white;
}
TitleCommandLandscape {
font-family: "native:MainLight";
font-size: 2.5mm;
padding: 0px 1mm 0px 1mm;
margin: 0px;
color: white;
}
BackCommandLandscape {
font-family: "native:MainLight";
font-size: 2.5mm;
padding: 0px 1mm 0px 1mm;
margin: 0px;
theme.css
It also reduces the size of the title font
background-color: #4367b3;
}
TitleLandscape {
font-family: "native:MainLight";
font-size: 3mm;
padding: 0px;
margin: 0px;
color: white;
}
TitleCommandLandscape {
font-family: "native:MainLight";
font-size: 2.5mm;
padding: 0px 1mm 0px 1mm;
margin: 0px;
color: white;
}
BackCommandLandscape {
font-family: "native:MainLight";
font-size: 2.5mm;
padding: 0px 1mm 0px 1mm;
margin: 0px;
color: white;
}
SignupSubHeader {
font-family: "native:MainBold";
font-size: 3mm;
theme.css
If we don't reduce the padding in the command & title area the title area as a whole won't shrink. 

When I initially implemented this I didn't reduce the sizes of the title command & back command styles. The font shrank but the Toolbar maintained its height. I used the
Component Inspector tool in the simulator to look at the differences between preferred height and actual height for all the elements in order to figure out which was at
fault.
BackCommandLandscape {
font-family: "native:MainLight";
font-size: 2.5mm;
padding: 0px 1mm 0px 1mm;
margin: 0px;
color: white;
}
SignupSubHeader {
font-family: "native:MainBold";
font-size: 3mm;
text-align: center;
margin: 0px;
padding: 3mm;
}
SignupForm {
background-color: #F6F7F8;
cn1-derive: SplashForm;
}
NextButton {
cn1-derive: BlueButtonOnBlueBackground;
margin-top: 3.5mm;
}
BlueLink {
cn1-derive: BaseButton;
color: blue;
font-size: 2.2mm;
theme.css
We use a bold center aligned font for the subheading in the forms
BackCommandLandscape {
font-family: "native:MainLight";
font-size: 2.5mm;
padding: 0px 1mm 0px 1mm;
margin: 0px;
color: white;
}
SignupSubHeader {
font-family: "native:MainBold";
font-size: 3mm;
text-align: center;
margin: 0px;
padding: 3mm;
}
SignupForm {
background-color: #F6F7F8;
cn1-derive: SplashForm;
}
NextButton {
cn1-derive: BlueButtonOnBlueBackground;
margin-top: 3.5mm;
}
BlueLink {
cn1-derive: BaseButton;
color: blue;
font-size: 2.2mm;
theme.css
The signup process forms have an "off white" color which I took from the Android version of the wizard
BackCommandLandscape {
font-family: "native:MainLight";
font-size: 2.5mm;
padding: 0px 1mm 0px 1mm;
margin: 0px;
color: white;
}
SignupSubHeader {
font-family: "native:MainBold";
font-size: 3mm;
text-align: center;
margin: 0px;
padding: 3mm;
}
SignupForm {
background-color: #F6F7F8;
cn1-derive: SplashForm;
}
NextButton {
cn1-derive: BlueButtonOnBlueBackground;
margin-top: 3.5mm;
}
BlueLink {
cn1-derive: BaseButton;
color: blue;
font-size: 2.2mm;
theme.css
Initially I used BlueButton for this but eventually decided to create a UIID for it as I wanted more spacing from the top. I might change NextButton in the future to work
better in landscape by reducing margin in landscape mode.
color: white;
}
SignupSubHeader {
font-family: "native:MainBold";
font-size: 3mm;
text-align: center;
margin: 0px;
padding: 3mm;
}
SignupForm {
background-color: #F6F7F8;
cn1-derive: SplashForm;
}
NextButton {
cn1-derive: BlueButtonOnBlueBackground;
margin-top: 3.5mm;
}
BlueLink {
cn1-derive: BaseButton;
color: blue;
font-size: 2.2mm;
padding: 1.5mm;
font-family: "native:MainLight";
}
theme.css
The link at the bottom of the form is relatively small and blue. With this you can run and see the first signup Form. The rest becomes trivial by comparison...

More Related Content

Similar to Creating a Facebook Clone - Part VI - Transcript.pdf

Creating an Uber Clone - Part XXXIX.pdf
Creating an Uber Clone - Part XXXIX.pdfCreating an Uber Clone - Part XXXIX.pdf
Creating an Uber Clone - Part XXXIX.pdfShaiAlmog1
 
Initial UI Mockup - Part 3.pdf
Initial UI Mockup - Part 3.pdfInitial UI Mockup - Part 3.pdf
Initial UI Mockup - Part 3.pdfShaiAlmog1
 
Extracting ui Design - part 6 - transcript.pdf
Extracting ui Design - part 6 - transcript.pdfExtracting ui Design - part 6 - transcript.pdf
Extracting ui Design - part 6 - transcript.pdfShaiAlmog1
 
Creating a Facebook Clone - Part XXIX - Transcript.pdf
Creating a Facebook Clone - Part XXIX - Transcript.pdfCreating a Facebook Clone - Part XXIX - Transcript.pdf
Creating a Facebook Clone - Part XXIX - Transcript.pdfShaiAlmog1
 
Adapting to Tablets and Desktops - Part 3 - Transcript.pdf
Adapting to Tablets and Desktops - Part 3 - Transcript.pdfAdapting to Tablets and Desktops - Part 3 - Transcript.pdf
Adapting to Tablets and Desktops - Part 3 - Transcript.pdfShaiAlmog1
 
Creating an Uber Clone - Part XXXX - Transcript.pdf
Creating an Uber Clone - Part XXXX - Transcript.pdfCreating an Uber Clone - Part XXXX - Transcript.pdf
Creating an Uber Clone - Part XXXX - Transcript.pdfShaiAlmog1
 
Creating a Facebook Clone - Part VIII.pdf
Creating a Facebook Clone - Part VIII.pdfCreating a Facebook Clone - Part VIII.pdf
Creating a Facebook Clone - Part VIII.pdfShaiAlmog1
 
Creating a Facebook Clone - Part XLI.pdf
Creating a Facebook Clone - Part XLI.pdfCreating a Facebook Clone - Part XLI.pdf
Creating a Facebook Clone - Part XLI.pdfShaiAlmog1
 
Creating a Facebook Clone - Part IV.pdf
Creating a Facebook Clone - Part IV.pdfCreating a Facebook Clone - Part IV.pdf
Creating a Facebook Clone - Part IV.pdfShaiAlmog1
 
Initial UI Mockup - Part 2.pdf
Initial UI Mockup - Part 2.pdfInitial UI Mockup - Part 2.pdf
Initial UI Mockup - Part 2.pdfShaiAlmog1
 
Initial UI Mockup - Part 2 - Transcript.pdf
Initial UI Mockup - Part 2 - Transcript.pdfInitial UI Mockup - Part 2 - Transcript.pdf
Initial UI Mockup - Part 2 - Transcript.pdfShaiAlmog1
 
Creating a Facebook Clone - Part XXXV - Transcript.pdf
Creating a Facebook Clone - Part XXXV - Transcript.pdfCreating a Facebook Clone - Part XXXV - Transcript.pdf
Creating a Facebook Clone - Part XXXV - Transcript.pdfShaiAlmog1
 
Creating a Facebook Clone - Part XXXV.pdf
Creating a Facebook Clone - Part XXXV.pdfCreating a Facebook Clone - Part XXXV.pdf
Creating a Facebook Clone - Part XXXV.pdfShaiAlmog1
 
Initial UI Mockup - Part 3 - Transcript.pdf
Initial UI Mockup - Part 3 - Transcript.pdfInitial UI Mockup - Part 3 - Transcript.pdf
Initial UI Mockup - Part 3 - Transcript.pdfShaiAlmog1
 
Creating an Uber Clone - Part V - Transcript.pdf
Creating an Uber Clone - Part V - Transcript.pdfCreating an Uber Clone - Part V - Transcript.pdf
Creating an Uber Clone - Part V - Transcript.pdfShaiAlmog1
 
Creating a Facebook Clone - Part XLII.pdf
Creating a Facebook Clone - Part XLII.pdfCreating a Facebook Clone - Part XLII.pdf
Creating a Facebook Clone - Part XLII.pdfShaiAlmog1
 
Creating a Facebook Clone - Part XLVI.pdf
Creating a Facebook Clone - Part XLVI.pdfCreating a Facebook Clone - Part XLVI.pdf
Creating a Facebook Clone - Part XLVI.pdfShaiAlmog1
 
Creating an Uber Clone - Part XXXX.pdf
Creating an Uber Clone - Part XXXX.pdfCreating an Uber Clone - Part XXXX.pdf
Creating an Uber Clone - Part XXXX.pdfShaiAlmog1
 
Creating a Facebook Clone - Part XV - Transcript.pdf
Creating a Facebook Clone - Part XV - Transcript.pdfCreating a Facebook Clone - Part XV - Transcript.pdf
Creating a Facebook Clone - Part XV - Transcript.pdfShaiAlmog1
 

Similar to Creating a Facebook Clone - Part VI - Transcript.pdf (20)

Creating an Uber Clone - Part XXXIX.pdf
Creating an Uber Clone - Part XXXIX.pdfCreating an Uber Clone - Part XXXIX.pdf
Creating an Uber Clone - Part XXXIX.pdf
 
Initial UI Mockup - Part 3.pdf
Initial UI Mockup - Part 3.pdfInitial UI Mockup - Part 3.pdf
Initial UI Mockup - Part 3.pdf
 
Extracting ui Design - part 6 - transcript.pdf
Extracting ui Design - part 6 - transcript.pdfExtracting ui Design - part 6 - transcript.pdf
Extracting ui Design - part 6 - transcript.pdf
 
Creating a Facebook Clone - Part XXIX - Transcript.pdf
Creating a Facebook Clone - Part XXIX - Transcript.pdfCreating a Facebook Clone - Part XXIX - Transcript.pdf
Creating a Facebook Clone - Part XXIX - Transcript.pdf
 
Adapting to Tablets and Desktops - Part 3 - Transcript.pdf
Adapting to Tablets and Desktops - Part 3 - Transcript.pdfAdapting to Tablets and Desktops - Part 3 - Transcript.pdf
Adapting to Tablets and Desktops - Part 3 - Transcript.pdf
 
Creating an Uber Clone - Part XXXX - Transcript.pdf
Creating an Uber Clone - Part XXXX - Transcript.pdfCreating an Uber Clone - Part XXXX - Transcript.pdf
Creating an Uber Clone - Part XXXX - Transcript.pdf
 
Creating a Facebook Clone - Part VIII.pdf
Creating a Facebook Clone - Part VIII.pdfCreating a Facebook Clone - Part VIII.pdf
Creating a Facebook Clone - Part VIII.pdf
 
Creating a Facebook Clone - Part XLI.pdf
Creating a Facebook Clone - Part XLI.pdfCreating a Facebook Clone - Part XLI.pdf
Creating a Facebook Clone - Part XLI.pdf
 
Creating a Facebook Clone - Part IV.pdf
Creating a Facebook Clone - Part IV.pdfCreating a Facebook Clone - Part IV.pdf
Creating a Facebook Clone - Part IV.pdf
 
Initial UI Mockup - Part 2.pdf
Initial UI Mockup - Part 2.pdfInitial UI Mockup - Part 2.pdf
Initial UI Mockup - Part 2.pdf
 
Initial UI Mockup - Part 2 - Transcript.pdf
Initial UI Mockup - Part 2 - Transcript.pdfInitial UI Mockup - Part 2 - Transcript.pdf
Initial UI Mockup - Part 2 - Transcript.pdf
 
Creating a Facebook Clone - Part XXXV - Transcript.pdf
Creating a Facebook Clone - Part XXXV - Transcript.pdfCreating a Facebook Clone - Part XXXV - Transcript.pdf
Creating a Facebook Clone - Part XXXV - Transcript.pdf
 
Creating a Facebook Clone - Part XXXV.pdf
Creating a Facebook Clone - Part XXXV.pdfCreating a Facebook Clone - Part XXXV.pdf
Creating a Facebook Clone - Part XXXV.pdf
 
Initial UI Mockup - Part 3 - Transcript.pdf
Initial UI Mockup - Part 3 - Transcript.pdfInitial UI Mockup - Part 3 - Transcript.pdf
Initial UI Mockup - Part 3 - Transcript.pdf
 
Creating an Uber Clone - Part V - Transcript.pdf
Creating an Uber Clone - Part V - Transcript.pdfCreating an Uber Clone - Part V - Transcript.pdf
Creating an Uber Clone - Part V - Transcript.pdf
 
Creating a Facebook Clone - Part XLII.pdf
Creating a Facebook Clone - Part XLII.pdfCreating a Facebook Clone - Part XLII.pdf
Creating a Facebook Clone - Part XLII.pdf
 
Creating a Facebook Clone - Part XLVI.pdf
Creating a Facebook Clone - Part XLVI.pdfCreating a Facebook Clone - Part XLVI.pdf
Creating a Facebook Clone - Part XLVI.pdf
 
Creating an Uber Clone - Part XXXX.pdf
Creating an Uber Clone - Part XXXX.pdfCreating an Uber Clone - Part XXXX.pdf
Creating an Uber Clone - Part XXXX.pdf
 
Creating a Facebook Clone - Part XV - Transcript.pdf
Creating a Facebook Clone - Part XV - Transcript.pdfCreating a Facebook Clone - Part XV - Transcript.pdf
Creating a Facebook Clone - Part XV - Transcript.pdf
 
Team pdf ionic
Team pdf ionicTeam pdf ionic
Team pdf ionic
 

More from ShaiAlmog1

The Duck Teaches Learn to debug from the masters. Local to production- kill ...
The Duck Teaches  Learn to debug from the masters. Local to production- kill ...The Duck Teaches  Learn to debug from the masters. Local to production- kill ...
The Duck Teaches Learn to debug from the masters. Local to production- kill ...ShaiAlmog1
 
create-netflix-clone-06-client-ui.pdf
create-netflix-clone-06-client-ui.pdfcreate-netflix-clone-06-client-ui.pdf
create-netflix-clone-06-client-ui.pdfShaiAlmog1
 
create-netflix-clone-01-introduction_transcript.pdf
create-netflix-clone-01-introduction_transcript.pdfcreate-netflix-clone-01-introduction_transcript.pdf
create-netflix-clone-01-introduction_transcript.pdfShaiAlmog1
 
create-netflix-clone-02-server_transcript.pdf
create-netflix-clone-02-server_transcript.pdfcreate-netflix-clone-02-server_transcript.pdf
create-netflix-clone-02-server_transcript.pdfShaiAlmog1
 
create-netflix-clone-04-server-continued_transcript.pdf
create-netflix-clone-04-server-continued_transcript.pdfcreate-netflix-clone-04-server-continued_transcript.pdf
create-netflix-clone-04-server-continued_transcript.pdfShaiAlmog1
 
create-netflix-clone-01-introduction.pdf
create-netflix-clone-01-introduction.pdfcreate-netflix-clone-01-introduction.pdf
create-netflix-clone-01-introduction.pdfShaiAlmog1
 
create-netflix-clone-06-client-ui_transcript.pdf
create-netflix-clone-06-client-ui_transcript.pdfcreate-netflix-clone-06-client-ui_transcript.pdf
create-netflix-clone-06-client-ui_transcript.pdfShaiAlmog1
 
create-netflix-clone-03-server.pdf
create-netflix-clone-03-server.pdfcreate-netflix-clone-03-server.pdf
create-netflix-clone-03-server.pdfShaiAlmog1
 
create-netflix-clone-04-server-continued.pdf
create-netflix-clone-04-server-continued.pdfcreate-netflix-clone-04-server-continued.pdf
create-netflix-clone-04-server-continued.pdfShaiAlmog1
 
create-netflix-clone-05-client-model_transcript.pdf
create-netflix-clone-05-client-model_transcript.pdfcreate-netflix-clone-05-client-model_transcript.pdf
create-netflix-clone-05-client-model_transcript.pdfShaiAlmog1
 
create-netflix-clone-03-server_transcript.pdf
create-netflix-clone-03-server_transcript.pdfcreate-netflix-clone-03-server_transcript.pdf
create-netflix-clone-03-server_transcript.pdfShaiAlmog1
 
create-netflix-clone-02-server.pdf
create-netflix-clone-02-server.pdfcreate-netflix-clone-02-server.pdf
create-netflix-clone-02-server.pdfShaiAlmog1
 
create-netflix-clone-05-client-model.pdf
create-netflix-clone-05-client-model.pdfcreate-netflix-clone-05-client-model.pdf
create-netflix-clone-05-client-model.pdfShaiAlmog1
 
Creating a Whatsapp Clone - Part II.pdf
Creating a Whatsapp Clone - Part II.pdfCreating a Whatsapp Clone - Part II.pdf
Creating a Whatsapp Clone - Part II.pdfShaiAlmog1
 
Creating a Whatsapp Clone - Part IX - Transcript.pdf
Creating a Whatsapp Clone - Part IX - Transcript.pdfCreating a Whatsapp Clone - Part IX - Transcript.pdf
Creating a Whatsapp Clone - Part IX - Transcript.pdfShaiAlmog1
 
Creating a Whatsapp Clone - Part II - Transcript.pdf
Creating a Whatsapp Clone - Part II - Transcript.pdfCreating a Whatsapp Clone - Part II - Transcript.pdf
Creating a Whatsapp Clone - Part II - Transcript.pdfShaiAlmog1
 
Creating a Whatsapp Clone - Part V - Transcript.pdf
Creating a Whatsapp Clone - Part V - Transcript.pdfCreating a Whatsapp Clone - Part V - Transcript.pdf
Creating a Whatsapp Clone - Part V - Transcript.pdfShaiAlmog1
 
Creating a Whatsapp Clone - Part IV - Transcript.pdf
Creating a Whatsapp Clone - Part IV - Transcript.pdfCreating a Whatsapp Clone - Part IV - Transcript.pdf
Creating a Whatsapp Clone - Part IV - Transcript.pdfShaiAlmog1
 
Creating a Whatsapp Clone - Part IV.pdf
Creating a Whatsapp Clone - Part IV.pdfCreating a Whatsapp Clone - Part IV.pdf
Creating a Whatsapp Clone - Part IV.pdfShaiAlmog1
 
Creating a Whatsapp Clone - Part I - Transcript.pdf
Creating a Whatsapp Clone - Part I - Transcript.pdfCreating a Whatsapp Clone - Part I - Transcript.pdf
Creating a Whatsapp Clone - Part I - Transcript.pdfShaiAlmog1
 

More from ShaiAlmog1 (20)

The Duck Teaches Learn to debug from the masters. Local to production- kill ...
The Duck Teaches  Learn to debug from the masters. Local to production- kill ...The Duck Teaches  Learn to debug from the masters. Local to production- kill ...
The Duck Teaches Learn to debug from the masters. Local to production- kill ...
 
create-netflix-clone-06-client-ui.pdf
create-netflix-clone-06-client-ui.pdfcreate-netflix-clone-06-client-ui.pdf
create-netflix-clone-06-client-ui.pdf
 
create-netflix-clone-01-introduction_transcript.pdf
create-netflix-clone-01-introduction_transcript.pdfcreate-netflix-clone-01-introduction_transcript.pdf
create-netflix-clone-01-introduction_transcript.pdf
 
create-netflix-clone-02-server_transcript.pdf
create-netflix-clone-02-server_transcript.pdfcreate-netflix-clone-02-server_transcript.pdf
create-netflix-clone-02-server_transcript.pdf
 
create-netflix-clone-04-server-continued_transcript.pdf
create-netflix-clone-04-server-continued_transcript.pdfcreate-netflix-clone-04-server-continued_transcript.pdf
create-netflix-clone-04-server-continued_transcript.pdf
 
create-netflix-clone-01-introduction.pdf
create-netflix-clone-01-introduction.pdfcreate-netflix-clone-01-introduction.pdf
create-netflix-clone-01-introduction.pdf
 
create-netflix-clone-06-client-ui_transcript.pdf
create-netflix-clone-06-client-ui_transcript.pdfcreate-netflix-clone-06-client-ui_transcript.pdf
create-netflix-clone-06-client-ui_transcript.pdf
 
create-netflix-clone-03-server.pdf
create-netflix-clone-03-server.pdfcreate-netflix-clone-03-server.pdf
create-netflix-clone-03-server.pdf
 
create-netflix-clone-04-server-continued.pdf
create-netflix-clone-04-server-continued.pdfcreate-netflix-clone-04-server-continued.pdf
create-netflix-clone-04-server-continued.pdf
 
create-netflix-clone-05-client-model_transcript.pdf
create-netflix-clone-05-client-model_transcript.pdfcreate-netflix-clone-05-client-model_transcript.pdf
create-netflix-clone-05-client-model_transcript.pdf
 
create-netflix-clone-03-server_transcript.pdf
create-netflix-clone-03-server_transcript.pdfcreate-netflix-clone-03-server_transcript.pdf
create-netflix-clone-03-server_transcript.pdf
 
create-netflix-clone-02-server.pdf
create-netflix-clone-02-server.pdfcreate-netflix-clone-02-server.pdf
create-netflix-clone-02-server.pdf
 
create-netflix-clone-05-client-model.pdf
create-netflix-clone-05-client-model.pdfcreate-netflix-clone-05-client-model.pdf
create-netflix-clone-05-client-model.pdf
 
Creating a Whatsapp Clone - Part II.pdf
Creating a Whatsapp Clone - Part II.pdfCreating a Whatsapp Clone - Part II.pdf
Creating a Whatsapp Clone - Part II.pdf
 
Creating a Whatsapp Clone - Part IX - Transcript.pdf
Creating a Whatsapp Clone - Part IX - Transcript.pdfCreating a Whatsapp Clone - Part IX - Transcript.pdf
Creating a Whatsapp Clone - Part IX - Transcript.pdf
 
Creating a Whatsapp Clone - Part II - Transcript.pdf
Creating a Whatsapp Clone - Part II - Transcript.pdfCreating a Whatsapp Clone - Part II - Transcript.pdf
Creating a Whatsapp Clone - Part II - Transcript.pdf
 
Creating a Whatsapp Clone - Part V - Transcript.pdf
Creating a Whatsapp Clone - Part V - Transcript.pdfCreating a Whatsapp Clone - Part V - Transcript.pdf
Creating a Whatsapp Clone - Part V - Transcript.pdf
 
Creating a Whatsapp Clone - Part IV - Transcript.pdf
Creating a Whatsapp Clone - Part IV - Transcript.pdfCreating a Whatsapp Clone - Part IV - Transcript.pdf
Creating a Whatsapp Clone - Part IV - Transcript.pdf
 
Creating a Whatsapp Clone - Part IV.pdf
Creating a Whatsapp Clone - Part IV.pdfCreating a Whatsapp Clone - Part IV.pdf
Creating a Whatsapp Clone - Part IV.pdf
 
Creating a Whatsapp Clone - Part I - Transcript.pdf
Creating a Whatsapp Clone - Part I - Transcript.pdfCreating a Whatsapp Clone - Part I - Transcript.pdf
Creating a Whatsapp Clone - Part I - Transcript.pdf
 

Recently uploaded

How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024The Digital Insurer
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...apidays
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...DianaGray10
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistandanishmna97
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodJuan lago vázquez
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsNanddeep Nachan
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesrafiqahmad00786416
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyKhushali Kathiriya
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusZilliz
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherRemote DBA Services
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...Zilliz
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobeapidays
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdfSandro Moreira
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Victor Rentea
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024The Digital Insurer
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024The Digital Insurer
 
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 2024The Digital Insurer
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Angeliki Cooney
 

Recently uploaded (20)

How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 
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
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 

Creating a Facebook Clone - Part VI - Transcript.pdf

  • 1. Creating a Facebook Clone - Part VI The SignupForm abstracts the whole process and generalizes most of the common features in the signup stages.
  • 2. © Codename One 2017 all rights reserved All of these forms are handled by one class: SignupForm. Lets start by reviewing the generic aspect of that class and then dig into every stage.
  • 3. public class SignupForm extends Form { Container content = new Container(BoxLayout.y(), "PaddedContainer"); Container south = new Container(BoxLayout.y()); protected SignupForm(String title, String backLabel, Form previous) { super(title, new BorderLayout()); setUIID("SignupForm"); content.setScrollableY(true); add(CENTER, content); getToolbar().setBackCommand(backLabel, Toolbar.BackCommandPolicy.WHEN_USES_TITLE_OTHERWISE_ARROW, e -> previous.showBack()); getToolbar().getTitleComponent().setUIID("Title", "TitleLandscape"); Button problem = new Button("Report a Problem", "BlueLink"); south.add(problem); problem.addActionListener(e -> sendMessage("Problem with Facebook Clone", new Message("Details..."), "mark@facebook.com")); add(SOUTH, south); } Button createNextButton(ActionListener al) { SignupForm The signup form is a form that encapsulates common functionality in all of these forms. We use the content Container to place the main UI and the south Container for the links on the bottom
  • 4. public class SignupForm extends Form { Container content = new Container(BoxLayout.y(), "PaddedContainer"); Container south = new Container(BoxLayout.y()); protected SignupForm(String title, String backLabel, Form previous) { super(title, new BorderLayout()); setUIID("SignupForm"); content.setScrollableY(true); add(CENTER, content); getToolbar().setBackCommand(backLabel, Toolbar.BackCommandPolicy.WHEN_USES_TITLE_OTHERWISE_ARROW, e -> previous.showBack()); getToolbar().getTitleComponent().setUIID("Title", "TitleLandscape"); Button problem = new Button("Report a Problem", "BlueLink"); south.add(problem); problem.addActionListener(e -> sendMessage("Problem with Facebook Clone", new Message("Details..."), "mark@facebook.com")); add(SOUTH, south); } Button createNextButton(ActionListener al) { SignupForm The constructor is protected as it's used only within this class
  • 5. public class SignupForm extends Form { Container content = new Container(BoxLayout.y(), "PaddedContainer"); Container south = new Container(BoxLayout.y()); protected SignupForm(String title, String backLabel, Form previous) { super(title, new BorderLayout()); setUIID("SignupForm"); content.setScrollableY(true); add(CENTER, content); getToolbar().setBackCommand(backLabel, Toolbar.BackCommandPolicy.WHEN_USES_TITLE_OTHERWISE_ARROW, e -> previous.showBack()); getToolbar().getTitleComponent().setUIID("Title", "TitleLandscape"); Button problem = new Button("Report a Problem", "BlueLink"); south.add(problem); problem.addActionListener(e -> sendMessage("Problem with Facebook Clone", new Message("Details..."), "mark@facebook.com")); add(SOUTH, south); } Button createNextButton(ActionListener al) { SignupForm Only the content pane should be scrollable, everything else should be fixed in place
  • 6. public class SignupForm extends Form { Container content = new Container(BoxLayout.y(), "PaddedContainer"); Container south = new Container(BoxLayout.y()); protected SignupForm(String title, String backLabel, Form previous) { super(title, new BorderLayout()); setUIID("SignupForm"); content.setScrollableY(true); add(CENTER, content); getToolbar().setBackCommand(backLabel, Toolbar.BackCommandPolicy.WHEN_USES_TITLE_OTHERWISE_ARROW, e -> previous.showBack()); getToolbar().getTitleComponent().setUIID("Title", "TitleLandscape"); Button problem = new Button("Report a Problem", "BlueLink"); south.add(problem); problem.addActionListener(e -> sendMessage("Problem with Facebook Clone", new Message("Details..."), "mark@facebook.com")); add(SOUTH, south); } Button createNextButton(ActionListener al) { SignupForm This supports the back behavior where an arrow is shown on Android & backLabel is shown in iOS
  • 7. public class SignupForm extends Form { Container content = new Container(BoxLayout.y(), "PaddedContainer"); Container south = new Container(BoxLayout.y()); protected SignupForm(String title, String backLabel, Form previous) { super(title, new BorderLayout()); setUIID("SignupForm"); content.setScrollableY(true); add(CENTER, content); getToolbar().setBackCommand(backLabel, Toolbar.BackCommandPolicy.WHEN_USES_TITLE_OTHERWISE_ARROW, e -> previous.showBack()); getToolbar().getTitleComponent().setUIID("Title", "TitleLandscape"); Button problem = new Button("Report a Problem", "BlueLink"); south.add(problem); problem.addActionListener(e -> sendMessage("Problem with Facebook Clone", new Message("Details..."), "mark@facebook.com")); add(SOUTH, south); } Button createNextButton(ActionListener al) { SignupForm We give the title a different UIID when it's in landscape mode so it can shrink when we rotate the device
  • 8. public class SignupForm extends Form { Container content = new Container(BoxLayout.y(), "PaddedContainer"); Container south = new Container(BoxLayout.y()); protected SignupForm(String title, String backLabel, Form previous) { super(title, new BorderLayout()); setUIID("SignupForm"); content.setScrollableY(true); add(CENTER, content); getToolbar().setBackCommand(backLabel, Toolbar.BackCommandPolicy.WHEN_USES_TITLE_OTHERWISE_ARROW, e -> previous.showBack()); getToolbar().getTitleComponent().setUIID("Title", "TitleLandscape"); Button problem = new Button("Report a Problem", "BlueLink"); south.add(problem); problem.addActionListener(e -> sendMessage("Problem with Facebook Clone", new Message("Details..."), "mark@facebook.com")); add(SOUTH, south); } Button createNextButton(ActionListener al) { SignupForm The problems link is added to the bottom of the UI inside a container so we can add additional elements there
  • 9. add(CENTER, content); getToolbar().setBackCommand(backLabel, Toolbar.BackCommandPolicy.WHEN_USES_TITLE_OTHERWISE_ARROW, e -> previous.showBack()); getToolbar().getTitleComponent().setUIID("Title", "TitleLandscape"); Button problem = new Button("Report a Problem", "BlueLink"); south.add(problem); problem.addActionListener(e -> sendMessage("Problem with Facebook Clone", new Message("Details..."), "mark@facebook.com")); add(SOUTH, south); } Button createNextButton(ActionListener al) { Button next = new Button("Next", "NextButton"); next.addActionListener(al); return next; } public static SignupForm createTerms() { SignupForm s = new SignupForm("Create Account", "Sign In", getCurrentForm()); Label title = new Label("Terms & Conditions", "SignupSubHeader"); RichTextView rt = new RichTextView("By signing up you agree to our " SignupForm This is the next button that appears in each stage. The static methods below create each stage of the wizard. Now we have all the infrastructure in place to build the individual stages of signup…
  • 10. © Codename One 2017 all rights reserved The first stage is the Terms & Conditions form which we create in the createTerms() method.
  • 11. © Codename One 2017 all rights reserved In this form we have some highlighted text, for this we will need the RichTextView control that provides rich text viewing capabilities. We could use a BrowserComponent but that might lead us down a problematic path of matching fonts/behaviors with the HTML renderer. For this case I'd rather have something simple.
  • 12. next.addActionListener(al); return next; } public static SignupForm createTerms() { SignupForm s = new SignupForm("Create Account", "Sign In", getCurrentForm()); Label title = new Label("Terms & Conditions", "SignupSubHeader"); RichTextView rt = new RichTextView("By signing up you agree to our " + "<a href="terms">Facebook Terms</a> and that you have " + "read our <a href="data-policy">Data Policy</a>, including " + "our <a href="cookie-use">Cookie Use</a>."); rt.setAlignment(CENTER); rt.setUIID("PaddedContainer"); Button next = s.createNextButton(e -> createName().show()); next.setText("I Agree"); rt.addLinkListener(e -> { String link = (String)e.getSource(); execute("https://www.codenameone.com/"); }); s.content.addAll(title, rt, next); return s; } createTerms The code for this form is simple. The "Sign In" label appears in the iOS back button
  • 13. next.addActionListener(al); return next; } public static SignupForm createTerms() { SignupForm s = new SignupForm("Create Account", "Sign In", getCurrentForm()); Label title = new Label("Terms & Conditions", "SignupSubHeader"); RichTextView rt = new RichTextView("By signing up you agree to our " + "<a href="terms">Facebook Terms</a> and that you have " + "read our <a href="data-policy">Data Policy</a>, including " + "our <a href="cookie-use">Cookie Use</a>."); rt.setAlignment(CENTER); rt.setUIID("PaddedContainer"); Button next = s.createNextButton(e -> createName().show()); next.setText("I Agree"); rt.addLinkListener(e -> { String link = (String)e.getSource(); execute("https://www.codenameone.com/"); }); s.content.addAll(title, rt, next); return s; } createTerms We center align the HTML, since it renders into FlowLayout this is pretty easy
  • 14. next.addActionListener(al); return next; } public static SignupForm createTerms() { SignupForm s = new SignupForm("Create Account", "Sign In", getCurrentForm()); Label title = new Label("Terms & Conditions", "SignupSubHeader"); RichTextView rt = new RichTextView("By signing up you agree to our " + "<a href="terms">Facebook Terms</a> and that you have " + "read our <a href="data-policy">Data Policy</a>, including " + "our <a href="cookie-use">Cookie Use</a>."); rt.setAlignment(CENTER); rt.setUIID("PaddedContainer"); Button next = s.createNextButton(e -> createName().show()); next.setText("I Agree"); rt.addLinkListener(e -> { String link = (String)e.getSource(); execute("https://www.codenameone.com/"); }); s.content.addAll(title, rt, next); return s; } createTerms We need a different label for the next button, we show the createName form on the next operation
  • 15. next.addActionListener(al); return next; } public static SignupForm createTerms() { SignupForm s = new SignupForm("Create Account", "Sign In", getCurrentForm()); Label title = new Label("Terms & Conditions", "SignupSubHeader"); RichTextView rt = new RichTextView("By signing up you agree to our " + "<a href="terms">Facebook Terms</a> and that you have " + "read our <a href="data-policy">Data Policy</a>, including " + "our <a href="cookie-use">Cookie Use</a>."); rt.setAlignment(CENTER); rt.setUIID("PaddedContainer"); Button next = s.createNextButton(e -> createName().show()); next.setText("I Agree"); rt.addLinkListener(e -> { String link = (String)e.getSource(); execute("https://www.codenameone.com/"); }); s.content.addAll(title, rt, next); return s; } createTerms I left this as a mockup, clicking the links isn't used but you can implement these links in any way you want...
  • 16. next.addActionListener(al); return next; } public static SignupForm createTerms() { SignupForm s = new SignupForm("Create Account", "Sign In", getCurrentForm()); Label title = new Label("Terms & Conditions", "SignupSubHeader"); RichTextView rt = new RichTextView("By signing up you agree to our " + "<a href="terms">Facebook Terms</a> and that you have " + "read our <a href="data-policy">Data Policy</a>, including " + "our <a href="cookie-use">Cookie Use</a>."); rt.setAlignment(CENTER); rt.setUIID("PaddedContainer"); Button next = s.createNextButton(e -> createName().show()); next.setText("I Agree"); rt.addLinkListener(e -> { String link = (String)e.getSource(); execute("https://www.codenameone.com/"); }); s.content.addAll(title, rt, next); return s; } createTerms The content is in the center of the Form and uses BoxLayout on the Y axis. We add elements directly to it. Simple.
  • 17. © Codename One 2017 all rights reserved Next we need to style a lot of elements for this form, a lot of these will apply to the following SignupForm methods so this CSS listing will be a bit longer. First lets look at the UIID's involved.
  • 18. #Constants { includeNativeBool: true; scrollVisibleBool: false; labelGap: 2; capsButtonUiids: "BlueText,GreenButton,BlueButton,NextButton"; landscapeTitleUiidBool: true; } /** unchanged **/ Toolbar { padding: 1mm; border: none; background-color: #4367b3; } Title { font-family: "native:MainLight"; font-size: 4mm; padding: 2mm 1mm 2mm 1mm; margin: 0px; color: white; } theme.css Next lets look at the CSS needed for this. First we need to change two things in the #Constants entry. We need to add the NextButton UIID to the list of caps buttons. landscapeTitleUiidBool indicates that we should use Landscape suffixed UIID's for the title elements. Notice that Facebook didn't uppercase the next button on Android. I chose to do that as it fits better to the platform. I didn't do that for the problems link (or other links) as that's not the convention on Android.
  • 19. #Constants { includeNativeBool: true; scrollVisibleBool: false; labelGap: 2; capsButtonUiids: "BlueText,GreenButton,BlueButton,NextButton"; landscapeTitleUiidBool: true; } /** unchanged **/ Toolbar { padding: 1mm; border: none; background-color: #4367b3; } Title { font-family: "native:MainLight"; font-size: 4mm; padding: 2mm 1mm 2mm 1mm; margin: 0px; color: white; } theme.css Lets go over the new additions to the css now. The Toolbar just has a bit of padding and the right background color
  • 20. /** unchanged **/ Toolbar { padding: 1mm; border: none; background-color: #4367b3; } Title { font-family: "native:MainLight"; font-size: 4mm; padding: 2mm 1mm 2mm 1mm; margin: 0px; color: white; } TitleCommand { font-family: "native:MainLight"; font-size: 2.5mm; padding: 1mm; margin: 0px; color: white; } BackCommand { font-family: "native:MainLight"; font-size: 2.5mm; padding: 3mm 0.5mm 3mm 0.5mm; theme.css The Title is 4mm with a large font, this doesn't look like the more understated Facebook font but I think it looks better
  • 21. /** unchanged **/ Toolbar { padding: 1mm; border: none; background-color: #4367b3; } Title { font-family: "native:MainLight"; font-size: 4mm; padding: 2mm 1mm 2mm 1mm; margin: 0px; color: white; } TitleCommand { font-family: "native:MainLight"; font-size: 2.5mm; padding: 1mm; margin: 0px; color: white; } BackCommand { font-family: "native:MainLight"; font-size: 2.5mm; padding: 3mm 0.5mm 3mm 0.5mm; theme.css The TitleCommand is smaller than the Title so it won't take up too much space
  • 22. } TitleCommand { font-family: "native:MainLight"; font-size: 2.5mm; padding: 1mm; margin: 0px; color: white; } BackCommand { font-family: "native:MainLight"; font-size: 2.5mm; padding: 3mm 0.5mm 3mm 0.5mm; margin: 0px; color: white; } ToolbarLandscpae { padding: 0.5mm; border: none; background-color: #4367b3; } TitleLandscape { font-family: "native:MainLight"; font-size: 3mm; padding: 0px; margin: 0px; theme.css BackCommand is only used in iOS so we keep it even smaller so it will fit with the title which can be a problem with long text
  • 23. } TitleCommand { font-family: "native:MainLight"; font-size: 2.5mm; padding: 1mm; margin: 0px; color: white; } BackCommand { font-family: "native:MainLight"; font-size: 2.5mm; padding: 3mm 0.5mm 3mm 0.5mm; margin: 0px; color: white; } ToolbarLandscpae { padding: 0.5mm; border: none; background-color: #4367b3; } TitleLandscape { font-family: "native:MainLight"; font-size: 3mm; padding: 0px; margin: 0px; theme.css Next we'll discuss the landscape UIID’s. ToolbarLandscape reduces the padding further in the Toolbar
  • 24. color: white; } ToolbarLandscpae { padding: 0.5mm; border: none; background-color: #4367b3; } TitleLandscape { font-family: "native:MainLight"; font-size: 3mm; padding: 0px; margin: 0px; color: white; } TitleCommandLandscape { font-family: "native:MainLight"; font-size: 2.5mm; padding: 0px 1mm 0px 1mm; margin: 0px; color: white; } BackCommandLandscape { font-family: "native:MainLight"; font-size: 2.5mm; padding: 0px 1mm 0px 1mm; margin: 0px; theme.css It also reduces the size of the title font
  • 25. background-color: #4367b3; } TitleLandscape { font-family: "native:MainLight"; font-size: 3mm; padding: 0px; margin: 0px; color: white; } TitleCommandLandscape { font-family: "native:MainLight"; font-size: 2.5mm; padding: 0px 1mm 0px 1mm; margin: 0px; color: white; } BackCommandLandscape { font-family: "native:MainLight"; font-size: 2.5mm; padding: 0px 1mm 0px 1mm; margin: 0px; color: white; } SignupSubHeader { font-family: "native:MainBold"; font-size: 3mm; theme.css If we don't reduce the padding in the command & title area the title area as a whole won't shrink. When I initially implemented this I didn't reduce the sizes of the title command & back command styles. The font shrank but the Toolbar maintained its height. I used the Component Inspector tool in the simulator to look at the differences between preferred height and actual height for all the elements in order to figure out which was at fault.
  • 26. BackCommandLandscape { font-family: "native:MainLight"; font-size: 2.5mm; padding: 0px 1mm 0px 1mm; margin: 0px; color: white; } SignupSubHeader { font-family: "native:MainBold"; font-size: 3mm; text-align: center; margin: 0px; padding: 3mm; } SignupForm { background-color: #F6F7F8; cn1-derive: SplashForm; } NextButton { cn1-derive: BlueButtonOnBlueBackground; margin-top: 3.5mm; } BlueLink { cn1-derive: BaseButton; color: blue; font-size: 2.2mm; theme.css We use a bold center aligned font for the subheading in the forms
  • 27. BackCommandLandscape { font-family: "native:MainLight"; font-size: 2.5mm; padding: 0px 1mm 0px 1mm; margin: 0px; color: white; } SignupSubHeader { font-family: "native:MainBold"; font-size: 3mm; text-align: center; margin: 0px; padding: 3mm; } SignupForm { background-color: #F6F7F8; cn1-derive: SplashForm; } NextButton { cn1-derive: BlueButtonOnBlueBackground; margin-top: 3.5mm; } BlueLink { cn1-derive: BaseButton; color: blue; font-size: 2.2mm; theme.css The signup process forms have an "off white" color which I took from the Android version of the wizard
  • 28. BackCommandLandscape { font-family: "native:MainLight"; font-size: 2.5mm; padding: 0px 1mm 0px 1mm; margin: 0px; color: white; } SignupSubHeader { font-family: "native:MainBold"; font-size: 3mm; text-align: center; margin: 0px; padding: 3mm; } SignupForm { background-color: #F6F7F8; cn1-derive: SplashForm; } NextButton { cn1-derive: BlueButtonOnBlueBackground; margin-top: 3.5mm; } BlueLink { cn1-derive: BaseButton; color: blue; font-size: 2.2mm; theme.css Initially I used BlueButton for this but eventually decided to create a UIID for it as I wanted more spacing from the top. I might change NextButton in the future to work better in landscape by reducing margin in landscape mode.
  • 29. color: white; } SignupSubHeader { font-family: "native:MainBold"; font-size: 3mm; text-align: center; margin: 0px; padding: 3mm; } SignupForm { background-color: #F6F7F8; cn1-derive: SplashForm; } NextButton { cn1-derive: BlueButtonOnBlueBackground; margin-top: 3.5mm; } BlueLink { cn1-derive: BaseButton; color: blue; font-size: 2.2mm; padding: 1.5mm; font-family: "native:MainLight"; } theme.css The link at the bottom of the form is relatively small and blue. With this you can run and see the first signup Form. The rest becomes trivial by comparison...