/* * Copyright 2015. Appsi Mobile * * 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.appsimobile.appsii.module.appsisettings; import android.bluetooth.BluetoothAdapter; import android.content.Context; import android.content.pm.PackageManager; import android.media.AudioManager; import android.net.ConnectivityManager; import android.net.wifi.WifiManager; import android.os.Build; import android.os.Looper; import android.provider.Settings; import android.telephony.TelephonyManager; import android.util.Log; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; public class SettingsHelper { public static final boolean API19 = android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; public static final boolean API18 = android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2; public static final boolean API17 = android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1; public static final String DATA_USAGE_ACTION = "_DATA_USAGE_"; static final int bv = Build.VERSION.SDK_INT; final int mAirplaneToggleDrawableResourceId; final int mBluetoothToggleDrawableResourceId; final int mDataToggleDrawableResourceId; final int mWirelessToggleDrawableResourceId; final int mSoundToggleDrawableResourceId; private final Section[] mSections; private final List<SectionItem> mPickerItems; private final Context mContext; List<SectionItem> mAdditionalPickerItems; ConnectivityManager mConnectivityManager; TelephonyManager mTelephonyManager; AudioManager mAudioManager; WifiManager mWifiManager; public SettingsHelper(Context context, Section[] sections, int airplaneToggleDrawableResourceId, int bluetoothToggleDrawableResourceId, int dataToggleDrawableResourceId, int wirelessToggleDrawableResourceId, int soundToggleDrawableResourceId, ConnectivityManager connectivityManager, TelephonyManager telephonyManager, AudioManager audioManager, WifiManager wifiManager) { mConnectivityManager = connectivityManager; mTelephonyManager = telephonyManager; mAudioManager = audioManager; mWifiManager = wifiManager; mContext = context; boolean devEnabled = isDevEnabled(); mPickerItems = new ArrayList<>(); int count = sections.length; for (int i = 0; i < count; i++) { SectionItem[] sectionItems = sections[i].mItems; int itemCount = sectionItems.length; for (int j = 0; j < itemCount; j++) { SectionItem sectionItem = sectionItems[j]; updateSectionItemsAvailability(context, sectionItem, devEnabled); } } mSections = sections; mAirplaneToggleDrawableResourceId = airplaneToggleDrawableResourceId; mBluetoothToggleDrawableResourceId = bluetoothToggleDrawableResourceId; mDataToggleDrawableResourceId = dataToggleDrawableResourceId; mWirelessToggleDrawableResourceId = wirelessToggleDrawableResourceId; mSoundToggleDrawableResourceId = soundToggleDrawableResourceId; addAdditionalPickerItems(context, mPickerItems); } public boolean isDevEnabled() { if (API17) { return Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) == 1; } return Settings.Secure.getInt(mContext.getContentResolver(), Settings.Secure.DEVELOPMENT_SETTINGS_ENABLED, 0) == 1; } private void updateSectionItemsAvailability(Context context, SectionItem sectionItem, boolean devEnabled) { String id = sectionItem.mActivityAction; if (id.equals(Settings.ACTION_NFCSHARING_SETTINGS)) { PackageManager packageManager = context.getPackageManager(); if (!packageManager.hasSystemFeature(PackageManager.FEATURE_NFC)) { sectionItem.mShown = false; } } if (id.equals(Settings.ACTION_NFC_SETTINGS)) { PackageManager packageManager = context.getPackageManager(); if (!packageManager.hasSystemFeature(PackageManager.FEATURE_NFC)) { sectionItem.mShown = false; } } if (id.equals(Settings.ACTION_DATA_ROAMING_SETTINGS)) { if (!hasData()) { sectionItem.mShown = false; } } if (id.equals(Settings.ACTION_NFC_PAYMENT_SETTINGS)) { if (!API19) { sectionItem.mShown = false; } else { PackageManager packageManager = context.getPackageManager(); if (!packageManager.hasSystemFeature(PackageManager.FEATURE_NFC)) { sectionItem.mShown = false; } else { // Only show if we have the HCE feature if (!packageManager.hasSystemFeature( PackageManager.FEATURE_NFC_HOST_CARD_EMULATION)) { sectionItem.mShown = false; } } } } if (id.equals(Settings.ACTION_CAPTIONING_SETTINGS)) { if (!API19) { sectionItem.mShown = false; } } if (id.equals(Settings.ACTION_DREAM_SETTINGS)) { if (!API18) { sectionItem.mShown = false; } } if (id.equals(Settings.ACTION_PRINT_SETTINGS)) { if (!API19) { sectionItem.mShown = false; } } if (id.equals( Settings.ACTION_WIFI_SETTINGS)) {// Remove WiFi Settings if WiFi service is not // available. if (!hasWifi()) { sectionItem.mShown = false; } } else if (id.equals(Settings.ACTION_BLUETOOTH_SETTINGS)) { if (!hasBluetooth()) { sectionItem.mShown = false; } } else if (id.equals(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS)) { if (!devEnabled) { sectionItem.mShown = false; } } } private void addAdditionalPickerItems(Context context, List<SectionItem> pickerItems) { int count = mAdditionalPickerItems.size(); for (int i = 0; i < count; i++) { SectionItem sectionItem = mAdditionalPickerItems.get(i); updateSectionItemsAvailability(context, sectionItem, false); mPickerItems.add(sectionItem); } } public boolean hasData() { return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY); } public boolean hasWifi() { return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI); } public boolean hasBluetooth() { return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH); } public int getIconResourceIdForToggle(String toggleName) { if (toggleName.equals("AIRPLANE_TOGGLE")) { return mAirplaneToggleDrawableResourceId; } else if (toggleName.equals("BT_TOGGLE")) { return mBluetoothToggleDrawableResourceId; } else if (toggleName.equals("DATA_TOGGLE")) { return mDataToggleDrawableResourceId; } else if (toggleName.equals("WIFI_TOGGLE")) { return mWirelessToggleDrawableResourceId; } else if (toggleName.equals("AUDIO_TOGGLE")) { return mSoundToggleDrawableResourceId; } return 0; } public SectionItem findSectionItem(String activityAction) { int count = mSections.length; for (int i = 0; i < count; i++) { Section section = mSections[i]; SectionItem[] items = section.mItems; int itemCount = items.length; for (int j = 0; j < itemCount; j++) { SectionItem sectionItem = items[j]; if (sectionItem.mActivityAction.equals(activityAction)) { return sectionItem; } } } count = mPickerItems.size(); for (int i = 0; i < count; i++) { SectionItem sectionItem = mPickerItems.get(i); if (sectionItem.mActivityAction.equals(activityAction)) { return sectionItem; } } return null; } public synchronized Section[] getSections() { return mSections; } public synchronized List<SectionItem> getPickerSectionItems() { return mPickerItems; } public boolean isAirplaneModeEnabled() { if (API17) { return Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0) == 1; } return Settings.System.getInt(mContext.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) == 1; } public void setAirplaneModeEnabled(boolean enable) { if (API17) { Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, enable ? 1 : 0); } else { Settings.System.putInt(mContext.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, enable ? 1 : 0); } } public boolean isSoundEnabled() { AudioManager manager = mAudioManager; int ringermode = manager.getRingerMode(); if (ringermode == AudioManager.RINGER_MODE_SILENT || ringermode == AudioManager.RINGER_MODE_VIBRATE) { return false; } return true; } public void setSoundEnabled(boolean enable) { AudioManager manager = mAudioManager; manager.setRingerMode( enable ? AudioManager.RINGER_MODE_NORMAL : AudioManager.RINGER_MODE_VIBRATE); } public boolean isWiFiEnabled() { WifiManager wifiManager = mWifiManager; return wifiManager.isWifiEnabled(); } public void setWiFiEnabled(boolean enable) { WifiManager wifiManager = mWifiManager; wifiManager.setWifiEnabled(enable); } public boolean isBluetoothEnabled() { if (Looper.myLooper() == null) { Looper.prepare(); } BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); return adapter != null && adapter.isEnabled(); /* if (LauncherApplication.API17) { return Settings.Global.getInt(context.getContentResolver(), Settings.Global.BLUETOOTH_ON, 0) == 1; } return Settings.System.getInt(context.getContentResolver(), Settings.System.BLUETOOTH_ON, 0) == 1; */ } public void setBluetoothEnabled(boolean enable) { BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); if (enable) { adapter.enable(); } else { adapter.disable(); } } public boolean setDataEnabled(Context context, boolean ON) { try { if (bv == Build.VERSION_CODES.FROYO) { Method dataConnSwitchmethod; Class<?> telephonyManagerClass; Object iTelephonyStub; Class<?> iTelephonyClass; TelephonyManager telephonyManager = mTelephonyManager; telephonyManagerClass = Class.forName(telephonyManager.getClass().getName()); Method getITelephonyMethod = telephonyManagerClass.getDeclaredMethod("getITelephony"); getITelephonyMethod.setAccessible(true); iTelephonyStub = getITelephonyMethod.invoke(telephonyManager); iTelephonyClass = Class.forName(iTelephonyStub.getClass().getName()); if (ON) { dataConnSwitchmethod = iTelephonyClass.getDeclaredMethod("enableDataConnectivity"); } else { dataConnSwitchmethod = iTelephonyClass.getDeclaredMethod("disableDataConnectivity"); } dataConnSwitchmethod.setAccessible(true); dataConnSwitchmethod.invoke(iTelephonyStub); } else { //log.i("App running on Ginger bread+"); final ConnectivityManager conman = mConnectivityManager; final Class<?> conmanClass = Class.forName(conman.getClass().getName()); final Field iConnectivityManagerField = conmanClass.getDeclaredField("mService"); iConnectivityManagerField.setAccessible(true); final Object iConnectivityManager = iConnectivityManagerField.get(conman); final Class<?> iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName()); final Method setMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE); setMobileDataEnabledMethod.setAccessible(true); setMobileDataEnabledMethod.invoke(iConnectivityManager, ON); } return true; } catch (Exception e) { Log.e("SettingsHelper", "error turning on/off data", e); return false; } } public boolean isDataEnabled() { try { if (bv == Build.VERSION_CODES.FROYO) { Method getDataConnSwitchmethod; Class<?> class_telephonyManager; Object iTelephonyStub; Class<?> class_ITelephony; TelephonyManager telephonyManager = mTelephonyManager; class_telephonyManager = telephonyManager.getClass(); Method getITelephonyMethod = class_telephonyManager.getDeclaredMethod("getITelephony"); getITelephonyMethod.setAccessible(true); iTelephonyStub = getITelephonyMethod.invoke(telephonyManager); class_ITelephony = iTelephonyStub.getClass(); getDataConnSwitchmethod = class_ITelephony .getDeclaredMethod("isDataConnectivityPossible()"); getDataConnSwitchmethod.setAccessible(true); return Boolean.TRUE.equals(getDataConnSwitchmethod.invoke(iTelephonyStub)); } else { //log.i("App running on Ginger bread+"); final ConnectivityManager conman = mConnectivityManager; final Class<?> conmanClass = Class.forName(conman.getClass().getName()); final Field iConnectivityManagerField = conmanClass.getDeclaredField("mService"); iConnectivityManagerField.setAccessible(true); final Object iConnectivityManager = iConnectivityManagerField.get(conman); final Class<?> iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName()); final Method getMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("getMobileDataEnabled"); getMobileDataEnabledMethod.setAccessible(true); Boolean result = (Boolean) getMobileDataEnabledMethod.invoke(iConnectivityManager); return result.booleanValue(); } } catch (Exception e) { Log.w("SettingsHelper", "error getting data status", e); return false; } } public static class Section { final int mNameResourceId; final SectionItem[] mItems; public Section(int resourceId, SectionItem[] items) { mItems = items; mNameResourceId = resourceId; } } public static class SectionItem { final String mActivityAction; final int mTitleResourceId; final int mIconResourceId; volatile boolean mShown = true; public SectionItem(String action, int title, int icon) { mActivityAction = action; mTitleResourceId = title; mIconResourceId = icon; } } public static class Builder { final int mAirplaneToggleDrawableResourceId; final int mBluetoothToggleDrawableResourceId; final int mDataToggleDrawableResourceId; final int mWirelessToggleDrawableResourceId; final int mSoundToggleDrawableResourceId; final ConnectivityManager mConnectivityManager; final TelephonyManager mTelephonyManager; final AudioManager mAudioManager; final WifiManager mWifiManager; private final Section[] mSections; public Builder(Section[] sections, int airplaneToggleDrawableResourceId, int bluetoothToggleDrawableResourceId, int dataToggleDrawableResourceId, int wirelessToggleDrawableResourceId, int soundToggleDrawableResourceId, ConnectivityManager connectivityManager, TelephonyManager telephonyManager, AudioManager audioManager, WifiManager wifiManager) { mSections = sections; mAirplaneToggleDrawableResourceId = airplaneToggleDrawableResourceId; mBluetoothToggleDrawableResourceId = bluetoothToggleDrawableResourceId; mDataToggleDrawableResourceId = dataToggleDrawableResourceId; mWirelessToggleDrawableResourceId = wirelessToggleDrawableResourceId; mSoundToggleDrawableResourceId = soundToggleDrawableResourceId; mConnectivityManager = connectivityManager; mTelephonyManager = telephonyManager; mAudioManager = audioManager; mWifiManager = wifiManager; } public SettingsHelper build(Context context) { return new SettingsHelper(context, mSections, mAirplaneToggleDrawableResourceId, mBluetoothToggleDrawableResourceId, mDataToggleDrawableResourceId, mWirelessToggleDrawableResourceId, mSoundToggleDrawableResourceId, mConnectivityManager, mTelephonyManager, mAudioManager, mWifiManager); } } }