summaryrefslogtreecommitdiffstats
path: root/service/java/com/android/server/wifi/hotspot2/SystemInfo.java
blob: fe675c6f5738ba77fe5ca567f17947c914184af8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/*
 * 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.os.SystemProperties;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.text.TextUtils;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.TelephonyProperties;
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 hardware version.
     *
     * TODO(b/80092273): need to check if this privacy information is required for Passpoint R2.
     * @return the version that consists of hardware name and revision number.
     */
    public String getHwVersion() {
        return Build.HARDWARE + "." + SystemProperties.get("ro.revision", "0");
    }

    /**
     * Get the software version.
     *
     * @return the build release version.
     */
    public String getSoftwareVersion() {
         return new StringBuffer("Android ").append(Build.VERSION.RELEASE).toString();
    }

    /**
     * Get the firmware version.
     *
     * @return the version that consists of build id and baseband version.
     */
    public String getFirmwareVersion() {
        return new StringBuffer(Build.ID)
                .append("/")
                .append(SystemProperties.get(TelephonyProperties.PROPERTY_BASEBAND_VERSION,
                        UNKNOWN_INFO)).toString();
    }
}