@ -1,16 +1,18 @@
using ZicMoove.ViewModels.UserProfile ;
using Plugin.Media ;
using Plugin.Media ;
using Plugin.Media.Abstractions ;
using System ;
using Xamarin.Forms ;
using ZicMoove.Settings ;
using ZicMoove.Helpers ;
using System.Net.Http ;
using Android.Graphics ;
namespace ZicMoove.Pages.UserProfile
{
using ViewModels.UserProfile ;
using Helpers ;
using System.IO ;
using System.Threading.Tasks ;
using Android.Content.Res ;
public partial class UserProfilePage
{
public UserProfilePage ( )
@ -32,58 +34,131 @@ namespace ZicMoove.Pages.UserProfile
private async void BtnPay_Clicked ( object sender , EventArgs e )
{
App . PlatformSpecificInstance . Pay ( 0.1 , Interfaces . PayMethod . Immediate , "test payment" ) ;
}
private async void AvatarButton_Clicked ( object sender , EventArgs e )
{
IsBusy = true ;
if ( ! CrossMedia . Current . IsCameraAvailable | | ! CrossMedia . Current . IsTakePhotoSupported )
{
await DisplayAlert ( "No Camera" , ":( No camera avaialble." , "OK" ) ;
IsBusy = false ;
return ;
}
IsBusy = true ;
var file = await CrossMedia . Current . TakePhotoAsync ( new StoreCameraMediaOptions
{
Directory = "Avatars" ,
Name = "me.jpg"
Name = "me.jpg" ,
DefaultCamera = CameraDevice . Front
} ) ;
if ( file = = null )
{
IsBusy = false ;
return ;
using ( var client = UserHelpers . CreateJsonClient ( ) )
}
if ( TargetPlatform . Android = = Device . OS )
{
// Get the whole data
try
// Rotate if needed
BitmapFactory . Options options = new BitmapFactory . Options { } ;
Android . Media . ExifInterface exif = new Android . Media . ExifInterface ( file . Path ) ;
var orientation = exif . GetAttributeInt (
Android . Media . ExifInterface . TagOrientation , 0 ) ;
using ( var stream = file . GetStream ( ) )
{
using ( var stream = file . GetStream ( ) )
var bmp = await BitmapFactory . DecodeStreamAsync ( stream ) ;
// Next we calculate the ratio that we need to resize the image by
// in order to fit the requested dimensions.
int outHeight = options . OutHeight ;
int outWidth = options . OutWidth ;
Matrix mtx = new Matrix ( ) ;
Bitmap nbmp = null ;
switch ( orientation )
{
case ( int ) Orientation . Undefined : // Nexus 7 landscape...
mtx . PreRotate ( 180 ) ;
nbmp = Bitmap . CreateBitmap ( bmp , 0 , 0 , bmp . Width , bmp . Height , mtx , false ) ;
mtx . Dispose ( ) ;
mtx = null ;
break ;
case ( int ) Orientation . Landscape :
break ;
case 1 : // landscape left
case 3 : // Landskape right
mtx . PreRotate ( 180 ) ;
nbmp = Bitmap . CreateBitmap ( bmp , 0 , 0 , bmp . Width , bmp . Height , mtx , false ) ;
break ;
case 6 : // portrait
mtx . PreRotate ( 90 ) ;
nbmp = Bitmap . CreateBitmap ( bmp , 0 , 0 , bmp . Width , bmp . Height , mtx , false ) ;
break ;
case 8 : // my portrait
mtx . PreRotate ( - 90 ) ;
nbmp = Bitmap . CreateBitmap ( bmp , 0 , 0 , bmp . Width , bmp . Height , mtx , false ) ;
break ;
}
if ( nbmp ! = null )
{
using ( var ostream = new MemoryStream ( ) )
{
nbmp . Compress ( Bitmap . CompressFormat . Png , 10 , ostream ) ;
ostream . Seek ( 0 , SeekOrigin . Begin ) ;
var ok = await SendAvatarStreamAsync ( ostream ) ;
}
nbmp . Dispose ( ) ;
}
else
{
var requestContent = new MultipartFormDataContent ( ) ;
var content = new StreamContent ( stream ) ;
var filename = "me.jpg" ;
content . Headers . ContentType = new System . Net . Http . Headers . MediaTypeHeaderValue ( "application/octet-stream" ) ;
content . Headers . Add ( "Content-Disposition" , $"form-data; name=\" file \ "; filename=\"{filename}\"" ) ;
requestContent . Add ( content , "file" , filename ) ;
using ( var response = await client . PostAsync ( Constants . YavscApiUrl + "/setavatar" , requestContent ) )
using ( var ostream = new MemoryStream ( ) )
{
if ( response . IsSuccessStatusCode )
{
// TODO image update
var recnt = await response . Content . ReadAsStringAsync ( ) ;
}
bmp . Compress ( Bitmap . CompressFormat . Png , 10 , ostream ) ;
ostream . Seek ( 0 , SeekOrigin . Begin ) ;
var ok = await SendAvatarStreamAsync ( ostream ) ;
}
}
mtx . Dispose ( ) ;
bmp . Dispose ( ) ;
}
catch ( Exception ex )
exif . Dispose ( ) ;
options . Dispose ( ) ;
}
else
{
using ( var stream = file . GetStream ( ) )
{
// TODO error report
var ok = await SendAvatarStreamAsync ( stream ) ;
}
}
}
IsBusy = false ;
}
private async Task < bool > SendAvatarStreamAsync ( Stream stream )
{
using ( var client = UserHelpers . CreateJsonClient ( ) )
{
var requestContent = new MultipartFormDataContent ( ) ;
var content = new StreamContent ( stream ) ;
var filename = "me.jpg" ;
content . Headers . ContentType = new System . Net . Http . Headers . MediaTypeHeaderValue ( "application/octet-stream" ) ;
content . Headers . Add ( "Content-Disposition" , $"form-data; name=\" file \ "; filename=\"{filename}\"" ) ;
requestContent . Add ( content , "file" , filename ) ;
using ( var response = await client . PostAsync ( Constants . YavscApiUrl + "/setavatar" , requestContent ) )
{
if ( response . IsSuccessStatusCode )
{
// TODO image update
var recnt = await response . Content . ReadAsStringAsync ( ) ;
return true ;
}
}
}
return false ;
}
public void OnManageFiles ( object sender , EventArgs e )
{
ShowPage < UserFiles > ( null , true ) ;