Friday, November 24, 2017

rent apartment utrecht


welcome everybody my talk!my talk is about custom components and i'm going to tell you why they're probablyeasier than you think, unless you're already familiar with them to you probably be bored! but maybe i can still giveyou a little bit inside some things that you should probably think about but haven'tcompletely thought. but in any case, my name's paul lammertsma. i'm cto at pixplicity where here in the netherlands in utrecht.we make apps for larger brands; international brands,mostly dutch brands. we also do custom tablets andembedded

systemsbut i'm going to talk about customcomponents so, first things first: what is component?all these things are components, right? the android sdk of course comes with apreset bundle of all sorts of componentslike buttons and text views and edit texts, toggle buttons, and the progress penner am so that e these are the stuff to comeout the box but each this doesn't always cut it for youwanna have something a little nicer maybe something asm you know differentbehavior anna so so that's when we get stuff we callcustom components

and there are plenty of customcomponents out there on the web now you can take a look at them you can downloadand use them doesn't necessarily mean that you'lllearn how to eat where how they work but i'm a couple ones out there up that you could take a look at it for instancegive something back its on i'm our princes the staggered gridview %uh this is one that allows you to but views next to each other in agridview that would whereas a gridview would always like align them just onelast year but them staggered another one is this is a by jake whartonit see it you better indicators here at

bottom it you can be nice i think it's gonna i was eating but you consider using itmaybe with some a little flavor another one is i by the way i'm not advocating the use ofthese and these are just for illustrative purposes am this is a a drag drop grid the idea is that you long press on itemin and and right now my fingers actually moving item to around in the other oneswobbling like the irs home screen

anna if you drag a down economy movingall together um so its key components you can rearrangein that way in force your am since ice cream sandwich courseyou know showcases an effort for like a tutorial how do you at illustrate some functionality yourapp might be really nice to have some sort of showcase on top at these are all components that rrt out there so doesn't make a lot ofsense to be talking about this i'm instead going to eat it taking am anexample

at throughout the presentation and thatis at this font text you like a line am you can make course you know your owntype you can use your own type face in your app that's that's nothing new i'myou probably know that and but i'm going to to take this is anexample to show you why this is an ideal candidate ferguson viewbecause it's super easy to make and other example i'm gonna give you is a simple animation just illustrate somelee outing and drawing so custom custom combines right well why doyou when he's discussing combines why

don't you just up i don't know right now and layout andfrance's you could do that you could do that for instance for athat staggered grid view and you could just have a scrollview inside that a and a linearlayout horizontally ala oriented and insidethat too vernon vertically oriented fling your layouts you're getting there am there lottalayouts in there which means again be i get awesome pew pewsomething's gonna be a lot of

unnecessary layout in probably and another problem with that of course beis especially in this case image views all this things bendy in memory all thetime so you not really you know making good use of a legalissue are you exchange views you to convert ewing recycling am but e actually usually you you can't youalways need some custom code especially in case this example amyou're gonna have to set the taipei somehow he can't do that just the layout that's not going to work so then why notjust right now to go to mean we could

dictate that text field and a su you know set type facing now it began totake place from assets folder and but it in that you could do that but youwant to keep your views in your model separated like okay so say we have an activitythat inflates layout and in that way out we have a at we havetext you if you going to do everything on codewhy not just take that text you and put it in your activity increased from goat you can do that but it's gonna make yougo to lynne manageable

and really if you want to keep to the atthe the you want a controller you you don't wanna do they mean before youfree now yes im sick or some crap like this and i donate touch your code because if thisis anything to go by no thanks so then why don't we just make acombination %uh layout encode what we will actually except economy climbs so than i do in a nice way and if younever use a custom component ever major

own before it's probably in a differentway than you think because i'm not talking about leavingthat text you in your layout and addressing that text you be a findyou by i d and then to accept type face on it am because that really implies that youractivity and knows something about the view that you wants to givesome visual and bitter flavor am you if you want tochange the font then instead of change that your layoutyou now have to dive into the code again activity in change

there and yes you could probably do itstyle than you did we really going into a slippery slope them sup backdoor example this text funny howwe're going to make its well there's probably one thing youshould know about a custom component that is net at the root any component is theview am in fact at the the documentation saysabout is the basic building block all of enjoys anna ui components so a div you for such as a class

