diff --git a/jni/pjproject-android/.svn/pristine/ae/aee81c0ce6758368272c822c50c68740be2f1e2a.svn-base b/jni/pjproject-android/.svn/pristine/ae/aee81c0ce6758368272c822c50c68740be2f1e2a.svn-base
new file mode 100644
index 0000000..5dec51f
--- /dev/null
+++ b/jni/pjproject-android/.svn/pristine/ae/aee81c0ce6758368272c822c50c68740be2f1e2a.svn-base
@@ -0,0 +1,312 @@
+/*
+========================================================================
+ Name        : pjsuaContainer.cpp
+ Author      : nanang
+ Copyright   : Copyright (C) 2013 Teluu Inc. (http://www.teluu.com)
+ Description : 
+========================================================================
+*/
+// [[[ begin generated region: do not modify [Generated System Includes]
+#include <barsread.h>
+#include <eikimage.h>
+#include <eikenv.h>
+#include <stringloader.h>
+#include <eiklabel.h>
+#include <aknviewappui.h>
+#include <eikappui.h>
+#include <akniconutils.h>
+#include <pjsua.mbg>
+#include <pjsua.rsg>
+// ]]] end generated region [Generated System Includes]
+
+// [[[ begin generated region: do not modify [Generated User Includes]
+#include "pjsuaContainer.h"
+#include "pjsuaContainerView.h"
+#include "pjsua.hrh"
+// ]]] end generated region [Generated User Includes]
+
+#include <eikmenub.h>
+
+// [[[ begin generated region: do not modify [Generated Constants]
+_LIT( KpjsuaFile, "\\resource\\apps\\pjsua.mbm" );
+// ]]] end generated region [Generated Constants]
+
+/**
+ * First phase of Symbian two-phase construction. Should not 
+ * contain any code that could leave.
+ */
+CPjsuaContainer::CPjsuaContainer()
+	{
+	// [[[ begin generated region: do not modify [Generated Contents]
+	iImage1 = NULL;
+	iLabel1 = NULL;
+	// ]]] end generated region [Generated Contents]
+	
+	}
+/** 
+ * Destroy child controls.
+ */
+CPjsuaContainer::~CPjsuaContainer()
+	{
+	// [[[ begin generated region: do not modify [Generated Contents]
+	delete iImage1;
+	iImage1 = NULL;
+	delete iLabel1;
+	iLabel1 = NULL;
+	// ]]] end generated region [Generated Contents]
+	
+	}
+				
+/**
+ * Construct the control (first phase).
+ *  Creates an instance and initializes it.
+ *  Instance is not left on cleanup stack.
+ * @param aRect bounding rectangle
+ * @param aParent owning parent, or NULL
+ * @param aCommandObserver command observer
+ * @return initialized instance of CPjsuaContainer
+ */
+CPjsuaContainer* CPjsuaContainer::NewL( 
+		const TRect& aRect, 
+		const CCoeControl* aParent, 
+		MEikCommandObserver* aCommandObserver )
+	{
+	CPjsuaContainer* self = CPjsuaContainer::NewLC( 
+			aRect, 
+			aParent, 
+			aCommandObserver );
+	CleanupStack::Pop( self );
+	return self;
+	}
+
+/**
+ * Construct the control (first phase).
+ *  Creates an instance and initializes it.
+ *  Instance is left on cleanup stack.
+ * @param aRect The rectangle for this window
+ * @param aParent owning parent, or NULL
+ * @param aCommandObserver command observer
+ * @return new instance of CPjsuaContainer
+ */
+CPjsuaContainer* CPjsuaContainer::NewLC( 
+		const TRect& aRect, 
+		const CCoeControl* aParent, 
+		MEikCommandObserver* aCommandObserver )
+	{
+	CPjsuaContainer* self = new ( ELeave ) CPjsuaContainer();
+	CleanupStack::PushL( self );
+	self->ConstructL( aRect, aParent, aCommandObserver );
+	return self;
+	}
+			
+/**
+ * Construct the control (second phase).
+ *  Creates a window to contain the controls and activates it.
+ * @param aRect bounding rectangle
+ * @param aCommandObserver command observer
+ * @param aParent owning parent, or NULL
+ */ 
+void CPjsuaContainer::ConstructL( 
+		const TRect& aRect, 
+		const CCoeControl* aParent, 
+		MEikCommandObserver* aCommandObserver )
+	{
+	if ( aParent == NULL )
+	    {
+		CreateWindowL();
+	    }
+	else
+	    {
+	    SetContainerWindowL( *aParent );
+	    }
+	iFocusControl = NULL;
+	iCommandObserver = aCommandObserver;
+	InitializeControlsL();
+	SetRect( aRect );
+
+	// Full screen
+	SetExtentToWholeScreen();
+	
+	// Set label color
+	//iLabel1->OverrideColorL( EColorLabelText, KRgbWhite );
+	//iLabel1->OverrideColorL(EColorControlBackground, KRgbBlack )
+	iLabel1->SetEmphasis( CEikLabel::EFullEmphasis);
+	iLabel1->OverrideColorL( EColorLabelHighlightFullEmphasis, KRgbBlack );
+	iLabel1->OverrideColorL( EColorLabelTextEmphasis, KRgbWhite );
+
+	// Set label font
+	 CFont* fontUsed;
+	_LIT(f,"Arial");
+	TFontSpec* fontSpec = new TFontSpec(f, 105);
+	TFontStyle* fontStyle = new TFontStyle();
+	fontStyle->SetPosture(EPostureUpright);
+	fontStyle->SetStrokeWeight(EStrokeWeightNormal);
+	fontSpec->iFontStyle = *fontStyle;
+	fontUsed = iCoeEnv->CreateScreenFontL(*fontSpec);
+	iLabel1->SetFont(fontUsed);
+	iLabel1->SetAlignment( EHCenterVCenter );
+	
+	ActivateL();
+	// [[[ begin generated region: do not modify [Post-ActivateL initializations]
+	// ]]] end generated region [Post-ActivateL initializations]
+	
+	}
+			
+/**
+* Return the number of controls in the container (override)
+* @return count
+*/
+TInt CPjsuaContainer::CountComponentControls() const
+	{
+	return ( int ) ELastControl;
+	}
+				
+/**
+* Get the control with the given index (override)
+* @param aIndex Control index [0...n) (limited by #CountComponentControls)
+* @return Pointer to control
+*/
+CCoeControl* CPjsuaContainer::ComponentControl( TInt aIndex ) const
+	{
+	// [[[ begin generated region: do not modify [Generated Contents]
+	switch ( aIndex )
+		{
+		case EImage1:
+			return iImage1;
+		case ELabel1:
+			return iLabel1;
+		}
+	// ]]] end generated region [Generated Contents]
+	
+	// handle any user controls here...
+	
+	return NULL;
+	}
+				
+/**
+ *	Handle resizing of the container. This implementation will lay out
+ *  full-sized controls like list boxes for any screen size, and will layout
+ *  labels, editors, etc. to the size they were given in the UI designer.
+ *  This code will need to be modified to adjust arbitrary controls to
+ *  any screen size.
+ */				
+void CPjsuaContainer::SizeChanged()
+	{
+	CCoeControl::SizeChanged();
+	LayoutControls();
+
+	// Align the image
+	int x = (Size().iWidth - iImage1->Size().iWidth) / 2;
+	int y = (Size().iHeight - iImage1->Size().iHeight) / 2;
+	iImage1->SetPosition(TPoint(x, y));
+	
+	// Align the label
+	iLabel1->SetExtent(TPoint(0, Size().iHeight - iLabel1->Size().iHeight),
+			   TSize(Size().iWidth, iLabel1->Size().iHeight));
+	
+	// [[[ begin generated region: do not modify [Generated Contents]
+			
+	// ]]] end generated region [Generated Contents]
+	
+	}
+				
+// [[[ begin generated function: do not modify
+/**
+ * Layout components as specified in the UI Designer
+ */
+void CPjsuaContainer::LayoutControls()
+	{
+	iImage1->SetExtent( TPoint( 0, 0 ), TSize( 99, 111 ) );
+	iLabel1->SetExtent( TPoint( 0, 196 ), TSize( 241, 27 ) );
+	}
+// ]]] end generated function
+
+/**
+ *	Handle key events.
+ */				
+TKeyResponse CPjsuaContainer::OfferKeyEventL( 
+		const TKeyEvent& aKeyEvent, 
+		TEventCode aType )
+	{
+	// [[[ begin generated region: do not modify [Generated Contents]
+	
+	// ]]] end generated region [Generated Contents]
+	
+	if ( iFocusControl != NULL
+		&& iFocusControl->OfferKeyEventL( aKeyEvent, aType ) == EKeyWasConsumed )
+		{
+		return EKeyWasConsumed;
+		}
+	return CCoeControl::OfferKeyEventL( aKeyEvent, aType );
+	}
+				
+// [[[ begin generated function: do not modify
+/**
+ *	Initialize each control upon creation.
+ */				
+void CPjsuaContainer::InitializeControlsL()
+	{
+	iImage1 = new ( ELeave ) CEikImage;
+		{
+		CFbsBitmap *bitmap, *mask;
+		AknIconUtils::CreateIconL( bitmap, mask,
+				KpjsuaFile, EMbmPjsuaPjsua, -1 );
+		AknIconUtils::SetSize( bitmap, TSize( 99, 111 ), EAspectRatioPreserved );
+		iImage1->SetPicture( bitmap );
+		}
+	iImage1->SetAlignment( EHCenterVTop );
+	iLabel1 = new ( ELeave ) CEikLabel;
+	iLabel1->SetContainerWindowL( *this );
+		{
+		TResourceReader reader;
+		iEikonEnv->CreateResourceReaderLC( reader, R_PJSUA_CONTAINER_LABEL1 );
+		iLabel1->ConstructFromResourceL( reader );
+		CleanupStack::PopAndDestroy(); // reader internal state
+		}
+	
+	}
+// ]]] end generated function
+
+/** 
+ * Handle global resource changes, such as scalable UI or skin events (override)
+ */
+void CPjsuaContainer::HandleResourceChange( TInt aType )
+	{
+	CCoeControl::HandleResourceChange( aType );
+	SetRect( iAvkonViewAppUi->View( TUid::Uid( EPjsuaContainerViewId ) )->ClientRect() );
+	// [[[ begin generated region: do not modify [Generated Contents]
+	// ]]] end generated region [Generated Contents]
+	
+	}
+				
+/**
+ *	Draw container contents.
+ */				
+void CPjsuaContainer::Draw( const TRect& aRect ) const
+	{
+	// [[[ begin generated region: do not modify [Generated Contents]
+	CWindowGc& gc = SystemGc();
+	gc.SetPenStyle( CGraphicsContext::ENullPen );
+	TRgb backColor( 0,0,0 );
+	gc.SetBrushColor( backColor );
+	gc.SetBrushStyle( CGraphicsContext::ESolidBrush );
+	gc.DrawRect( aRect );
+	
+	// ]]] end generated region [Generated Contents]
+	
+	}
+
+void CPjsuaContainer::PutMessageL( const char * msg )
+{
+    if (!iLabel1)
+	return;
+    
+    TPtrC8 ptr(reinterpret_cast<const TUint8*>(msg));
+    HBufC* buffer = HBufC::NewLC(ptr.Length());
+    buffer->Des().Copy(ptr);
+
+    iLabel1->SetTextL(*buffer);
+    iLabel1->DrawNow();
+
+    CleanupStack::PopAndDestroy(buffer);
+}
