yavsc/BookAStar/BookAStar.Droid/MainActivity.cs
Paul Schneider e3a73e8146 Merge branch 'vnext' of https://github.com/pazof/yavsc into vnext
* 'vnext' of https://github.com/pazof/yavsc: (38 commits)
fixe le premier démarrage
Corrige le mot de passe perdu d'un utilisateur au nom contenant des
espaces
traductions
fixe la reccupération du mot de passe
refabrique:
MEP index blogs
Specialized the book query notification
Updated the Licence validity
cleaned up log warnings
label event date
cleans the code
Adds support for SIREN exceptions to validation from the external
provider
layout
trads
refactoring
refactoring
Google maps: a map
image
implements an AccessDenied page
A better layout
...

# Conflicts:
#	Yavsc.Api/project.lock.json
#	Yavsc.Client/Yavsc.Client.csproj
#	Yavsc.Client/packages.config
#	sendmsg/Program.cs
2016-07-30 22:51:19 +02:00

323 lines
11 KiB
C#

using System;
using Android.App;
using Android.Content.PM;
using Android.Widget;
using Android.OS;
using Android.Content;
using Android.Gms.Common;
using Android.Util;
using Xamarin.Auth;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Net;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Net.Http;
using System.Text;
using BookAStar.Model.Auth.Account;
using BookAStar.Droid.OAuth;
using Yavsc.Helpers;
using Yavsc.Models.Identity;
using static Android.Content.Res.Resources;
namespace BookAStar.Droid
{
[Activity(Name="fr.pschneider.bas.MainActivity", Label = "BookAStar", Icon = "@drawable/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity,
IPlatform
{
protected override void OnCreate(Bundle bundle)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(bundle);
global::Xamarin.Forms.Forms.Init(this, bundle);
global::Xamarin.FormsMaps.Init(this, bundle);
LoadApplication(new App(this));
/* var x = typeof(Themes.DarkThemeResources);
x = typeof(Themes.LightThemeResources);
x = typeof(Themes.Android.UnderlineEffect); */
}
public bool EnablePushNotifications(bool enable)
{
if (enable)
return StartNotifications();
else
return StopNotifications();
}
private string gCMStatusMessage = null;
public string GCMStatusMessage
{
get
{
return gCMStatusMessage;
}
}
bool StartNotifications()
{
if (IsPlayServicesAvailable(out gCMStatusMessage))
{
var intent = new Intent(this, typeof(GcmRegistrationIntentService));
StartService(intent);
return true;
}
return false;
}
bool StopNotifications()
{
return StopService(new Intent(this, typeof(GcmRegistrationIntentService)));
}
public void RevokeAccount(string userName)
{
var accStore = AccountStore.Create(this);
var accounts = accStore.FindAccountsForService(MainSettings.ApplicationName);
accStore.Delete(
accounts.Where(a => a.Username == userName).FirstOrDefault()
, MainSettings.ApplicationName);
Toast.MakeText(this,
Resource.String.yavscIdentRemoved
, ToastLength.Short);
}
public void OpenWeb(string Uri)
{
var u = global::Android.Net.Uri.Parse(Uri);
Intent i = new Intent(Intent.ActionView, u);
StartActivity(i);
}
protected override void OnStart()
{
base.OnStart();
if (MainSettings.PushNotifications)
StartNotifications();
}
public bool IsPlayServicesAvailable(out string msgText)
{
int resultCode = GoogleApiAvailability.Instance.IsGooglePlayServicesAvailable(this);
if (resultCode != ConnectionResult.Success)
{
if (GoogleApiAvailability.Instance.IsUserResolvableError(resultCode))
msgText = GoogleApiAvailability.Instance.GetErrorString(resultCode);
else
{
msgText = "Sorry, this device is not supported";
Finish();
}
return false;
}
else
{
msgText = "Google Play Services is available.";
return true;
}
}
public void UploadJson(string data)
{
try
{
string url = "http://lua.pschneider.fr/api/BackOffice/SetRegistrationId";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
//using GET - request.Headers.Add ("Authorization","Authorizaation value");
request.ContentType = "application/json";
HttpWebResponse myResp = (HttpWebResponse)request.GetResponse();
string responseText;
using (var response = request.GetResponse())
{
using (var reader = new StreamReader(response.GetResponseStream()))
{
responseText = reader.ReadToEnd();
Log.Debug(MainSettings.ApplicationName, responseText);
}
}
}
catch (WebException exception)
{
string responseText;
using (var reader = new StreamReader(exception.Response.GetResponseStream()))
{
responseText = reader.ReadToEnd();
Log.Debug("BookAStar", responseText);
}
}
}
public async Task<IEnumerable<Account>> GetAndroidAccounts()
{
return await Task.Run(() => {
var manager = AccountStore.Create(this);
return manager.FindAccountsForService(MainSettings.ApplicationName);
});
}
public void AddAccount()
{
var auth = new YaOAuth2Authenticator(
clientId: "d9be5e97-c19d-42e4-b444-0e65863b19e1",
clientSecret: "blouh",
scope: "profile",
authorizeUrl: new Uri("http://dev.pschneider.fr/authorize"),
redirectUrl: new Uri("http://dev.pschneider.fr/oauth/success"),
accessTokenUrl: new Uri("http://dev.pschneider.fr/token"));
auth.AllowCancel = false;
Intent loginIntent = auth.GetUI(this);
var accStore = AccountStore.Create(this);
auth.Completed += (sender, eventArgs) =>
{
if (eventArgs.IsAuthenticated)
{
int expires_in = int.Parse(eventArgs.Account.Properties["expires_in"]);
var tokens = new Tokens
{
AccessToken = eventArgs.Account.Properties["access_token"],
RefreshToken = eventArgs.Account.Properties["refresh_token"],
ExpiresIn = expires_in,
TokenType = eventArgs.Account.Properties["token_type"]
};
RunOnUiThread(
async () =>
{
using (var client = new HttpClient())
{
// get me
// var request = new OAuth2Request("GET", new Uri(Constants.UserInfoUrl), null, eventArgs.Account);
var request = new HttpRequestMessage(HttpMethod.Get, MainSettings.UserInfoUrl);
request.Headers.Authorization =
new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", tokens.AccessToken);
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
string userJson = await response.Content.ReadAsStringAsync();
JObject jactiveUser = JObject.Parse(userJson);
Account acc = eventArgs.Account;
var uid = jactiveUser["Id"].Value<string>();
var username = jactiveUser["UserName"].Value<string>();
var roles = jactiveUser["Roles"].Values<string>().ToList();
var emails = jactiveUser["EMails"].Values<string>().ToList();
var newuser = new User
{
UserName = username,
EMails = emails,
Roles = roles,
Id = uid,
YavscTokens = tokens
};
MainSettings.SaveUser(newuser);
accStore.Save(acc, MainSettings.ApplicationName);
}
}
);
}
};
auth.Error += Auth_Error;
StartActivity(loginIntent);
}
public static void PopulateUserWithAccount(User u, Account a)
{
u.YavscTokens = new Model.Auth.Account.Tokens
{
AccessToken =
a.Properties["access_token"],
RefreshToken =
a.Properties["refresh_token"],
ExpiresIn =
int.Parse(a.Properties["expires_in"]),
TokenType = a.Properties["token_type"]
};
u.UserName = a.Username;
}
private void Auth_Error(object sender, AuthenticatorErrorEventArgs e)
{
throw new NotImplementedException("Auth_Error");
}
public class GCMDeclaration : IGCMDeclaration
{
public string DeviceId
{ get; set; }
public string GCMRegistrationId
{ get; set; }
public string Model
{ get; set; }
public string Platform
{ get; set; }
public string Version
{ get; set; }
}
public IGCMDeclaration GetDeviceInfo()
{
var devinfo = DeviceInfo.Plugin.CrossDeviceInfo.Current;
return new GCMDeclaration
{
DeviceId = devinfo.Id,
GCMRegistrationId = MainSettings.GoogleRegId,
Model = devinfo.Model,
Platform = devinfo.Platform.ToString(),
Version = devinfo.Version
};
}
public TAnswer InvokeApi<TAnswer>(string method, object arg)
{
using (var m =
new SimpleJsonPostMethod(
method, "Bearer "+
MainSettings.CurrentUser.YavscTokens.AccessToken
))
{
return m.Invoke<TAnswer>(arg);
}
}
public object InvokeApi(string method, object arg)
{
using (var m =
new SimpleJsonPostMethod(
method, "Bearer " +
MainSettings.CurrentUser.YavscTokens.AccessToken
))
{
return m.InvokeJson(arg);
}
}
}
}