now we can take that class we can extendit right so let's do that and here i have my phone to text youi've extended texteo am which internet extends views that'scool if am and i automatically by doing thishave to take include 3 constructors at the first constructoris the constructor for when you'regenerating it from your code like wages did with the new text you i you of course provide context and youcreated in your code up we don't really want to do that butwe're just to make the constructor so

that we can for whatevers the second one is moreimportant and this one is when you actually inflating at 3x now you get an attribute set from theinflator and attributes eg easy information without whatever you have for likes isit is more simple examples probably like the layout wit and leo height right am animate providing a super forceuse get onto the text you which in turn is it onto the view

which then make sure that you know thelayout ng works so this this actually the snippet ofcode love coursework any just its is a text you so all we would have to do is take thisfont text you put an early out in a behave exactly the same as a text you i don't quickly mention this is essentially the same asthe previous model for inflation for mac now except you can provide a base you can provide abase based i'll do it

and if i have time i can get to thatpoint um so that like i said this is basicallya text you didn't do anything new so i just don't function in there that this set typeface and have introduced a a autile class you'll do fine in just a momentbut here when i just want to do like the idea that i have is my dream isi just say okay i want i want some fun i would likegeorgia dot edf i just throw that in there and you knowit shows up i don't have to do any extra coding i just have my

avon text you in my layout and it works so here i define ito class am and yessir i just basic stuff we have a a we createfrom the assets folder and a typeface and and a that's literally putting these funfiles inside your ass is fully cover me with assets feliz basically eicher a it's kinda like the res folder exceptsome precedents delivered with you happy you can't address it you take anything out of it doesn'tmatter one sold we

we get from a contest we get assetsfolder forward to keep things kinda tidy i put in a subfolder fonts and a howthis works is this a panicle is probably not the best way doingthings because if i have to font excuse then and i both given the same font namethen it's going to be doing this creatingfrom from asset twice so we probably reuse then and just toshow you you know because it's better way do you know theshow you a quick anna i just a hash map is for caching so i take it off added i take thistypeface i generate

that i've created from the assets folderi throw into the into the cash and you know if it exists that i justgrab it if doesn't agree and i put in there and the last two courses last sep isactually doing doing the magic of happening it i facenothing really to specialist at the setai faces just belongs to the text you and and justprovide a text editor a tie facing it just worked okay that that concludes the code part in itnow all we have to do

is am get irked guitar you in there and the way have doing that is am anna where you would normally does have atext you you now provide fun text you accept make sure that you provide thefully-qualified name for it as otherwise android of course doesn't know its wasbe looking for it um and that's pretty much it this thiswill this will work am it will just be a text you because itdoesn't know actually have when /url how it's supposed to invoke this

this this font this this type facesitting am so how how do we what we want to do yearand you know ideally is probably add anattribute here that says an typeface is georgia dot edf or even better yetactually would be it i would take a style the sample textsilent instead i was at my style and i want the georgia dot etf am so this is this how i'm going to doin am this is it this is i guess i only theonly really tricky part

it's an attribute and you defineattributes by an yet you can define it within a stylebecause what we want to do is we want to define how we're going to style aparticular component so i declare style bowl munching on avote for michael just a moment i can call it you know for consistencysake and call it fun text you and that style then ofcourse includes a tattoo that i want to use don't i face raiders string am a better way actually that i personallybelieve in doing this is actually taking

outside ass i'll go because if you wantto use that same attribute name i you you take outsiderthere because if you going to reuse the same attribute name andrew is gonna complain that's alreadybeen fined so just fine at once the beginning and just reuse it anna like this i think you can actually provide formatas reference i'm not sure if that works but this this works too so

back to our for text you am when like i said when our font text you isbeing created from xml so in the second constructor am wehaven't attributes said you know provided to usfrom the inflator and we can use that am i went ahead andjust chose resolution always invokes it because i get theopportunity to do some extra flavoring for whatever i want towith the fun text you i regardless which constructors invokedits kinda bland i think this this kinda stuff always gonna illustratethe problem with the

you know the constructor you knowconstruction in java but anyway this work okay so he's liking it function am i itake the attribute set driver s probably per se this this thingat the bottom is what we're looking for writers is setting a typeface sign on to reuse that particularfunction am at e in its function a let me show you the you see at the topthat we get to the attribute set so we we can check if the attributesthat is not know that implies a course

