/* * Copyright (C) 2015 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.messaging.util; import android.content.Context; import android.telephony.PhoneStateListener; import android.telephony.ServiceState; import android.telephony.TelephonyManager; import com.android.messaging.datamodel.data.ParticipantData; /** * ConnectivityUtil listens to the network service state changes. * * On N and beyond, This class instance can be created via ConnectivityUtil(context, subId), use * ConnectivityUtil(context) for others. * * Note that TelephonyManager has createForSubscriptionId() for a specific subId from N but listen() * does not use the subId on the manager, and uses the default subId on PhoneStateListener. From O, * the manager uses its' own subId in listen(). */ public class ConnectivityUtil { // Assume not connected until informed differently private volatile int mCurrentServiceState = ServiceState.STATE_POWER_OFF; private final TelephonyManager mTelephonyManager; private ConnectivityListener mListener; public interface ConnectivityListener { public void onPhoneStateChanged(int serviceState); } public ConnectivityUtil(final Context context) { mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); } public ConnectivityUtil(final Context context, final int subId) { Assert.isTrue(OsUtil.isAtLeastN()); mTelephonyManager = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)) .createForSubscriptionId(subId); } public int getCurrentServiceState() { return mCurrentServiceState; } private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() { @Override public void onServiceStateChanged(final ServiceState serviceState) { if (mCurrentServiceState != serviceState.getState()) { mCurrentServiceState = serviceState.getState(); onPhoneStateChanged(mCurrentServiceState); } } @Override public void onDataConnectionStateChanged(final int state) { mCurrentServiceState = (state == TelephonyManager.DATA_DISCONNECTED) ? ServiceState.STATE_OUT_OF_SERVICE : ServiceState.STATE_IN_SERVICE; } }; private void onPhoneStateChanged(final int serviceState) { final ConnectivityListener listener = mListener; if (listener != null) { listener.onPhoneStateChanged(serviceState); } } public void register(final ConnectivityListener listener) { Assert.isTrue(mListener == null || mListener == listener); if (mListener == null) { if (mTelephonyManager != null) { mCurrentServiceState = (PhoneUtils.getDefault().isAirplaneModeOn() ? ServiceState.STATE_POWER_OFF : ServiceState.STATE_IN_SERVICE); mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_SERVICE_STATE); } } mListener = listener; } public void unregister() { if (mListener != null) { if (mTelephonyManager != null) { mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE); mCurrentServiceState = ServiceState.STATE_POWER_OFF; } } mListener = null; } }