RollViewController

import UIKit

class RollViewController: UIViewController {

	func randomDiceValue() -> Int {
		let randomValue = 1 + arc4random() % 6

		return Int(randomValue)
	}

	@IBAction func rollTheDice(){

		var controller:DiceViewController
		controller = self.storyboard?.instantiateViewControllerWithIdentifier("DiceViewController") as!
		DiceViewController

		controller.firstValue = self.randomDiceValue()
		controller.secondValue = self.randomDiceValue()

		self.presentViewController(controller, animated: true, completion: nil)
	}
}

Presenting the Dice View

import UIKit

class RollViewController: UIViewController {

	func randomDiceValue() -> Int {

		let randomValue = 1 + arc4random() % 6

		return Int(randomDiceValue) 
	}

	@IBAction func rollTheDice(){
		
	}
}
@IBAction func rollTheDice(){

	let controller: DiceViewController
	controller = storyboard?.instantiateViewController(withIdentifier: "DiceViewController") as! DiceViewController

	controller.firstValue = randomDiceValue()
	controller.secondValue = randomDiceValue()

	present(controller, animated: true, completion: nil)
}

Launch Activity View

import UIKit

class ViewController: UIViewController {

	override func viewDidLoad(){
		super.viewDidLoad()
	}

	@IBAction func experiment(){
		let image = UIImage()
		let controller = UIActivityViewController(activityItems: [image],
			applicationActivities: nil)
		self.presentViewController(controller, animated: true, completion:nil)
	}
}
@IBAction func experiment(_ sender: Any){
	let nextController = UIImagePickerController()
	self.present(nextController, animated: true, completion: nil)
}

@IBAction func experiment(_ sender: Any){

	let image = UIImage()
	let controller = UIActivityViewController(activityItems: [image],
		self.present(controller, animated: true, completation: nil))
}
import UIKit

class DiceViewController: UIViewController {

	var firstValue: Int?
	var secondValue: Int?

	@IBOutlet var firstDie: UIImageView!
	@IBOutlet var secondDie: UIImageView!

	override func viewWillAppear(animated: Bool){

		if let firstValue = self.firstValue {
			self.firstDie.image = UIImage(named: "d\(firstValue)")
		} else {
			self.firstDie.image = nil;
		}

		if let secondValue = self.secondValue {
			self.secondDie.image = UIImage(named: "d\(secondValue)")
		} else {
			self.secondDie.image = nil
		}

		self.firstDie.alpha = 0
		self.secondDie.alpha = 0
	}
}

Storyboard

import UIKit

class ViewController: UIViewController {

	var count = 0
	var label:UILabel!

	func incrementCount(){
		self.count++
		self.label.text = "\(self.count)"
	}
}
import UIKit

class ViewController: UIViewController {

	@IBOutlet weak var colorView: UIView!
	@IBOutlet weak var redControl: UISwitch!
	@IBOutlet weak var greenControl: UISwitch!
	@IBOutlet weak var blueControl: UISwitch!

	override func viewDidLoad(){
		super.viewDidLoad()
	}

	@IBAction func changeColorComponent(sender: AnyObject){
		let r: CGFloat = self.redControl.on ? 1:0
		let g: CGFloat = self.greenControl.on ? 1:0
		let b: CGFloat = self.blueControl.on ? 1 : 0

		colorView.backgroundColor = UIColor(red: r, green: g, blue: b, alpha:1)
	}
}
@IBAction func experiment(){
	let nextController = UIImagePickerController()
	self.presentViewController(nextController, animated: true, completion:nil)
}

Map

1.Outlets and Actions
2.Presenting View Controllers
3.The Delegate Pattern
4.Tables
5.Navigation
6.MemeMe Techniques

Clike counter
ViewController -> UIViewm UILabel, UIButton

import UIKit

class ViewController: UIViewController {
	override func viewDidLoad(){
		super.viewDidLoad()
		var label = UILabel()
		label.frame = CGRectMake(150, 150, 60, 60)
		label.text = "0"

		self.view.addSubview(label)

		var button = UIButton()
		button.frame = CGRectMake(150, 250, 60, 60)
		button.setTitle("click", forState: .Normal)
		button.setTitleColor(UIColor.blueColor(), forState: .Normal)
		self.view.addSubview(button)
	}
}
import UIKit