that is being inflated retinal am and then we just read it we obtainstyle attributes in this case and we provide whatever default style iwe set in i think at the very beginning iactually said it 2-0 and so it by default it won't use anystyle at all but when it tries to do then is he uses thistied to rate to locate that after the that we define self ijust point out important parts am bases that declares style that we hadrain we call that style a bowl fun text youand attribute name is ty face

so years that attribute as i hear that'stheir style below where a trying to read into the type to ratethis is how we address it so are not styled fun text you and here actually whenlooking for specific act to do with in that style ball we we we look for it and and of courseyou know in in att's all automatically generated when you build a file when youbuild the project automatically sega's and are not style on and these thingsare to show up and then finally what you want to do isit which is a common pitfalls wanna

recycle a type 3 because because memory i guess and and if the typefaces now provided ifit's in the diaper if it's in the attribute set you just set the typeface so back to this layout um right where wewanted to do is one at this attribute how do we do that was really easy am atyour the bottom outs are actually its top personallywant to do is we have to define are namespace declaration

we did at the top i called my napbecause it's an app am and that the past two it is at thesame as the path to the android except europelazy and riding when you fall pakistan cycle mine come up explicitly up to anda contest 13 the same package name that of course isin my a where my which it is located and and down here and is where actuallyuse a namespace am and i define is my face to string iprovide here and avant called able regular not td so does this work stick look

here we have an emulator here are the components and i'll be showing you i actually haven't tested this at octdoes work works horseman tacitly and i think i can actually even rotatethis to show you what happens on rotations and i configure how yes close enough yes it works it works andwhy doesn't work on rotation am well it broke up because we know butin this big get this case my application is

at when is rotated nothing specialhappens so my old activity at and actually fragment of coursebecause it's in africa its fragments am is at ripley its its its destroyed ina new activities brought up and recreated zealotry inflates thelayout in the exact same magic happens and we just did before and there's nothing nothing more to itthan that mean with those lines codes and i wrote i'm literally done i don't have to doanything anymore i can actually provide in that style

document i could be able totheoretically provide the type at the type face and i want to useand all i would have to do is just throwinga punch it excuse font excuse now and i'm done so thatthat's really cool that's nice am but how do we get there style so this is the style and i've beenworking with so far actually show you a code of what i was working was just amoment ago i can do it really quick you'll see that i i set the font for all these thing

so for each one i was also using adifferent of reach one but if i wanted to have an application with anna with using all the same fonts theni don't want to have to write the saudis i want to make you know best uses styles so let me takea look at it this is talon working with so far am ijust providing some standard string in there with particular excise but i want it what i want to do what iwant is best buy a type business how i do it

again just like before we at a specifieda namespace and whereas you always provide thestandard and renee's face not also can use your own namespace so here's my namespace again the come upexpedia and got and and have come 2013 and then attribute name that i want todefine networks so now i have a difference now this one style stylized and he just uses the font whatever'sdefault set

in the style in the southeast and i can show you that year i have my different font excuse and i've done nothing i actually belongsup on that there was something that i wanted to add i thought it might be alittle too much for the presentation but the you also have a.m. yep as youcan see there's no there's no to be there for the text me at a thaiplace just a standard things because i want the different texused to show different texts all literally that i've done years ireplace text you with my fully qualified

path cool flick of ida name to my funtext you so that kind of concludes the yvonnetext you it does a.m. when i talk to that when i talk topeople about dissolution that that i prefer this thisthis is fun text you i always get the criticism am which isvalid and that's it only works for text youyou can and if you want to have a button thatalso is it a custom constant a typeface you have to do the same stuff and wellalmost the same stuff with some some overlap maybe floor for the buttonfor the edittext

a.m. for anything else that reallyextends a text you and it does kind of make it and nuisance am but i'd rather do that for like thefive different appoint someone to use then having to write out said text as atypeface for the anna 100 different excuse andbuttons and whenever i have my apt anna and that i would normally do incluttering my code in the meantime so that is a little i caveat i guess butam yeah i think the pros outweigh the consin any case it's good illustration i'm the second thing that i want to showyou and i is

a simple animation it's a this is goingto be a component is basically just a very simple view thats the draw something and am i was going to do is anna i can maybeshow you what i wanted to do well lettuce poses this is what we wantto do we have a circle anna has in has arc that's killing a certain color and as you can see it's nicely spaced inthe with am and because i want to keep it acircle i have its basically sitting inside so

