/* * Copyright (C) 2018 The Android Open Source Project * * Licensed 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.android.server.wifi.hotspot2; import android.annotation.NonNull; import android.content.Context; import android.os.Build; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.text.TextUtils; import com.android.internal.annotations.VisibleForTesting; import com.android.server.wifi.WifiNative; import java.util.Locale; /** * Provide APIs for retrieving system information, so that they can be mocked for unit tests. */ public class SystemInfo { public static final String TAG = "SystemInfo"; public static final String UNKNOWN_INFO = "Unknown"; private final TelephonyManager mTelephonyManager; private final WifiNative mWifiNative; private static SystemInfo sSystemInfo = null; @VisibleForTesting SystemInfo(Context context, WifiNative wifiNative) { // TODO(b/132188983): inject this using WifiInjector mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); mWifiNative = wifiNative; } public static SystemInfo getInstance(@NonNull Context context, @NonNull WifiNative wifiNative) { if (sSystemInfo == null) { sSystemInfo = new SystemInfo(context, wifiNative); } return sSystemInfo; } /** * Get the system language. * * @return current language code */ public String getLanguage() { return Locale.getDefault().getLanguage(); } /** * Get the device manufacturer info * * @return the device manufacturer info or {@link Build#UNKNOWN} if not set */ public String getDeviceManufacturer() { return Build.MANUFACTURER; } /** * Get the device model info. * * @return the device model info or {@link Build#UNKNOWN} if not set */ public String getDeviceModel() { return Build.MODEL; } /** * Get the Wifi Mac address for primary interface. * * TODO(b/80092273): need to check if this privacy information is required for Passpoint R2. * @param ifaceName Name of the interface. * @return string containing the MAC address or null on a failed call */ public String getMacAddress(@NonNull String ifaceName) { return mWifiNative.getMacAddress(ifaceName); } /** * Get the device ID. Either IMEI or MEID will be returned based on the installed SIM. * {@link #UNKNOWN_INFO} will be returned if no SIM is installed. * * @return String representing device ID */ public String getDeviceId() { TelephonyManager defaultDataTm = mTelephonyManager.createForSubscriptionId( SubscriptionManager.getDefaultDataSubscriptionId()); // IMEI will be provided for GSM SIM. String imei = defaultDataTm.getImei(); if (!TextUtils.isEmpty(imei)) { return imei; } // MEID will be provided for CMDA SIM. String meid = defaultDataTm.getMeid(); if (!TextUtils.isEmpty(meid)) { return meid; } return UNKNOWN_INFO; } /** * Get the software version. * * @return the build release version. */ public String getSoftwareVersion() { return String.format("Android %s %s", Build.VERSION.RELEASE, Build.VERSION.INCREMENTAL); } }