org.wso2.app.catalog.utils.CommonUtils.java Source code

Java tutorial

Introduction

Here is the source code for org.wso2.app.catalog.utils.CommonUtils.java

Source

/*
 * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
 *
 * WSO2 Inc. licenses this file to you under the Apache License,
 * Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.wso2.app.catalog.utils;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.provider.Settings;
import android.telephony.TelephonyManager;
import android.util.Log;
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.wso2.app.catalog.AppCatalogException;
import org.wso2.app.catalog.api.ApplicationManager;
import org.wso2.app.catalog.beans.ServerConfig;
import org.wso2.app.catalog.beans.UnregisterProfile;
import org.wso2.app.catalog.services.DynamicClientManager;
import org.wso2.emm.agent.proxy.APIController;
import org.wso2.emm.agent.proxy.beans.EndPointInfo;
import org.wso2.emm.agent.proxy.interfaces.APIResultCallBack;
import org.wso2.emm.agent.proxy.utils.Constants.HTTP_METHODS;
import java.io.IOException;
import java.util.List;

/**
 * This class represents all the common functions used throughout the application.
 */
public class CommonUtils {

    public static String TAG = CommonUtils.class.getSimpleName();

    /**
     * Calls the secured API.
     * @param context           -The Activity which calls an API..
     * @param endpoint          -The API endpoint.
     * @param methodType        -The method type.
     * @param apiResultCallBack -The API result call back object.
     * @param requestCode       -The request code.
     */
    public static void callSecuredAPI(Context context, String endpoint, HTTP_METHODS methodType,
            String requestParams, APIResultCallBack apiResultCallBack, int requestCode) {

        EndPointInfo apiUtilities = new EndPointInfo();
        ServerConfig utils = new ServerConfig();
        apiUtilities.setEndPoint(endpoint);
        apiUtilities.setHttpMethod(methodType);
        if (requestParams != null) {
            apiUtilities.setRequestParams(requestParams);
        }
        APIController apiController;

        if (org.wso2.emm.agent.proxy.utils.Constants.Authenticator.AUTHENTICATOR_IN_USE
                .equals(org.wso2.emm.agent.proxy.utils.Constants.Authenticator.MUTUAL_SSL_AUTHENTICATOR)) {
            apiController = new APIController();
            apiController.securedNetworkCall(apiResultCallBack, requestCode, apiUtilities, context);
        } else {
            String clientKey = Preference.getString(context, Constants.CLIENT_ID);
            String clientSecret = Preference.getString(context, Constants.CLIENT_SECRET);
            if (utils.getHostFromPreferences(context) != null && !utils.getHostFromPreferences(context).isEmpty()
                    && clientKey != null && !clientKey.isEmpty() && !clientSecret.isEmpty()) {
                apiController = new APIController(clientKey, clientSecret);
                apiController.invokeAPI(apiUtilities, apiResultCallBack, requestCode,
                        context.getApplicationContext());
            }
        }

    }

    /**
     * Returns network availability status.
     * @param context - Application context.
     * @return - Network availability status.
     */
    public static boolean isNetworkAvailable(Context context) {
        ConnectivityManager connectivityManager = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = connectivityManager.getActiveNetworkInfo();
        return info != null && info.isConnected();
    }

    /**
     * Convert given object to json formatted string.
     * @param obj Object to be converted.
     * @return Json formatted string.
     * @throws AppCatalogException
     */
    public static String toJSON(Object obj) throws AppCatalogException {
        try {
            ObjectMapper mapper = new ObjectMapper();
            return mapper.writeValueAsString(obj);
        } catch (JsonMappingException e) {
            throw new AppCatalogException("Error occurred while mapping class to json", e);
        } catch (JsonGenerationException e) {
            throw new AppCatalogException("Error occurred while generating json", e);
        } catch (IOException e) {
            throw new AppCatalogException("Error occurred while reading the stream", e);
        }
    }