and their two things i have to keep inmind when doing is personal obviously drawing but the second thing that i have to dois actually the measuring up like a bunny correctly and ideally of course when i want to useis i want to use you know match parents want to set the with do you know match parent i wanna sit tight maybe toread content so first things first eyelets let'screate our class simple animated view extend view am

in the fields are gone ahead and createdmy objects and i create my objects and anna on obama creation as a class that for areason because if because he's a res forpainting obviously so they'll be done drive-ins if i would instead each time idraw event my aunt rock it do this you know newpaint faint dot anti alias like i mean i wouldbe allocating new memory and that's a really bad thing becausehome and radical as garbage collector that works

out but you're going to be for 60 framesa second creating new objects in memory and you're going to be battling to get thegarbage collection by allocating memory in guide the garbage collection tryingto clean it up again so yeah you could still reach that 60 frames a second butyou're not making the garbage collector happy cuz as you're on the cpu cycles and it's also slower because there is aa minor to 23 no second delay and i think that'sactually times too for the collection of objects

so that damn i get a little bit of janeking year you smooth animations so the trick is a course you know justtake those allocated objects and recycle them i'll get them once andkeep on reusing because as long as you have onereference the update you keep going to be using it doesn't need to be and it does needto be cleaned up so i'll in my in it function again ijust basically said all the different things that i want to use i can also create them there but theywill take more lines of code i want to

not slide i'm but that he years is basically aform i l was a background i feel with the gray color i have a as a stroke aroundit's with a a slightly darker shade and i have a astroke for am as i feel for drawing the arc whichis going to be an comfortable a little color to blue like i said i'll get them before he's orthe other thing is you there also for layout events because leeouting to happen a lot of times also

so especially if you have like a weirdanimation that's kinda awesome causing the advance and needing alsoavoid generally is one avoid now for the measurement um and the measure function in android easystrange thing to understand the good thing is you don't really haveto understand your ex am as long as you e as long as you have therights and intention like others are just gothrough it with you any you'll see where becomes weird

am a what i want to do is am i have my i am i animated control and iwant to control to respect was the padding so the that the place where the controlsactually drawn the circle is of sentinel from the top in from theleft by you know the the x and the hours at the the left in the topperpatting and you know of said on the bottom bottom right any accordingly am because i'm drawing acircle i e and

need to provide eighty i keep thinkingit myself i to provide a diameter ok in just a moment but am the with my component is going to be arelative to and is going to be in part determined bythe width by the minimum wage you know plus the padding-left: plus thepending right so you know what i've done as i said the minimum width and i and i've askedandroid to try to resolve the size and state am based upon what i might the suggested minimum with hisand based on the specification

from the on a measure function onmeasure function gives you a measure spec and that is a that is weirdthing is i it's ache it basically consists of two componentscome from android it gives you eighty which and it like a hint it tells you that for instance you wantit to match at the parent with but only angelenoshow that reflects you know through the did you hear a key so when you ask it toresolve the size and state it will and try to fit it according tothat and measure spec and return you a valuethat that that best fits

and in this case i would just be toowith the parent so and let's assume that that's the way andthat the height is instrument from the with am we do the same thing wewe take the batting again but now instead we take whatever thatsize gave 9 if you're paying attention youprobably already noticed something strange going on because with a second wasn't w that with walt noactually that was this this this integer add it getrepresentation not have the week itself but becauseandroid is doing is clever things like

with compressing it so it doesn't usetoo much memory when it's being shuffle shuffle around between on measuring our layout actually and keep sets for itself so you can get youcan ask for the actual with based on that speck dysfunction so i guess the thing to takehome from this is when you do resolves size and statethat that int value is a a binary compressionon the size and its state and you can get the valuethat you want back to doing the same

measure spec and calling a static function get sizenow you actually get the size i think is a pixels but it doesn'tmatter because whatever you return is going to go straight into the set myfeet i mention and that is in the same and using unitso so he would have done is the minimumheight now is determined from the height from theway to the the component plus am and the padding and vertically butsince i've added the padding and horizontally already at to subtractthe first so

what should happen is that money shouldbe square and square one is a square i mean square base upon the the with components so that the hike funimages so yeah exactly this this these measures bexar informationabout how they give you parent wants you to be think that's how the call am so when you doing on measuring you saidtuesday mention of course you can buy changes at least when android thinks it shouldbe changed and you get a call back