class ViewController: UIViewController {

	var count = 0
	var label:UILabel!

	override func viewDidLoad(){
		super.viewDidLoad()
		var label = UILabel()
		label.frame = CGRectMake(150, 150, 60, 60)
		label.text = "0"

		self.view.addSubview(label)
		self.label = label

		var button = UIButton()
		button.frame = CGRectMake(150, 250, 60, 60)
		button.setTitle("click", forState: .Normal)
		button.setTitleColor(UIColor.blueColor(), forState: .Normal)
		self.view.addSubview(button)

		button.addTarget(self, action: "incrementCount", forControlEvents:
			UIControlEvents.TouchUpInside)
	}
	func incrementCount(){
		self.count++
		self.label.text = "\(self.count)"
	}
}

Implementation Steps

Name, Service, Conditions, Event Handler
Name:makeUppercase, Realtime Database, Trigger on specific path, makeUppercase handler

const functions = require('firebase-functions');

exports.emojify = functions.database.ref('/messages/{pushId}/text')
	.onWrite(event => {
		if(!event.data.val()|| event.data.previous.val()){
			console.log("not a new write event");
			return;
		}

		console.log("emojifying");

		const originalText = event.data.val();
		const emojifiedText = emojifyText(originalText);

		return event.data.ref.set(emojifiedText);
	});

	function emojifyText(text){
		var emojifiedText = text;
		emojifiedText = emojifiedText.replace(/\blob\b/id, "");
		emojifiedText = emojifiedText.replace(/\blob\b/id, "");
		return emojifiedText;
	}

FirebaseUI Authentication

Adding Sign In
-Email/Password
-Google
-Facebook
-Twitter
-GitHub

mPhotoPickerButton.setOnClickListener(new View.OnClickListener(){
	@Override
	public void onClick(View view){
		Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
		intent.setType("image/jpeg");
		intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
		startActivityForResult(Intent.createChooser(intent, "Complete action using"), RC_PHOTO_PICKER);
	}
});
service firebase.storage {
	match /b/friendlychat-12987.appspot.com/o {
		match /{allPaths=**} {
			allow read, write: if request.auth != null;
		}
	}
}

match /funGifs/cats/{catPics=**}

resource: existing storage data
request: incoming request data

allow read: if request.auth != null && imageId.matches(“.*.gif”)

String name = "Firebase":
name = 3;

var name = "Firebase";
name = 3;

final x = 42;
x = 1024;

const x = 42;
x = 1024

var x = 42;
var y = 1024;

System.out.println("Message");
Log.d(TAG, "Message");

public int multiply(int a, int b){
	return a * b;
}

String[] list = {"apple", "pear", "orange"};

for (int i = 0; i < list.length; i++){
	System.out.println(list[i])
}

Databse implementation

mSendButton.setOnClickListener(new View.OnClickListener(){
	@Override
	public void onClick(View view){
		mMessageEditText.setText("");
	}
});
{
	"rules": {
		".read": true,
		".write": ture
	}
}

Database Security
-Database security rules
-Security rule configuration examples
-Authentication with Firebase

{
	"chat": {
		"messages": {
			"-KS3PV-iwUZp5wkNq70s":{
				"name": "person1",
				"text": "hey!"
			},
			"-KS3PXhIhs8J_inrExy4":{
				"name": "person2",
				"text": "what's up?"
			}
		}
	},
	"special_chat": {
		"messages": {
			"-KR-DwqtKzlWGxSn9P0y":{
				"name": "person1",
				"text":"want to go to the movies?"
			},
			"-KR4tIpWmNn-EYxquSrw": {
				"name": "person3",
				"text": "Yeah! let's meet at 7."
			}
		}
	},
	"users": {
		"uid1":{
			"paid":true
		},
		"uid2": {
			"paid": false
		},
		"uid3": {
			"paid": true
		}
	}

}

Firebase Realtime Database

what is firebase databse?
what can it be used for?
realtime database in action
database structure best practices

“:
“golden”: 1.618
“fog”: true
“palindrome”: “tacocat”
“messages”: “message1”: “name”:”person”, “text”:”Hello?”
“message2”: “name”:”Individual”, “text”:”Hi!”

