/*
* Copyright (c) 2014, 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 com.cfap.cfadevicemanager.utils;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.BatteryManager;
import android.os.Environment;
import android.os.StatFs;
import com.cfap.cfadevicemanager.models.DeviceInfo;
import com.cfap.cfadevicemanager.models.DeviceState;
import java.io.File;
import java.math.BigDecimal;
import java.math.RoundingMode;
/**
* This class represents all the device state related APIs for devices up to
* Android SDK 15 - ICS.
*/
public class DeviceStateICS implements DeviceState {
private Context context;
private DeviceInfo info;
private File dataDirectory;
private StatFs directoryStatus;
private static final int DEFAULT_LEVEL = -1;
private static final float PRECENTAGE_MULTIPLIER = 100.0f;
private static final int SCALE = 2;
private static final int MEMORY_NOT_AVAILABLE = 0;
private static final double GB_DIVIDER = 1073741824;
private static final double MB_DIVIDER = 1048576;
public DeviceStateICS(Context context) {
this.context = context;
this.info = new DeviceInfo(context);
this.dataDirectory = Environment.getDataDirectory();
this.directoryStatus = new StatFs(dataDirectory.getPath());
}
@Override
public boolean externalMemoryAvailable() {
return Environment.getExternalStorageState()
.equals(Environment.MEDIA_MOUNTED);
}
@SuppressWarnings("deprecation")
@Override
public double getAvailableInternalMemorySize() {
double blockSize, availableBlocks;
blockSize = directoryStatus.getBlockSize();
availableBlocks = directoryStatus.getAvailableBlocks();
return formatSizeInGb(availableBlocks * blockSize);
}
@SuppressWarnings("deprecation")
@Override
public double getTotalInternalMemorySize() {
double blockSize, totalBlocks;
blockSize = directoryStatus.getBlockSize();
totalBlocks = directoryStatus.getBlockCount();
return formatSizeInGb(totalBlocks * blockSize);
}
@SuppressWarnings("deprecation")
@Override
public double getAvailableExternalMemorySize() {
double blockSize, availableBlocks;
if (externalMemoryAvailable()) {
blockSize = directoryStatus.getBlockSize();
availableBlocks = directoryStatus.getAvailableBlocks();
return formatSizeInGb(availableBlocks * blockSize);
} else {
return MEMORY_NOT_AVAILABLE;
}
}
@SuppressWarnings("deprecation")
@Override
public double getTotalExternalMemorySize() {
double blockSize, totalBlocks;
if (externalMemoryAvailable()) {
blockSize = directoryStatus.getBlockSize();
totalBlocks = directoryStatus.getBlockCount();
return formatSizeInGb(totalBlocks * blockSize);
} else {
return MEMORY_NOT_AVAILABLE;
}
}
@Override
public double formatSizeInGb(double byteValue) {
double gbValue = (byteValue / GB_DIVIDER);
BigDecimal roundedValue = new BigDecimal(gbValue).setScale(SCALE, RoundingMode.HALF_EVEN);
gbValue = roundedValue.doubleValue();
return gbValue;
}
@Override
public double formatSizeInMb(double byteValue) {
double mbValue = (byteValue / MB_DIVIDER);
BigDecimal roundedValue = new BigDecimal(mbValue).setScale(SCALE, RoundingMode.HALF_EVEN);
mbValue = roundedValue.doubleValue();
return mbValue;
}
@Override
public Response evaluateCompatibility() {
if (!(info.getSdkVersion() >= android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) &&
info.isRooted()) {
return Response.INCOMPATIBLE;
} else if (info.getSdkVersion() < android.os.Build.VERSION_CODES.FROYO) {
return Response.INCOMPATIBLE_OS;
} else if (info.isRooted()) {
return Response.INCOMPATIBLE_ROOT;
}
return Response.COMPATIBLE;
}
@Override
public String getIpAddress() {
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
return intToIp(wifiInfo.getIpAddress());
}
@Override
public String intToIp(int ip) {
return (ip & 0xFF) + "." + ((ip >> 8) & 0xFF) + "." + ((ip >> 16) & 0xFF) + "." +
((ip >> 24) & 0xFF);
}
@Override
public float getBatteryLevel() {
Intent batteryIntent = context.registerReceiver(null,
new IntentFilter(
Intent.ACTION_BATTERY_CHANGED));
int level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, DEFAULT_LEVEL);
int scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, DEFAULT_LEVEL);
return ((float) level / (float) scale) * PRECENTAGE_MULTIPLIER;
}
}