function for then that's called on sizechanged and now you actually get the the pixel which in height am yasser gets the oldwith an iphone user am and you can you know you can use thisinformation to determine how you actually going to try to control so i have a direct here than it finds afeel and i have let me see what else ass aveat bottom i've also has a radius i need the wrecked in the race course todraw of anna eighty a circle and i think the rabies isactually specifically

specifically for the arc and it looksthis code looks more complicated than actually is it's basically just whatit's doing is it's taking the the whiff microphone it now and itstaking those patterns of so that only draws within the the padding the specified and finally this diameter am is and ofcourse you know the races have tied so there's nothing to strangeabout them am now of course what i'm going to do is a90 using these these fields and to find after drawing

and that's what i do here am ii dramacircle and the circle i'm using i did i have abackground a question for stalking nice you know nice shanice like a dove gray from mybackground and it basically just rolls at circlefrom the from the top left her with as i with topfrom the top left plus that radius and using areas to drawnice circle same for the stroke as oldoperative a great evening is for stroke and indeedin the arc and then dark actually takes

two values attorney stacey starting angle and a sweep angle and a and and i and i think i use a programcalled to fill it up with a a she blew ok so this this actually this this this wouldactually produce already what we want to accomplish now we would and we league it's probably an anticircle because these values force start starting goals we thank you areprobably zero but he said him something else and

it'll pretty now you probably use a fora bite or something i demio maidens get some extra graphical nicely and you can have actually prettyessential for that am italy outing will work because it takesa height based upon the way from the net so that works is fine but i promisedeighty animated you signing to make animated am what i havehere as i've d find eighty animator and as just a runnable it issomething that they're runs on every frame and all i've donehere as i just change the sweep angle for the arc

and each time that sweep angle isincremented it am invokes base indirectly itselfagain with the certainly and and then in a invalidates the viewso that their on trial will be run whenever and readings should be runam so i year the bottom i have and included alittle bit of jelly bean logic am i'm going to be running my ear my ear animator runnable i'm gonna be runningthat on the v sink am and the 16 of course you might

ask but is that kind of arbitrary valuethat's courses one second divided by 60 frames certain seconds um ii i personally believe that more peopleshould probably be focusing on that last line because am eu did the v sinker theactually the choreographer and in jelly bean allows you as a developer to run things in sync with your with your device soyou get that nice fluid animation at 60

frames per second am because otherwise i'm not sure if youguys are saudi google i/o talk about choreographer its if you haven'tit's definitely worth a watch am because if you don't it could be thatyour runnable is being invoked just between thedrawing have two frames you want to avoid thatbecause even if your draw operation takes less than 60million mill seconds just because it has a slight offsetsafter the frame am it could span over in the next frame

so it would be best to delay that sothat use times invoked it runs you know in that the sink so youso use that when you can of course it sir and is in validation functionthat is indirectly causes the view to be drawn so at some point in the future amandroid will and it probably in this case in alimited in the immediately decide to redraw added you college course on draw iscalled and are arc nicely sweeps front circle

so sick look at this it's running on the emulator so it's notperfectly smooth it is jelly beans so should be runningthe sink the emulator nonetheless that sir that looks good might well so the sweepangle is being a incremental the year on every annaanimation step am yet my mom is going to loop over soit's actually a little bit more logic in that but this is a this is basically what itboils down to

this is a this is the entre and the extra awesome bonus and now using customcomponents over whatever happy solution you thoughtof is this i love this this is brilliant because um your component will just be invokedthrough att and the entire life cycle the nicelyfollowed and it'll draw inside your e editor if using eclipse am i don't know how ortonya from sorry can speak am and and and you get this great headsup in you know exactly what it looks

like so i i really i really love this partabout using custom components i was makes it all worth it it doesn't dollars i g and the otherthing is that it actually shows up under those under analyst othercomponents so you have a whole set of course if allthe different in three components and all your custom ones they disappearin a too so if you're into the graphical i'll editor and and you like draggingand dropping control i'm not really into that kinda thing baby like dragging anddropping it controls

