summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDianne Hackborn <hackbod@google.com>2014-07-23 13:38:41 -0700
committerDianne Hackborn <hackbod@google.com>2014-07-23 13:50:07 -0700
commitfe9590bb19e3acf6b68b67b40f43de8bc094d1b6 (patch)
treea4129ce41ed8c17e46bb2ad65e99e5ac532027b4
parentb125caa7ed29f1ecf5062452191d061fa890decb (diff)
downloadpackages_apps_Settings-fe9590bb19e3acf6b68b67b40f43de8bc094d1b6.zip
packages_apps_Settings-fe9590bb19e3acf6b68b67b40f43de8bc094d1b6.tar.gz
packages_apps_Settings-fe9590bb19e3acf6b68b67b40f43de8bc094d1b6.tar.bz2
Work on issue #16135174: Apps page "smoke" gradient footer must be removed
New header in running services. Not yet done. Change-Id: Ibe2f4145796c7863ec80e0ea2d8d87dc910bac7e
-rw-r--r--res/layout/manage_applications_apps.xml44
-rw-r--r--res/layout/running_processes_header.xml178
-rw-r--r--res/layout/running_processes_view.xml48
-rw-r--r--res/values/colors.xml4
-rw-r--r--res/values/strings.xml22
-rw-r--r--src/com/android/settings/applications/ManageApplications.java26
-rw-r--r--src/com/android/settings/applications/RunningProcessesView.java71
7 files changed, 248 insertions, 145 deletions
diff --git a/res/layout/manage_applications_apps.xml b/res/layout/manage_applications_apps.xml
index ce2b6c6..5bfdb69 100644
--- a/res/layout/manage_applications_apps.xml
+++ b/res/layout/manage_applications_apps.xml
@@ -39,50 +39,6 @@
android:text="@string/no_applications"
android:textAppearance="?android:attr/textAppearanceLarge" />
</FrameLayout>
- <!-- Force layout direction to LTR for now as we want the text to be at the same position in
- any Locale included the RTL ones. Will need to fix LinearColorBar RTL support later.
- Please also note the left/right gravities that would also need to be changed for proper
- RTL support -->
- <view class="com.android.settings.applications.LinearColorBar"
- android:id="@+id/storage_color_bar"
- android:layout_marginStart="@dimen/settings_side_margin"
- android:layout_marginEnd="@dimen/settings_side_margin"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="-5dp"
- android:orientation="horizontal"
- android:clipChildren="false"
- android:clipToPadding="false"
- android:paddingTop="30dp"
- android:paddingBottom="1dp"
- android:layoutDirection="ltr">
- <TextView android:id="@+id/usedStorageText"
- android:layout_width="0px"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:gravity="left"
- android:textAppearance="?android:attr/textAppearanceSmallInverse"
- android:textColor="#000"
- android:singleLine="true" />
- <TextView android:id="@+id/storageChartLabel"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="0"
- android:layout_marginTop="-20dp"
- android:textAppearance="?android:attr/textAppearanceSmallInverse"
- android:textColor="?android:attr/textColorPrimary"
- android:singleLine="true"
- android:text="@string/internal_storage" />
- <TextView android:id="@+id/freeStorageText"
- android:layout_gravity="center_vertical|end"
- android:layout_width="0px"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:gravity="right"
- android:textAppearance="?android:attr/textAppearanceSmallInverse"
- android:textColor="#000"
- android:singleLine="true" />
- </view>
</LinearLayout>
<LinearLayout android:id="@+id/loading_container"
diff --git a/res/layout/running_processes_header.xml b/res/layout/running_processes_header.xml
new file mode 100644
index 0000000..a5a2bc7
--- /dev/null
+++ b/res/layout/running_processes_header.xml
@@ -0,0 +1,178 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2014, 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.
+*/
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+ android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+ android:orientation="vertical">
+
+ <TextView
+ android:id="@+id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="8dp"
+ android:singleLine="true"
+ android:ellipsize="marquee"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textAlignment="viewStart"
+ android:text="@string/running_processes_header_title" />
+
+ <view class="com.android.settings.applications.LinearColorBar"
+ android:id="@+id/color_bar"
+ android:layout_width="match_parent"
+ android:layout_height="18sp"
+ android:layout_marginTop="8dp"
+ android:orientation="horizontal" />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="8dp"
+ android:orientation="horizontal"
+ android:baselineAligned="true">
+ <ImageView
+ android:layout_width="16sp"
+ android:layout_height="16sp"
+ android:scaleType="centerInside"
+ android:baselineAlignBottom="true"
+ android:src="@color/running_processes_system_ram"
+ android:contentDescription="@null" />
+ <TextView
+ android:id="@+id/systemSizePrefix"
+ android:text="@string/running_processes_header_system_prefix"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:layout_marginLeft="16dp"
+ android:maxLines="1" />
+ <ImageView
+ android:src="@drawable/dotted_line_480px"
+ android:layout_width="0dip"
+ android:layout_weight="1"
+ android:layout_height="1px"
+ android:layout_marginStart="1dip"
+ android:layout_marginEnd="1dip"
+ android:baselineAlignBottom="true"
+ android:scaleType="center"
+ android:contentDescription="@null" />
+ <TextView
+ android:id="@+id/systemSize"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:maxLines="1" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="4dp"
+ android:orientation="horizontal"
+ android:baselineAligned="true">
+ <ImageView
+ android:layout_width="16sp"
+ android:layout_height="16sp"
+ android:baselineAlignBottom="true"
+ android:scaleType="centerInside"
+ android:src="@color/running_processes_apps_ram"
+ android:contentDescription="@null" />
+ <TextView
+ android:id="@+id/appsSizePrefix"
+ android:text="@string/running_processes_header_apps_prefix"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:layout_marginLeft="16dp"
+ android:maxLines="1"
+ android:paddingTop="6dip" />
+ <ImageView
+ android:src="@drawable/dotted_line_480px"
+ android:layout_width="0dip"
+ android:layout_weight="1"
+ android:layout_height="1px"
+ android:baselineAlignBottom="true"
+ android:layout_marginStart="1dip"
+ android:layout_marginEnd="1dip"
+ android:scaleType="center"
+ android:contentDescription="@null" />
+ <TextView
+ android:id="@+id/appsSize"
+ android:paddingTop="6dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:maxLines="1" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="4dp"
+ android:orientation="horizontal"
+ android:baselineAligned="true">
+ <ImageView
+ android:layout_width="16sp"
+ android:layout_height="16sp"
+ android:baselineAlignBottom="true"
+ android:scaleType="centerInside"
+ android:src="@color/running_processes_free_ram"
+ android:contentDescription="@null" />
+ <TextView
+ android:id="@+id/freeSizePrefix"
+ android:text="@string/running_processes_header_free_prefix"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:layout_marginLeft="16dp"
+ android:maxLines="1"
+ android:paddingTop="6dip" />
+ <ImageView
+ android:src="@drawable/dotted_line_480px"
+ android:layout_width="0dip"
+ android:layout_weight="1"
+ android:layout_height="1px"
+ android:baselineAlignBottom="true"
+ android:layout_marginStart="1dip"
+ android:layout_marginEnd="1dip"
+ android:scaleType="center"
+ android:contentDescription="@null" />
+ <TextView
+ android:id="@+id/freeSize"
+ android:paddingTop="6dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:maxLines="1" />
+ </LinearLayout>
+
+ <TextView
+ android:id="@+id/listHeader"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="16dp"
+ android:layout_marginBottom="16dp"
+ android:singleLine="true"
+ android:ellipsize="marquee"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textAlignment="viewStart"
+ android:text="@string/running_processes_header_footer" />
+
+</LinearLayout>
diff --git a/res/layout/running_processes_view.xml b/res/layout/running_processes_view.xml
index 68967e4..19293ab 100644
--- a/res/layout/running_processes_view.xml
+++ b/res/layout/running_processes_view.xml
@@ -37,52 +37,4 @@
android:text="@string/no_running_services"
android:textAppearance="?android:attr/textAppearanceLarge" />
</FrameLayout>
- <!-- Force layout direction to LTR for now as we want the text to be at the same position in
- any Locale included the RTL ones. Will need to fix LinearColorBar RTL support later.
- Please also note the left/right gravities that would also need to be changed for proper
- RTL support -->
- <view class="com.android.settings.applications.LinearColorBar"
- android:id="@+id/color_bar"
- android:layout_marginStart="@dimen/settings_side_margin"
- android:layout_marginEnd="@dimen/settings_side_margin"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="-5dp"
- android:orientation="horizontal"
- android:clipChildren="false"
- android:clipToPadding="false"
- android:paddingTop="30dp"
- android:paddingStart="4dp"
- android:paddingEnd="4dp"
- android:paddingBottom="1dp"
- android:layoutDirection="ltr">
- <TextView android:id="@+id/foregroundText"
- android:layout_width="0px"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:focusable="true"
- android:gravity="left|bottom"
- android:textAppearance="?android:attr/textAppearanceSmallInverse"
- android:textColor="#000"
- android:singleLine="true" />
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="0"
- android:layout_marginTop="-20dp"
- android:textAppearance="?android:attr/textAppearanceSmallInverse"
- android:textColor="?android:attr/textColorPrimary"
- android:singleLine="true"
- android:text="@string/memory" />
- <TextView android:id="@+id/backgroundText"
- android:layout_gravity="center_vertical|end"
- android:layout_width="0px"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:focusable="true"
- android:gravity="right|bottom"
- android:textAppearance="?android:attr/textAppearanceSmallInverse"
- android:textColor="#000"
- android:singleLine="true" />
- </view>
</LinearLayout>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index d1e892e..2fbc591 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -56,6 +56,10 @@
<color name="unlock_pattern_view_success_color">@color/theme_accent</color>
<color name="unlock_pattern_view_error_color">#fff4511e</color>
+ <color name="running_processes_system_ram">#ff384248</color>
+ <color name="running_processes_apps_ram">#ff009587</color>
+ <color name="running_processes_free_ram">#ffced7db</color>
+
<!-- Palette colors referenced by top-level themes. -->
<color name="theme_primary">#ff263238</color>
<color name="theme_primary_dark">#ff21272b</color>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 77fd6de..cfb73b2 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -3096,6 +3096,28 @@
<!-- Descriptive text of a running process: plural process, plural service. -->
<string name="running_processes_item_description_p_p"><xliff:g id="numprocess">%1$d</xliff:g>
processes and <xliff:g id="numservices">%2$d</xliff:g> services</string>
+ <!-- [CHAR LIMIT=NONE] Top title of the header of the running processes/services list. -->
+ <string name="running_processes_header_title">Device memory</string>
+ <!-- [CHAR LIMIT=NONE] Bottom test of the header leading in to the running
+ processes/services list. -->
+ <string name="running_processes_header_footer">App RAM usage</string>
+ <!-- [CHAR LIMIT=20] Running processes/services header: prefix for line showing RAM
+ used by system. -->
+ <string name="running_processes_header_system_prefix">System</string>
+ <!-- [CHAR LIMIT=20] Running processes/services header: prefix for line showing RAM
+ used by apps. -->
+ <string name="running_processes_header_apps_prefix">Apps</string>
+ <!-- [CHAR LIMIT=20] Running processes/services header: prefix for line showing RAM
+ that is free. -->
+ <string name="running_processes_header_free_prefix">Free</string>
+ <!-- [CHAR LIMIT=20] Running processes/services header: prefix for line showing total RAM
+ used by everything. -->
+ <string name="running_processes_header_used_prefix">Used</string>
+ <!-- [CHAR LIMIT=20] Running processes/services header: prefix for line showing portion
+ of free RAM that is used by cached apps. -->
+ <string name="running_processes_header_cached_prefix">Cached</string>
+ <!-- [CHAR_LIMIT=20] Running processes/services header: formatter for RAM use amount. -->
+ <string name="running_processes_header_ram"><xliff:g id="ram">%1$s</xliff:g> of RAM</string>
<!-- Details about an application's running services. -->
<string name="runningservicedetails_settings_title">Running app</string>
diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java
index 48e2d5e..e40ad25 100644
--- a/src/com/android/settings/applications/ManageApplications.java
+++ b/src/com/android/settings/applications/ManageApplications.java
@@ -199,10 +199,10 @@ public class ManageApplications extends Fragment implements
// Custom view used to display running processes
private RunningProcessesView mRunningProcessesView;
- private LinearColorBar mColorBar;
- private TextView mStorageChartLabel;
- private TextView mUsedStorageText;
- private TextView mFreeStorageText;
+ //private LinearColorBar mColorBar;
+ //private TextView mStorageChartLabel;
+ //private TextView mUsedStorageText;
+ //private TextView mFreeStorageText;
private long mFreeStorage = 0, mAppStorage = 0, mTotalStorage = 0;
private long mLastUsedStorage, mLastAppStorage, mLastFreeStorage;
@@ -263,17 +263,17 @@ public class ManageApplications extends Fragment implements
mApplications = new ApplicationsAdapter(mApplicationsState, this, mFilter);
mListView.setAdapter(mApplications);
mListView.setRecyclerListener(mApplications);
- mColorBar = (LinearColorBar)mListContainer.findViewById(R.id.storage_color_bar);
- mStorageChartLabel = (TextView)mListContainer.findViewById(R.id.storageChartLabel);
- mUsedStorageText = (TextView)mListContainer.findViewById(R.id.usedStorageText);
- mFreeStorageText = (TextView)mListContainer.findViewById(R.id.freeStorageText);
+ //mColorBar = (LinearColorBar)mListContainer.findViewById(R.id.storage_color_bar);
+ //mStorageChartLabel = (TextView)mListContainer.findViewById(R.id.storageChartLabel);
+ //mUsedStorageText = (TextView)mListContainer.findViewById(R.id.usedStorageText);
+ //mFreeStorageText = (TextView)mListContainer.findViewById(R.id.freeStorageText);
Utils.prepareCustomPreferencesList(contentParent, contentChild, mListView, false);
if (mFilter == FILTER_APPS_SDCARD) {
- mStorageChartLabel.setText(mOwner.getActivity().getText(
- R.string.sd_card_storage));
+ //mStorageChartLabel.setText(mOwner.getActivity().getText(
+ // R.string.sd_card_storage));
} else {
- mStorageChartLabel.setText(mOwner.getActivity().getText(
- R.string.internal_storage));
+ //mStorageChartLabel.setText(mOwner.getActivity().getText(
+ // R.string.internal_storage));
}
applyCurrentStorage();
}
@@ -389,6 +389,7 @@ public class ManageApplications extends Fragment implements
if (mRootView == null) {
return;
}
+ /*
if (mTotalStorage > 0) {
BidiFormatter bidiFormatter = BidiFormatter.getInstance();
mColorBar.setRatios((mTotalStorage-mFreeStorage-mAppStorage)/(float)mTotalStorage,
@@ -419,6 +420,7 @@ public class ManageApplications extends Fragment implements
mFreeStorageText.setText("");
}
}
+ */
}
@Override
diff --git a/src/com/android/settings/applications/RunningProcessesView.java b/src/com/android/settings/applications/RunningProcessesView.java
index caa5450..d0da04b 100644
--- a/src/com/android/settings/applications/RunningProcessesView.java
+++ b/src/com/android/settings/applications/RunningProcessesView.java
@@ -16,6 +16,7 @@
package com.android.settings.applications;
+import android.content.res.Resources;
import android.text.BidiFormatter;
import com.android.internal.util.MemInfoReader;
import com.android.settings.R;
@@ -71,9 +72,11 @@ public class RunningProcessesView extends FrameLayout
RunningState.BaseItem mCurSelected;
ListView mListView;
+ View mHeader;
ServiceListAdapter mAdapter;
LinearColorBar mColorBar;
TextView mBackgroundProcessText;
+ TextView mAppsProcessText;
TextView mForegroundProcessText;
int mLastNumBackgroundProcesses = -1;
@@ -316,7 +319,7 @@ public class RunningProcessesView extends FrameLayout
void refreshUi(boolean dataChanged) {
if (dataChanged) {
- ServiceListAdapter adapter = (ServiceListAdapter)(mListView.getAdapter());
+ ServiceListAdapter adapter = mAdapter;
adapter.refreshItems();
adapter.notifyDataSetChanged();
}
@@ -338,38 +341,35 @@ public class RunningProcessesView extends FrameLayout
synchronized (mState.mLock) {
if (mLastNumBackgroundProcesses != mState.mNumBackgroundProcesses
|| mLastBackgroundProcessMemory != mState.mBackgroundProcessMemory
+ || mLastNumForegroundProcesses != mState.mNumForegroundProcesses
+ || mLastForegroundProcessMemory != mState.mForegroundProcessMemory
+ || mLastNumServiceProcesses != mState.mNumServiceProcesses
+ || mLastServiceProcessMemory != mState.mServiceProcessMemory
|| mLastAvailMemory != availMem) {
mLastNumBackgroundProcesses = mState.mNumBackgroundProcesses;
mLastBackgroundProcessMemory = mState.mBackgroundProcessMemory;
+ mLastForegroundProcessMemory = mState.mForegroundProcessMemory;
+ mLastServiceProcessMemory = mState.mServiceProcessMemory;
mLastAvailMemory = availMem;
long freeMem = mLastAvailMemory + mLastBackgroundProcessMemory;
BidiFormatter bidiFormatter = BidiFormatter.getInstance();
String sizeStr = bidiFormatter.unicodeWrap(
Formatter.formatShortFileSize(getContext(), freeMem));
mBackgroundProcessText.setText(getResources().getString(
- R.string.service_background_processes, sizeStr));
+ R.string.running_processes_header_ram, sizeStr));
sizeStr = bidiFormatter.unicodeWrap(
Formatter.formatShortFileSize(getContext(),
- mMemInfoReader.getTotalSize() - freeMem));
- mForegroundProcessText.setText(getResources().getString(
- R.string.service_foreground_processes, sizeStr));
- }
- if (mLastNumForegroundProcesses != mState.mNumForegroundProcesses
- || mLastForegroundProcessMemory != mState.mForegroundProcessMemory
- || mLastNumServiceProcesses != mState.mNumServiceProcesses
- || mLastServiceProcessMemory != mState.mServiceProcessMemory) {
- mLastNumForegroundProcesses = mState.mNumForegroundProcesses;
- mLastForegroundProcessMemory = mState.mForegroundProcessMemory;
- mLastNumServiceProcesses = mState.mNumServiceProcesses;
- mLastServiceProcessMemory = mState.mServiceProcessMemory;
- /*
- String sizeStr = Formatter.formatShortFileSize(getContext(),
- mLastForegroundProcessMemory + mLastServiceProcessMemory);
+ mLastForegroundProcessMemory + mLastServiceProcessMemory));
+ mAppsProcessText.setText(getResources().getString(
+ R.string.running_processes_header_ram, sizeStr));
+ sizeStr = bidiFormatter.unicodeWrap(
+ Formatter.formatShortFileSize(getContext(),
+ mMemInfoReader.getTotalSize() - freeMem
+ - mLastForegroundProcessMemory - mLastServiceProcessMemory));
mForegroundProcessText.setText(getResources().getString(
- R.string.service_foreground_processes, sizeStr));
- */
+ R.string.running_processes_header_ram, sizeStr));
}
-
+
float totalMem = mMemInfoReader.getTotalSize();
float totalShownMem = availMem + mLastBackgroundProcessMemory
+ mLastServiceProcessMemory;
@@ -428,27 +428,16 @@ public class RunningProcessesView extends FrameLayout
mListView.setRecyclerListener(this);
mAdapter = new ServiceListAdapter(mState);
mListView.setAdapter(mAdapter);
- mColorBar = (LinearColorBar)findViewById(R.id.color_bar);
- mBackgroundProcessText = (TextView)findViewById(R.id.backgroundText);
- mBackgroundProcessText.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mAdapter.setShowBackground(true);
- if (mOwner != null) {
- mOwner.getActivity().invalidateOptionsMenu();
- }
- }
- });
- mForegroundProcessText = (TextView)findViewById(R.id.foregroundText);
- mForegroundProcessText.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mAdapter.setShowBackground(false);
- if (mOwner != null) {
- mOwner.getActivity().invalidateOptionsMenu();
- }
- }
- });
+ mHeader = inflater.inflate(R.layout.running_processes_header, null);
+ mListView.addHeaderView(mHeader);
+ mColorBar = (LinearColorBar)mHeader.findViewById(R.id.color_bar);
+ Resources res = getResources();
+ mColorBar.setColors(res.getColor(R.color.running_processes_system_ram),
+ res.getColor(R.color.running_processes_apps_ram),
+ res.getColor(R.color.running_processes_free_ram));
+ mBackgroundProcessText = (TextView)mHeader.findViewById(R.id.freeSize);
+ mAppsProcessText = (TextView)mHeader.findViewById(R.id.appsSize);
+ mForegroundProcessText = (TextView)mHeader.findViewById(R.id.systemSize);
ActivityManager.MemoryInfo memInfo = new ActivityManager.MemoryInfo();
mAm.getMemoryInfo(memInfo);