c732d49e |
/*
* |
74ca6d11 |
* Copyright (C) 2020, University of the Basque Country (UPV/EHU) |
c732d49e |
*
* Contact for licensing options: <licensing-mcpttclient(at)mcopenplatform(dot)com>
*
* This file is part of MCOP MCPTT Client
*
* This is free software: you can redistribute it and/or modify it under the terms of
* the GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* This is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package org.doubango.ngn.services.impl.ms;
|
175b478c |
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;
import org.doubango.ngn.BuildConfig;
import org.doubango.ngn.NgnApplication;
import org.doubango.ngn.NgnEngine;
import org.doubango.ngn.datatype.ms.cms.mcpttUserProfile.McpttUserProfile;
import org.doubango.ngn.datatype.ms.gms.ns.GMSData;
import org.doubango.ngn.datatype.ms.gms.ns.list_service.Group;
import org.doubango.ngn.datatype.ms.gms.ns.resource_lists.EntryType;
import org.doubango.ngn.datatype.ms.gms.ns.resource_lists.ListType;
import org.doubango.ngn.datatype.ms.gms.ns.resource_lists.ResourceLists;
import org.doubango.ngn.datatype.ms.gms.ns.xcap_diff.DocumentType;
import org.doubango.ngn.datatype.ms.gms.ns.xcap_diff.XcapDiff;
import org.doubango.ngn.datatype.openId.CampsType;
import org.doubango.ngn.services.authentication.IMyAuthenticacionService;
import org.doubango.ngn.services.cms.IMyCMSService; |
c732d49e |
import org.doubango.ngn.services.gms.IMyGMSService; |
175b478c |
import org.doubango.ngn.sip.MySubscriptionGMSSession;
import org.doubango.ngn.sip.NgnSipPrefrences; |
c732d49e |
import org.doubango.utils.Utils;
|
175b478c |
import java.net.HttpURLConnection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; |
c732d49e |
|
175b478c |
public class MyGMSService implements IMyGMSService, RestService.OnRestServiceListener, IMyCMSService.OnGetMcpttUserProfile2Listener { |
c732d49e |
|
175b478c |
private final static String TAG = Utils.getTAG(MyGMSService.class.getCanonicalName());
private boolean isSubscribed=false;
private boolean reSubscribed=false; |
c732d49e |
private static boolean isStart; |
175b478c |
private static Map<String,GMSData> currentGroups;
private final IMyAuthenticacionService mAuthenticationService;
private final BroadcastReceiver broadcastReceiverGMSMessage;
private static OnGMSListener onGMSListener;
private MySubscriptionGMSSession mGMSService;
private RestService restService;
private XcapDiff currentXcapDiff; |
c732d49e |
public MyGMSService() { |
175b478c |
restService=RestService.getInstance();
broadcastReceiverGMSMessage=new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(GMS_ACTION_NOTIFY)) {
Log.d(TAG,"New notify received.");
boolean sendAccound=false;
byte[] messageGMS=intent.getByteArrayExtra(GMS_NEWGMS_NOTIFY);
Log.d(TAG,"New notify GMS received.");
//try {
XcapDiff xcapDiff=null;
if(messageGMS==null || messageGMS.length==0){
Log.w(TAG,"GMS notify not valid or empty.");
xcapDiff=new XcapDiff();
}else{
Log.d(TAG,"Valid GMS notify.");
try {
if(BuildConfig.DEBUG)Log.d(TAG,"new notify: "+new String(messageGMS));
xcapDiff=MSUtils.getXcapDiff(messageGMS);
} catch (Exception e) {
Log.e(TAG,"Error proccess new GMS:"+e.getMessage());
}
}
requestGroups(xcapDiff,context);
}else if (intent.getAction().equals(GMS_ACTION_SUBSCRIBE)) {
Log.d(TAG,"Receive response subscribe");
String error=intent.getStringExtra(GMS_RESPONSE_SUBSCRIBE_ERROR);
String responseOk=intent.getStringExtra(GMS_RESPONSE_SUBSCRIBE_OK);
if(error!=null){
//Error
if(BuildConfig.DEBUG)Log.e(TAG,"Error in subscribe for GMS "+error);
isSubscribed=false;
}else if(responseOk!=null){
//Ok
Log.d(TAG,"Correct subscribe for GMS");
isSubscribed=true;
/*
if(GMSGroupDelay!=null){
Log.d(TAG,"GMS now to groups");
GMSGroups(context,GMSGroupDelay);
GMSGroupDelay=null;
}*/
}else
Log.w(TAG,"This situation isnĀ“t logic");
}else if (intent.getAction().equals(GMS_ACTION_UNSUBSCRIBE)) {
Log.d(TAG,"UnSubscribe");
isSubscribed=false;
}
}
};
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(GMS_ACTION_NOTIFY);
intentFilter.addAction(GMS_ACTION_SUBSCRIBE);
intentFilter.addAction(GMS_ACTION_UNSUBSCRIBE);
NgnApplication.getContext().registerReceiver(broadcastReceiverGMSMessage,intentFilter);
|
c732d49e |
currentGroups=null;
isStart=false; |
175b478c |
mAuthenticationService=NgnEngine.getInstance().getAuthenticationService();
NgnEngine.getInstance().getCMSService().setOnGetMcpttUserProfile2Listener(this);
|
c732d49e |
}
|
175b478c |
private boolean requestGroups(XcapDiff xcapDiff,Context context){
if(xcapDiff==null){
Log.e(TAG,"Error in xcapdiff");
return false;
}
this.currentXcapDiff=xcapDiff;
String gmsUri=getGMSUri(context);
restService.setOnRestServiceListener(this);
if(currentXcapDiff!=null && currentXcapDiff.getDocument()!=null)
for(DocumentType documentType:currentXcapDiff.getDocument()){
if(gmsUri!=null && !gmsUri.isEmpty()){
restService.DownloaderMCPTTGmsGroups(gmsUri,documentType.getSel(),null,getAccessToken(context));
}
}
return true;
}
private String getGMSUri(Context context){
NgnSipPrefrences ngnSipPrefrences=NgnEngine.getInstance().getProfilesService().getProfileNow(context);
String gmsUri=null;
if(ngnSipPrefrences!=null)
gmsUri=NgnEngine.getInstance().getProfilesService().getProfileNow(context).getGMSXCAPRootURI();
return gmsUri;
}
|
c732d49e |
@Override
public boolean start() {
currentGroups=null;
isStart=true; |
175b478c |
isSubscribed=false; |
c732d49e |
return true;
}
@Override
public boolean stop() {
isStart=false;
currentGroups=null; |
175b478c |
isSubscribed=false; |
c732d49e |
return true;
}
@Override
public boolean clearService() { |
175b478c |
pauseServiceGMS(); |
c732d49e |
return false;
}
@Override
public void setOnGMSListener(OnGMSListener onGMSListener) {
this.onGMSListener=onGMSListener;
}
@Override |
175b478c |
public org.doubango.ngn.datatype.ms.gms.ns.list_service.Group getGroupInfo(String group) {
if(currentGroups!=null){
GMSData gmsData=currentGroups.get(group.trim());
if(gmsData.getGroup()!=null){
return gmsData.getGroup();
}
}
return null;
}
@Override
public void startServiceGMS(Context context) {
//Init Subscribe GMS
if(BuildConfig.DEBUG)Log.d(TAG,"start service GMS");
gmsChange(true,context);
}
private void pauseServiceGMS() {
//Pause Subscribe GMS
if(BuildConfig.DEBUG)Log.d(TAG,"pause service GMS");
gmsChange(false,null);
}
private void gmsChange(boolean isRegister,Context context){
NgnSipPrefrences currentProfile;
if((currentProfile=NgnEngine.getInstance().getProfilesService().getProfileNow(context))!=null &&
currentProfile.isMcpttEnableSubcriptionGMS()!=null &&
currentProfile.isMcpttEnableSubcriptionGMS()){
if(!isRegister){
if(mGMSService!=null){
Log.d(TAG,"Unsubscribe GMS");
mGMSService.unSubscribeGMS();
mGMSService=null;
}
}else{
if(!isSubscribed){
mGMSService= MySubscriptionGMSSession.createOutgoingSession(NgnEngine.getInstance().getSipService().getSipStack());
if(mGMSService.subscribeGMS(getResoultList(context),getMCPTTInfoAccessToken(context))){
Log.d(TAG,"Subscribe sent GMS.");
}
}else{
if(mGMSService!=null){
if(mGMSService.unSubscribeGMS()){
Log.d(TAG,"Unsubscribe sent GMS");
}
mGMSService=null;
}
}
|
c732d49e |
} |
175b478c |
}
}
private String getResoultList(Context context){
ResourceLists resourceLists=new ResourceLists();
List<ListType> list=new ArrayList<>();
ListType listType=new ListType();
List<org.doubango.ngn.datatype.ms.gms.ns.resource_lists.EntryType> listEntryTypes=new ArrayList<>();
NgnSipPrefrences currentProfiles;
Map<String,NgnSipPrefrences.EntryType> groups=null;
if((currentProfiles=NgnEngine.getInstance().getProfilesService().getProfileNow(context))!=null &&
(groups=currentProfiles.getMCPTTGroupInfo())!=null && currentProfiles.getGMSXCAPRootURI()!=null){
for(String displayNameGroup:groups.keySet()){
NgnSipPrefrences.EntryType entryType=groups.get(displayNameGroup);
if(entryType.getUriEntry()!=null){
org.doubango.ngn.datatype.ms.gms.ns.resource_lists.EntryType entryType1=new EntryType();
entryType1.setUri("org.openmobilealliance.groups/global/byGroup/"+entryType.getUriEntry());
listEntryTypes.add(entryType1);
}
}
}
listType.setEntry(listEntryTypes);
list.add(listType);
resourceLists.setList(list);
try {
return GMSUtils.getStringOfResourceLists(context,resourceLists); |
c732d49e |
} catch (Exception e) { |
175b478c |
Log.e(TAG,"GMS processing error: "+e.getMessage()); |
c732d49e |
} |
175b478c |
return null;
} |
c732d49e |
|
175b478c |
private String getMCPTTInfoAccessToken(Context context){
CampsType campsType=mAuthenticationService.getCampsTypeCurrent(context);
NgnSipPrefrences ngnSipPrefrences=NgnEngine.getInstance().getProfilesService().getProfileNow(context);
if(campsType!=null && ngnSipPrefrences!=null && ngnSipPrefrences.getMcpttClientId()!=null)
return AuthenticacionUtils.generateMcpttinfoType(
context,
campsType,
ngnSipPrefrences.getMcpttId(),
ngnSipPrefrences.getMcpttClientId(),
ngnSipPrefrences.isMcpttSelfAuthenticationSendTokenFail()!=null?ngnSipPrefrences.isMcpttSelfAuthenticationSendTokenFail():false);
return null;
} |
c732d49e |
|
175b478c |
private String getAccessToken(Context context){
CampsType campsType=null;
if(mAuthenticationService==null ||
(campsType=mAuthenticationService.getCampsTypeCurrent(context))==null ||
campsType.getAccessToken()==null)return null;
return campsType.getAccessToken();
} |
c732d49e |
|
175b478c |
@Override
public void onDownloaderXML(String results, String etag,String path, int codeRespone, RestService.ContentTypeData contentTypeData) {
Log.d(TAG,"XML GMS downloaded.");
Group gmsData=null;
switch (codeRespone){
case HttpURLConnection.HTTP_OK:
try {
gmsData=GMSUtils.getGroupConfiguration(results.trim());
if(gmsData!=null){
if(BuildConfig.DEBUG) Log.d(TAG,"Downloaded GMS data with eTAG:"+etag+" and path:"+path);
}else{
Log.d(TAG,"Error processing downloaded GMS data.");
}
} catch (Exception e) {
Log.e(TAG,"Translation error:"+e.getMessage());
}
break;
case HttpURLConnection.HTTP_NOT_MODIFIED:
Log.d(TAG,"Data not modified.");
break;
default:
Log.e(TAG,"Error in code response:"+codeRespone);
break;
}
switch (contentTypeData){
case CONTENT_TYPE_MCPTT_GROUPS:
if(gmsData==null || gmsData.getListService()==null || gmsData.getListService().get(0)==null || gmsData.getListService().get(0).getUri()==null){
Log.e(TAG,"Error in GMS proccess.");
}else {
if(currentGroups==null)currentGroups=new HashMap<>();
currentGroups.put(gmsData.getListService().get(0).getUri(),new GMSData(gmsData,etag));
if(onGMSListener!=null)onGMSListener.onGMSGroup(gmsData);
}
break;
case CONTENT_TYPE_NONE:
default:
Log.e(TAG,"Invalid content-type. in GMS");
break;
}
return; |
c732d49e |
} |
175b478c |
|
c732d49e |
@Override |
175b478c |
public void errorOnDownloaderXML(String error, RestService.ContentTypeData contentTypeData) {
if(BuildConfig.DEBUG)Log.d(TAG,"Result GMS"+ error+" "+contentTypeData.getText()); |
c732d49e |
}
|
175b478c |
@Override
public void onGetMcpttUserProfile(McpttUserProfile mcpttUserProfile) {
if(BuildConfig.DEBUG)Log.d(TAG,"onGetMcpttUserProfile");
startServiceGMS(NgnApplication.getContext());
}
@Override
public void onGetMcpttUserProfileError(String error) {
if(BuildConfig.DEBUG)Log.e(TAG,"onGetMcpttUserProfileError: "+error);
} |
c732d49e |
} |