then you can you can you can just dropthe drop that in there you can set of course all these attributes you defineyou can to set them at 280 sup what have we done well am for those youhaven't been paying attention we have actually really rene a customfinally wrote to actually am and add did these customcomponents i also i il's trade you why you should use them and we we actually wrote the layout to contain one like how do you put it inexisting layout

am how do you define your own attributesare you introduce new ones i lead a string you can do anything you can to do enumerated enumerations i'll unions you can also define those anna he does use as an ass attributes in yourown custom to find style sheets am and i show you how to do measuring in drawing other component whydidn't show you is how you peddling you should use the on layoutand ii didn't do that because it kinda getsinto some complications with the

it's a difficult thing to do is likewhen you want to have a view group like an extended linear layout or somethinglike that am how do you cope with showing views and then you basically instructyour children how to alley out considered howlinghadam how to measure and drive yourself am there are a few things that you shouldbe wary of i show you one earlier cell maybe you guys can tell mewhat's wrong with this code wanna buy mister year yeah i for that arecycle the type to rate yup

cell so each time i my my view will be inflated is going tocall this in its function which is going reading a tighter a in every single timeearly outs sold for each you know if i rotate my device its gonnakeep on keeping this thing in memory so we want to avoid them another thingto be a be wary of is this one so what's wronghere now yep allegation again you know i x have toallegations i have a and redirect them cream paint let's say let's avoid that even if it'sthe smallest thing and you want to avoid

the gc kicking in at all at is 0 cell avoid that not only is alsome out but in other words just listen the lintbecause lint will warn you about this and if not was inlinz then you're doing a lot of things from two's and the other thing is that ipersonally anna want you to am do this the sink so when every you wear post a a bocesrunnable for you animator preferably try to do that am under thesink

now they're the don't take my word fortheir airplane is there and nearby and otherresources there's actually a training i think i was in set two weeks ago where osama by a rich in minute there's atraining up on a on the developer site its undertrainings obviously user experience because that's what it'sall about and there's under creating custom views andnow you're going to get into and big ambiguity of what is is interview with acomponent is it a legit i don't think google knows because youlike a love you and a

here at the guide the actually call it aa custom components l i'm not sure and then then that thepackage name us as we did in it an hour and there's also a great resource fora.m. just browsing cool stuff am your day there's a android used on that there are acouple really nice ones in there am and there are also some ones that i really don't like am your friends yetthe staggered grid you that was good one there's also a couple alike calendarwidgets am is my square your actually rather timessquare

am that there's a nice things andthere's definitely was there with a look they also have other stuff am some some some animations inlibraries am so it's it's a good general resource and a a nice follow-up to this am is maybe anna am this and three parts in a tutorial layer and bythe guys at d way and they have made this nice anna chartcontrolling you can see it's its release military nice i say reallysmooth but not quite smooth enough

cuz i saw this chama okay well my code is also up on the leftsoap doing about it there's thanks does anybody have any questions going yup yes but that would take too much fromthem slide and that's totally right i yeah i meanam your what you're basically complaining about is that the amountsthat the arc sweeps is not time-based itsframe-based

rain yeah that that's right now okay cool mar take your word for it anduse it need is this but this code is actuallyjust just you know for i see ics enough now for any particular reason but iguess i just a lazy any other questions yes yes android entry labor's what to some problem your yeah that works um if it's from a jar that's not gonna workof course because jars can only contain

the source and not the resources so if you defined attributesand styles is something that's not gonna work i think if you're trying to do thatweighs you can rent houses where the problems but you do bring me to appoint actuallya different problem and i didn't bring this up because thenit wouldn't look all as perfect as i would like it to end like

and that is this yeah as you can see myphones are being loaded up here and the reason for that is actually ifyou look into the a.m. into eclipses log was happening is itdoesn't have a context to read the assets from a question ofcontext because in eighty you have contact some advice so noteverything works if you're not there's always solution and if you justfriends is going to your code i can generate you actually if you just going to your code and andfor this custom component and

as its right now giving heirs if i wannamove those areas are there friends is what i could do is i couldsee an and not at view dot sorry site my is is in edit mode and what this actuallydoes is an here this is and weather is in edit modeyet it's for exactly for the developer tool it will it will tell basically thecomponents that eclipse is trying to drive so you can

you can knock out some logic that sothat is still balance between att bites am it doesn't maybe do everythingthey want but that ci diseases cosmetics cosmetics anyway some the questions bit cool thanks so much for your time

No comments:

Post a Comment