    /**
     * Clear client credentials.
     * @param context - Application context.
     */
    public static void clearClientCredentials(Context context) {
        SharedPreferences mainPref = context.getSharedPreferences(Constants.PACKAGE_NAME, Context.MODE_PRIVATE);
        Editor editor = mainPref.edit();
        editor.putString(Constants.CLIENT_ID, null);
        editor.putString(Constants.CLIENT_SECRET, null);
        editor.apply();
    }

    /**
     * Returns the IMEI Number.
     * @return - Device IMEI number.
     */
    public static String getDeviceId(Context context) {
        TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        String deviceId = telephonyManager.getDeviceId();

        if (deviceId == null || deviceId.isEmpty()) {
            deviceId = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
        }

        return deviceId;
    }

    /**
     * Call EMM system app in COPE mode.
     * @param context - Application context.
     * @param operation - Operation code.
     * @param appUri - App package/APK URI when an app operation executed.
     * @param appName - Application name.
     */
    public static void callAgentApp(Context context, String operation, String appUri, String appName) {
        Intent intent = new Intent(Constants.AGENT_APP_SERVICE_NAME);
        Intent explicitIntent = createExplicitFromImplicitIntent(context, intent);
        if (explicitIntent != null) {
            intent = explicitIntent;
        }

        intent.putExtra("operation", operation);
        intent.setPackage(Constants.PACKAGE_NAME);

        if (appUri != null) {
            intent.putExtra("appUri", appUri);
        }

        if (appName != null) {
            intent.putExtra("appName", appName);
        }
        context.startService(intent);
    }

    /**
     * This method is used to initiate the oauth client app unregister process.
     *
     * @param context Application context
     * @throws AppCatalogException
     */
    public static void unRegisterClientApp(Context context) throws AppCatalogException {
        String serverIP = Preference.getString(context, Constants.PreferenceFlag.IP);

        if (serverIP != null && !serverIP.isEmpty()) {
            String applicationName = Preference.getString(context, Constants.CLIENT_NAME);
            String consumerKey = Preference.getString(context, Constants.CLIENT_ID);
            String userId = Preference.getString(context, Constants.USERNAME);

            if (applicationName != null && !applicationName.isEmpty() && consumerKey != null
                    && !consumerKey.isEmpty() && userId != null && !userId.isEmpty()) {

                UnregisterProfile profile = new UnregisterProfile();
                profile.setApplicationName(applicationName);
                profile.setConsumerKey(consumerKey);
                profile.setUserId(userId);

                ServerConfig utils = new ServerConfig();
                utils.setServerIP(serverIP);

                DynamicClientManager dynamicClientManager = new DynamicClientManager();
                boolean isUnregistered = dynamicClientManager.unregisterClient(profile, utils, context);

                if (!isUnregistered) {
                    Log.e(TAG, "Error occurred while removing the OAuth client app");
                }
            } else {
                Log.e(TAG, "Client credential is not available");
            }
        } else {
            Log.e(TAG, "There is no valid IP to contact the server");
        }
    }

    public static Intent createExplicitFromImplicitIntent(Context context, Intent implicitIntent) {
        //Retrieve all services that can match the given intent
        PackageManager pm = context.getPackageManager();
        List<ResolveInfo> resolveInfo = pm.queryIntentServices(implicitIntent, 0);

        //Make sure only one match was found
        if (resolveInfo == null || resolveInfo.size() != 1) {
            return null;
        }

        //Get component info and create ComponentName
        ResolveInfo serviceInfo = resolveInfo.get(0);
        String packageName = serviceInfo.serviceInfo.packageName;
        String className = serviceInfo.serviceInfo.name;
        ComponentName component = new ComponentName(packageName, className);

        //Create a new intent. Use the old one for extras and such reuse
        Intent explicitIntent = new Intent(implicitIntent);

        //Set the component to be explicit
        explicitIntent.setComponent(component);

        return explicitIntent;
    }
}