summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTony Mantler <nicoya@google.com>2017-10-06 10:24:22 -0700
committerTony Mantler <nicoya@google.com>2017-10-09 11:15:58 -0700
commitb35a19bce89c562f6f01822f89c588dc5f3a62e9 (patch)
tree78af116bb9384cb7cba3741aa696f8dd024a9c01
parentba00aaa0dfadce3d02e327016516747ea25acc33 (diff)
downloadpackages_apps_Settings-b35a19bce89c562f6f01822f89c588dc5f3a62e9.tar.gz
packages_apps_Settings-b35a19bce89c562f6f01822f89c588dc5f3a62e9.tar.bz2
packages_apps_Settings-b35a19bce89c562f6f01822f89c588dc5f3a62e9.zip
Convert more of StatusFragment to PreferenceControllers
Bug: 67410808 Test: RunSettingsRoboTests Change-Id: Ia79d89d3d3b70bf7af950daa3e588db3f7f597e2
-rw-r--r--res/values/strings.xml10
-rw-r--r--res/xml/device_info_status.xml7
-rw-r--r--src/com/android/settings/deviceinfo/BluetoothAddressPreferenceController.java35
-rw-r--r--src/com/android/settings/deviceinfo/ImsStatusPreferenceController.java36
-rw-r--r--src/com/android/settings/deviceinfo/IpAddressPreferenceController.java35
-rw-r--r--src/com/android/settings/deviceinfo/Status.java248
-rw-r--r--src/com/android/settings/deviceinfo/UptimePreferenceController.java35
-rw-r--r--src/com/android/settings/deviceinfo/WifiMacAddressPreferenceController.java35
8 files changed, 200 insertions, 241 deletions
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 8f6cc9c40d..ce0370ec65 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2695,8 +2695,6 @@
<string name="status_bt_address">Bluetooth address</string>
<!-- About phone, status item title. The hardware serial number. [CHAR LIMIT=30]-->
<string name="status_serial_number">Serial number</string>
- <!-- About phone, status item value if the actual value is not available. -->
- <string name="status_unavailable">Unavailable</string>
<!-- About phone, status item title. How long the device has been running since its last reboot. -->
<string name="status_up_time">Up time</string>
<!-- About phone, status item title. How much time the device has had its main CPU awake. -->
@@ -5532,8 +5530,6 @@
<!-- Messaage shown in dialog when you can't manually sync -->
<string name="cant_sync_dialog_message">Sync for this item is currently disabled. To change this setting, temporarily turn on background data and automatic sync.</string>
- <string name="wimax_settings">4G</string>
- <string name="status_wimax_mac_address">4G MAC address</string>
<!-- This is displayed to the user when the device needs to be decrypted -->
<string name="enter_password">To start Android, enter your password</string>
<!-- Informational text on the pin entry screen prompting the user for their pin -->
@@ -9071,10 +9067,4 @@
<!-- Note displayed when certain features are not available on low ram devices. [CHAR LIMIT=NONE] -->
<string name="disabled_low_ram_device">This feature is not available on this device</string>
- <!--Label of IMS registration header -->
- <string name="ims_reg_title">"IMS registration state"</string>
- <!--Used when IMS registration state is registered -->
- <string name="ims_reg_status_registered">"Registered"</string>
- <!--Used when IMS registration state is not registered -->
- <string name="ims_reg_status_not_registered">"Not registered"</string>
</resources>
diff --git a/res/xml/device_info_status.xml b/res/xml/device_info_status.xml
index 3456f9199e..07bbc4e993 100644
--- a/res/xml/device_info_status.xml
+++ b/res/xml/device_info_status.xml
@@ -83,13 +83,6 @@
android:summary="@string/summary_placeholder"
android:persistent="false" />
<Preference
- android:key="wimax_mac_address"
- android:enabled="false"
- android:shouldDisableView="false"
- android:title="@string/status_wimax_mac_address"
- android:summary="@string/summary_placeholder"
- android:persistent="false" />
- <Preference
android:key="ims_reg_state"
android:enabled="false"
android:shouldDisableView="false"
diff --git a/src/com/android/settings/deviceinfo/BluetoothAddressPreferenceController.java b/src/com/android/settings/deviceinfo/BluetoothAddressPreferenceController.java
new file mode 100644
index 0000000000..431ead53a0
--- /dev/null
+++ b/src/com/android/settings/deviceinfo/BluetoothAddressPreferenceController.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2017 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.settings.deviceinfo;
+
+import android.content.Context;
+
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.deviceinfo.AbstractBluetoothAddressPreferenceController;
+
+/**
+ * Concrete subclass of bluetooth address preference controller
+ */
+public class BluetoothAddressPreferenceController extends
+ AbstractBluetoothAddressPreferenceController implements PreferenceControllerMixin {
+ public BluetoothAddressPreferenceController(Context context, Lifecycle lifecycle) {
+ super(context, lifecycle);
+ }
+
+ // This space intentionally left blank
+}
diff --git a/src/com/android/settings/deviceinfo/ImsStatusPreferenceController.java b/src/com/android/settings/deviceinfo/ImsStatusPreferenceController.java
new file mode 100644
index 0000000000..07bd4a6788
--- /dev/null
+++ b/src/com/android/settings/deviceinfo/ImsStatusPreferenceController.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2017 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.settings.deviceinfo;
+
+import android.content.Context;
+
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.deviceinfo.AbstractImsStatusPreferenceController;
+
+/**
+ * Concrete subclass of IMS status preference controller
+ */
+public class ImsStatusPreferenceController extends AbstractImsStatusPreferenceController
+ implements PreferenceControllerMixin {
+ public ImsStatusPreferenceController(Context context,
+ Lifecycle lifecycle) {
+ super(context, lifecycle);
+ }
+
+ // This space intentionally left blank
+}
diff --git a/src/com/android/settings/deviceinfo/IpAddressPreferenceController.java b/src/com/android/settings/deviceinfo/IpAddressPreferenceController.java
new file mode 100644
index 0000000000..f4e2f8cefb
--- /dev/null
+++ b/src/com/android/settings/deviceinfo/IpAddressPreferenceController.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2017 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.settings.deviceinfo;
+
+import android.content.Context;
+
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.deviceinfo.AbstractIpAddressPreferenceController;
+
+/**
+ * Concrete subclass of IP address preference controller
+ */
+public class IpAddressPreferenceController extends AbstractIpAddressPreferenceController implements
+ PreferenceControllerMixin {
+ public IpAddressPreferenceController(Context context, Lifecycle lifecycle) {
+ super(context, lifecycle);
+ }
+
+ // This space intentionally left blank
+}
diff --git a/src/com/android/settings/deviceinfo/Status.java b/src/com/android/settings/deviceinfo/Status.java
index 228774f265..080becc873 100644
--- a/src/com/android/settings/deviceinfo/Status.java
+++ b/src/com/android/settings/deviceinfo/Status.java
@@ -16,115 +16,45 @@
package com.android.settings.deviceinfo;
-import android.bluetooth.BluetoothAdapter;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
-import android.content.res.Resources;
-import android.net.ConnectivityManager;
-import android.net.wifi.WifiInfo;
-import android.net.wifi.WifiManager;
import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.os.PersistableBundle;
-import android.os.SystemClock;
-import android.os.SystemProperties;
import android.os.UserManager;
import android.provider.SearchIndexableResource;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
-import android.telephony.CarrierConfigManager;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-import android.text.TextUtils;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.internal.util.ArrayUtils;
import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.Utils;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.search.Indexable;
+import com.android.settingslib.core.lifecycle.Lifecycle;
-import java.lang.ref.WeakReference;
import java.util.Arrays;
import java.util.List;
-import static android.content.Context.CONNECTIVITY_SERVICE;
-import static android.content.Context.WIFI_SERVICE;
-
+/**
+ * Fragment for showing device hardware info, such as MAC addresses and serial numbers
+ */
public class Status extends SettingsPreferenceFragment implements Indexable {
private static final String KEY_BATTERY_STATUS = "battery_status";
private static final String KEY_BATTERY_LEVEL = "battery_level";
- private static final String KEY_IP_ADDRESS = "wifi_ip_address";
- private static final String KEY_WIFI_MAC_ADDRESS = "wifi_mac_address";
- private static final String KEY_BT_ADDRESS = "bt_address";
- private static final String KEY_WIMAX_MAC_ADDRESS = "wimax_mac_address";
private static final String KEY_SIM_STATUS = "sim_status";
private static final String KEY_IMEI_INFO = "imei_info";
- private static final String KEY_IMS_REGISTRATION_STATE = "ims_reg_state";
-
- // Broadcasts to listen to for connectivity changes.
- private static final String[] CONNECTIVITY_INTENTS = {
- BluetoothAdapter.ACTION_STATE_CHANGED,
- ConnectivityManager.CONNECTIVITY_ACTION,
- WifiManager.LINK_CONFIGURATION_CHANGED_ACTION,
- WifiManager.NETWORK_STATE_CHANGED_ACTION,
- };
-
- private static final int EVENT_UPDATE_STATS = 500;
-
- private static final int EVENT_UPDATE_CONNECTIVITY = 600;
-
- private ConnectivityManager mCM;
- private WifiManager mWifiManager;
-
- private Resources mRes;
-
- private String mUnavailable;
private SerialNumberPreferenceController mSerialNumberPreferenceController;
-
- private Preference mUptime;
+ private UptimePreferenceController mUptimePreferenceController;
private Preference mBatteryStatus;
private Preference mBatteryLevel;
- private Preference mBtAddress;
- private Preference mIpAddress;
- private Preference mWifiMacAddress;
- private Preference mWimaxMacAddress;
- private Preference mImsStatus;
-
- private Handler mHandler;
-
- private static class MyHandler extends Handler {
- private WeakReference<Status> mStatus;
-
- public MyHandler(Status activity) {
- mStatus = new WeakReference<Status>(activity);
- }
-
- @Override
- public void handleMessage(Message msg) {
- Status status = mStatus.get();
- if (status == null) {
- return;
- }
-
- switch (msg.what) {
- case EVENT_UPDATE_STATS:
- status.updateTimes();
- sendEmptyMessageDelayed(EVENT_UPDATE_STATS, 1000);
- break;
-
- case EVENT_UPDATE_CONNECTIVITY:
- status.updateConnectivity();
- break;
- }
- }
- }
+ private BluetoothAddressPreferenceController mBluetoothAddressPreferenceController;
+ private IpAddressPreferenceController mIpAddressPreferenceController;
+ private WifiMacAddressPreferenceController mWifiMacAddressPreferenceController;
+ private ImsStatusPreferenceController mImsStatusPreferenceController;
private BroadcastReceiver mBatteryInfoReceiver = new BroadcastReceiver() {
@@ -138,68 +68,33 @@ public class Status extends SettingsPreferenceFragment implements Indexable {
}
};
- private IntentFilter mConnectivityIntentFilter;
- private final BroadcastReceiver mConnectivityReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- if (ArrayUtils.contains(CONNECTIVITY_INTENTS, action)) {
- mHandler.sendEmptyMessage(EVENT_UPDATE_CONNECTIVITY);
- }
- }
- };
-
- private boolean hasBluetooth() {
- return BluetoothAdapter.getDefaultAdapter() != null;
- }
-
- private boolean hasWimax() {
- return mCM.getNetworkInfo(ConnectivityManager.TYPE_WIMAX) != null;
- }
-
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
- mHandler = new MyHandler(this);
-
- mCM = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
- mWifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
- mSerialNumberPreferenceController = new SerialNumberPreferenceController(getActivity());
+ final Context context = getContext();
+ final Lifecycle lifecycle = getLifecycle();
+ mSerialNumberPreferenceController = new SerialNumberPreferenceController(context);
+ mUptimePreferenceController = new UptimePreferenceController(context, lifecycle);
+ mBluetoothAddressPreferenceController =
+ new BluetoothAddressPreferenceController(context, lifecycle);
+ mIpAddressPreferenceController = new IpAddressPreferenceController(context, lifecycle);
+ mWifiMacAddressPreferenceController =
+ new WifiMacAddressPreferenceController(context, lifecycle);
+ mImsStatusPreferenceController = new ImsStatusPreferenceController(context, lifecycle);
addPreferencesFromResource(R.xml.device_info_status);
mBatteryLevel = findPreference(KEY_BATTERY_LEVEL);
mBatteryStatus = findPreference(KEY_BATTERY_STATUS);
- mBtAddress = findPreference(KEY_BT_ADDRESS);
- mWifiMacAddress = findPreference(KEY_WIFI_MAC_ADDRESS);
- mWimaxMacAddress = findPreference(KEY_WIMAX_MAC_ADDRESS);
- mIpAddress = findPreference(KEY_IP_ADDRESS);
- mImsStatus = findPreference(KEY_IMS_REGISTRATION_STATE);
-
- mRes = getResources();
- mUnavailable = mRes.getString(R.string.status_unavailable);
- // Note - missing in zaku build, be careful later...
- mUptime = findPreference("up_time");
final PreferenceScreen screen = getPreferenceScreen();
- if (!hasBluetooth()) {
- screen.removePreference(mBtAddress);
- mBtAddress = null;
- }
-
- if (!hasWimax()) {
- screen.removePreference(mWimaxMacAddress);
- mWimaxMacAddress = null;
- }
-
- mConnectivityIntentFilter = new IntentFilter();
- for (String intent: CONNECTIVITY_INTENTS) {
- mConnectivityIntentFilter.addAction(intent);
- }
-
- updateConnectivity();
mSerialNumberPreferenceController.displayPreference(screen);
+ mUptimePreferenceController.displayPreference(screen);
+ mBluetoothAddressPreferenceController.displayPreference(screen);
+ mIpAddressPreferenceController.displayPreference(screen);
+ mWifiMacAddressPreferenceController.displayPreference(screen);
+ mImsStatusPreferenceController.displayPreference(screen);
// Remove SimStatus and Imei for Secondary user as it access Phone b/19165700
// Also remove on Wi-Fi only devices.
@@ -219,11 +114,8 @@ public class Status extends SettingsPreferenceFragment implements Indexable {
@Override
public void onResume() {
super.onResume();
- getContext().registerReceiver(mConnectivityReceiver, mConnectivityIntentFilter,
- android.Manifest.permission.CHANGE_NETWORK_STATE, null);
getContext().registerReceiver(mBatteryInfoReceiver,
new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
- mHandler.sendEmptyMessage(EVENT_UPDATE_STATS);
}
@Override
@@ -231,8 +123,6 @@ public class Status extends SettingsPreferenceFragment implements Indexable {
super.onPause();
getContext().unregisterReceiver(mBatteryInfoReceiver);
- getContext().unregisterReceiver(mConnectivityReceiver);
- mHandler.removeMessages(EVENT_UPDATE_STATS);
}
/**
@@ -246,96 +136,6 @@ public class Status extends SettingsPreferenceFragment implements Indexable {
}
}
- private void setWimaxStatus() {
- if (mWimaxMacAddress != null) {
- String macAddress = SystemProperties.get("net.wimax.mac.address", mUnavailable);
- mWimaxMacAddress.setSummary(macAddress);
- }
- }
-
- private void setWifiStatus() {
- WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
- boolean hasMacAddress = wifiInfo != null && wifiInfo.hasRealMacAddress();
- String macAddress = hasMacAddress ? wifiInfo.getMacAddress() : null;
- mWifiMacAddress.setSummary(!TextUtils.isEmpty(macAddress) ? macAddress : mUnavailable);
- }
-
- private void setIpAddressStatus() {
- String ipAddress = Utils.getDefaultIpAddresses(this.mCM);
- if (ipAddress != null) {
- mIpAddress.setSummary(ipAddress);
- } else {
- mIpAddress.setSummary(mUnavailable);
- }
- }
-
- private void setBtStatus() {
- BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();
- if (bluetooth != null && mBtAddress != null) {
- String address = bluetooth.isEnabled() ? bluetooth.getAddress() : null;
- if (!TextUtils.isEmpty(address)) {
- // Convert the address to lowercase for consistency with the wifi MAC address.
- mBtAddress.setSummary(address.toLowerCase());
- } else {
- mBtAddress.setSummary(mUnavailable);
- }
- }
- }
-
- private void setImsRegistrationStatus() {
- CarrierConfigManager configManager = (CarrierConfigManager)
- getSystemService(Context.CARRIER_CONFIG_SERVICE);
- int subId = SubscriptionManager.getDefaultDataSubscriptionId();
- PersistableBundle config = null;
- if (configManager != null) {
- config = configManager.getConfigForSubId(subId);
- }
- if (config != null && config.getBoolean(
- CarrierConfigManager.KEY_SHOW_IMS_REGISTRATION_STATUS_BOOL)) {
- TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
- mImsStatus.setSummary((tm != null && tm.isImsRegistered(subId)) ?
- R.string.ims_reg_status_registered : R.string.ims_reg_status_not_registered);
- } else {
- removePreferenceFromScreen(KEY_IMS_REGISTRATION_STATE);
- mImsStatus = null;
- }
- }
-
- void updateConnectivity() {
- setWimaxStatus();
- setWifiStatus();
- setBtStatus();
- setIpAddressStatus();
- setImsRegistrationStatus();
- }
-
- void updateTimes() {
- long at = SystemClock.uptimeMillis() / 1000;
- long ut = SystemClock.elapsedRealtime() / 1000;
-
- if (ut == 0) {
- ut = 1;
- }
-
- mUptime.setSummary(convert(ut));
- }
-
- private String pad(int n) {
- if (n >= 10) {
- return String.valueOf(n);
- } else {
- return "0" + String.valueOf(n);
- }
- }
-
- private String convert(long t) {
- int s = (int)(t % 60);
- int m = (int)((t / 60) % 60);
- int h = (int)((t / 3600));
-
- return h + ":" + pad(m) + ":" + pad(s);
- }
-
/**
* For Search.
*/
diff --git a/src/com/android/settings/deviceinfo/UptimePreferenceController.java b/src/com/android/settings/deviceinfo/UptimePreferenceController.java
new file mode 100644
index 0000000000..8bb0df75d6
--- /dev/null
+++ b/src/com/android/settings/deviceinfo/UptimePreferenceController.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2017 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.settings.deviceinfo;
+
+import android.content.Context;
+
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.deviceinfo.AbstractUptimePreferenceController;
+
+/**
+ * Concrete subclass of uptime preference controller
+ */
+public class UptimePreferenceController extends AbstractUptimePreferenceController
+ implements PreferenceControllerMixin {
+ public UptimePreferenceController(Context context, Lifecycle lifecycle) {
+ super(context, lifecycle);
+ }
+
+ // This space intentionally left blank
+}
diff --git a/src/com/android/settings/deviceinfo/WifiMacAddressPreferenceController.java b/src/com/android/settings/deviceinfo/WifiMacAddressPreferenceController.java
new file mode 100644
index 0000000000..92390d750e
--- /dev/null
+++ b/src/com/android/settings/deviceinfo/WifiMacAddressPreferenceController.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2017 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.settings.deviceinfo;
+
+import android.content.Context;
+
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.deviceinfo.AbstractWifiMacAddressPreferenceController;
+
+/**
+ * Concrete subclass of WIFI MAC address preference controller
+ */
+public class WifiMacAddressPreferenceController extends AbstractWifiMacAddressPreferenceController
+ implements PreferenceControllerMixin {
+ public WifiMacAddressPreferenceController(Context context, Lifecycle lifecycle) {
+ super(context, lifecycle);
+ }
+
+ // This space intentionally left blank
+}