node should be “child” and “parent

{
	"questions": {
		"ABCDakarandomkey": {
			"question": "Who was the 13th president of the United States?"
			"choice_1": "Millard Fillmore",
			"choice_2": "Zachary Taylor",
			"choice_3": "Franklin Pierce",
			"choice_4": "James K. Polk",
			"answer" :"choice_1"
		},
		"EFGHakarandomkey":{
			"question": "In what year was the first gasoline combustion engine invented?",
			"choice_1":"1769",
			"choice_2":"1886",
			"choice_3":"1807",
			"choice_4":"1864",
			"answer": "choice_4"
		}
	},
	"players":{
		"user_key_1":{
			"name":"Person",
			"opponents":{
				"IJKLakarandomkey":"user_key_2",
				"MNOPakarandomkey":"user_key_6"
			},
			"questions":{
				"ABCDakarandomkey": "Correct",
				"EFGHakarandomkey": "Incorrect"
			}
		},
		"user_key_2": {
			"name": "Mai",
			"opponents": {
				"QRAAakarandomkey": "user_key_1",
				"SQUEakarandomkey": "user_key_6"
			},
			"questions": {
				"ABCDakarandomkey":"Incorrect",
				"EFGHakarandomkey":"Incorrect"
			}
		}
	},
	"opponents": {
		"couple_Key_1": "user_key_1_user_key_2",
		"user_1": "user_key_1",
		"user_2": "user_key_2",
		"winner": "user_key_1"
	}
}

Firebase

Be comfortable with
– making a simple mobile application
– basic command line
– calling a web or cloud API

FriendlyChat
APP, DB, FILE

package com.google.firebase.xxxx.friendlychat;
public class FriendlyMessage {
	private String text;
	private String name;
	private String photoUrl;

	public FriendlyMessage(){
	}

	public FriendlyMessage(String text, String name, String photoUrl){
		this.text = text;
		this.name = name;
		this.photoUrl = photoUrl;
	}

	public String getText(){
		return text;
	}

	public void setText(string text){
		this.text = text;
	}

	public String getName(){
		return name;
	}

	public void setName(String name){
		this.name = name;
	}
	public String getPhotoUrl{
		return photoUrl;
	}

	public void setPhotoUrl(String photoUrl){
		this.photoUrl = photoUrl;
	}
}
package com.google.firebase.xxxx.friendlychat;

import android.os.Bundle;
import android.support.v7.app.AppCompactActivity;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.ProgressBar;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends(Bundle savedInstanceState){
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_main);

	mUsername = ANONYMOUS;

	mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
	mMessageListView = (ListView) findViewById(R.id.messageListView);
	mPhotoPickerButton = (ImageButton) findViewById(R.id.photoPickerButton);
	mMessageEditText = (EditText) findViewById(R.id.messageEditText);
	mSendButton = (Button) findViewById(R.id.sendButton);

	List<FriendlyMessage> friendlyMessages = new ArrayList<>();
	mMessageAdapter = new MessageAdapter(this, R.layout.item_message, friendlyMessages);
	mMessageListView.setAdapter(mMessageAdapter);

	mProgressBar.setVisibility(ProgressBar.INVISIBLE);

	mPhotoPickerButton.setOnClickListener(new View.OnClickListener(){
		@Override
		public void onClick(View view){

		}
	});

	mMessageEditText.addTextChangedListener(new TextWatcher(){
		@Override
		public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2){			
		}

		@Override
		public void onTestChanged(CharSequence charSequence, int i, int i1, int i2){
			if (charSequence.toString().trim().length() > 0){
				mSendButton.setEnable(true);
			} else {
				mSendButton.setEnabled(false);
			}
		}

		@Override
		public void afterTextChanged(Editable editable){
		}
	});
	mMessageEditText.setFilter(new InputFilter[]{new InputFilter.LengthFilter(DEFALT_MSG_LENGTH_LIMIT)});

	mSendButton.setOnClickListener(new View.OnClickListener(){
		@Override
		public void onClick(View view){
			mMessageEditText.setText("");
		}
	});

	@Override
	public boolean onCreateOptionsMenu(Menu menu){
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.main_menu, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item){
		return super.onOptionsItemSelected(item);
	}
}