Add first pass at a new Storage screen.
This patch begins setting up the structure for the screen. The functionality for populating the data in the preferences is coming in a later patch. Bug: 33199077 Test: Settings Robo Tests Change-Id: I9ebad9d3896501e31ac715704ca986eceb36877d
This commit is contained in:
@@ -3090,7 +3090,7 @@
|
|||||||
</activity-alias>
|
</activity-alias>
|
||||||
|
|
||||||
<activity android:name=".Settings$StorageDashboardActivity"
|
<activity android:name=".Settings$StorageDashboardActivity"
|
||||||
android:label="@string/storage_settings"
|
android:label="@string/storage_settings_2"
|
||||||
android:icon="@drawable/ic_settings_storage">
|
android:icon="@drawable/ic_settings_storage">
|
||||||
<intent-filter android:priority="5">
|
<intent-filter android:priority="5">
|
||||||
<action android:name="com.android.settings.action.SETTINGS" />
|
<action android:name="com.android.settings.action.SETTINGS" />
|
||||||
@@ -3103,20 +3103,6 @@
|
|||||||
android:value="true" />
|
android:value="true" />
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<activity-alias android:name="InternalStorageDashboardAlias"
|
|
||||||
android:targetActivity="Settings$StorageSettingsActivity"
|
|
||||||
android:label="@string/storage_internal_title">
|
|
||||||
<intent-filter android:priority="5">
|
|
||||||
<action android:name="com.android.settings.action.SETTINGS" />
|
|
||||||
</intent-filter>
|
|
||||||
<meta-data android:name="com.android.settings.category"
|
|
||||||
android:value="com.android.settings.category.ia.storage" />
|
|
||||||
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
|
|
||||||
android:value="com.android.settings.deviceinfo.StorageSettings" />
|
|
||||||
<meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
|
|
||||||
android:value="true" />
|
|
||||||
</activity-alias>
|
|
||||||
|
|
||||||
<activity-alias android:name="SecurityDashboardAlias"
|
<activity-alias android:name="SecurityDashboardAlias"
|
||||||
android:targetActivity="Settings$SecuritySettingsActivity">
|
android:targetActivity="Settings$SecuritySettingsActivity">
|
||||||
<intent-filter android:priority="4">
|
<intent-filter android:priority="4">
|
||||||
|
56
res/layout/storage_item_alternate.xml
Normal file
56
res/layout/storage_item_alternate.xml
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Copyright (C) 2016 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:orientation="vertical"
|
||||||
|
android:minHeight="?android:attr/listPreferredItemHeightSmall"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:paddingStart="@dimen/preference_no_icon_padding_start"
|
||||||
|
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
|
||||||
|
android:paddingTop="16dip"
|
||||||
|
android:paddingBottom="16dip"
|
||||||
|
android:background="?android:attr/selectableItemBackground">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@android:id/title"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:textAppearance="@android:style/TextAppearance.Material.Subhead"
|
||||||
|
android:textAlignment="viewStart"
|
||||||
|
android:ellipsize="marquee"
|
||||||
|
android:fadingEdge="horizontal" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@android:id/summary"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textAlignment="viewStart"
|
||||||
|
android:textAppearance="@android:style/TextAppearance.Material.Body1"
|
||||||
|
android:textColor="?android:attr/textColorSecondaryNoDisable"
|
||||||
|
android:maxLines="10" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
60
res/layout/storage_summary_donut.xml
Normal file
60
res/layout/storage_summary_donut.xml
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Copyright (C) 2016 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- TODO: Update this view to not match the existing storage summary.-->
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:minHeight="?android:attr/listPreferredItemHeightSmall"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:paddingStart="@dimen/preference_no_icon_padding_start"
|
||||||
|
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
|
||||||
|
android:paddingTop="16dip"
|
||||||
|
android:paddingBottom="16dip"
|
||||||
|
android:background="?android:attr/selectableItemBackground">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@android:id/title"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:textAlignment="viewStart"
|
||||||
|
android:textAppearance="@android:style/TextAppearance.Material.Subhead"
|
||||||
|
android:textColor="?android:attr/colorAccent"
|
||||||
|
android:textSize="36sp"
|
||||||
|
android:ellipsize="marquee"
|
||||||
|
android:fadingEdge="horizontal" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@android:id/summary"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textAlignment="viewStart"
|
||||||
|
android:textAppearance="@android:style/TextAppearance.Material.Body1"
|
||||||
|
android:maxLines="10" />
|
||||||
|
|
||||||
|
<ProgressBar
|
||||||
|
android:id="@android:id/progress"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="8dp"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
android:layout_marginBottom="8dp"
|
||||||
|
android:visibility="gone"
|
||||||
|
android:max="100"
|
||||||
|
style="?android:attr/progressBarStyleHorizontal" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
@@ -7996,4 +7996,23 @@
|
|||||||
<string name="enterprise_privacy_security_logs">Your most recent security log</string>
|
<string name="enterprise_privacy_security_logs">Your most recent security log</string>
|
||||||
<!-- Label indicating that the date at which the admin last took a particular action was "never" (i.e. the admin never took the action so far). -->
|
<!-- Label indicating that the date at which the admin last took a particular action was "never" (i.e. the admin never took the action so far). -->
|
||||||
<string name="enterprise_privacy_never">Never</string>
|
<string name="enterprise_privacy_never">Never</string>
|
||||||
|
|
||||||
|
<!-- Preference label for the Photos & Videos storage section. [CHAR LIMIT=50] -->
|
||||||
|
<string name="storage_photos_videos">Photos & Videos</string>
|
||||||
|
|
||||||
|
<!-- Preference label for the Music & Audio storage section. [CHAR LIMIT=50] -->
|
||||||
|
<string name="storage_music_audio">Music & Audio</string>
|
||||||
|
|
||||||
|
<!-- Preference label for the Games storage section. [CHAR LIMIT=50] -->
|
||||||
|
<string name="storage_games">Games</string>
|
||||||
|
|
||||||
|
<!-- Preference label for the Other apps storage section. [CHAR LIMIT=50] -->
|
||||||
|
<string name="storage_other_apps">Other apps</string>
|
||||||
|
|
||||||
|
<!-- Preference label for the Files storage section. [CHAR LIMIT=50] -->
|
||||||
|
<string name="storage_files">Files</string>
|
||||||
|
|
||||||
|
<!-- Main settings screen item's title to go into the storage settings screen [CHAR LIMIT=25] -->
|
||||||
|
<string name="storage_settings_2" >Phone Storage</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -17,9 +17,36 @@
|
|||||||
<PreferenceScreen
|
<PreferenceScreen
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:title="@string/storage_settings">
|
android:title="@string/storage_settings">
|
||||||
<Preference
|
<com.android.settings.deviceinfo.storage.StorageSummaryDonutPreference
|
||||||
android:key="pref_manage_storage"
|
android:key="pref_summary" />
|
||||||
android:title="@string/storage_menu_manage"
|
<com.android.settings.deviceinfo.storage.StorageItemPreferenceAlternate
|
||||||
|
android:key="pref_photos_videos"
|
||||||
|
android:title="@string/storage_photos_videos"
|
||||||
android:fragment="com.android.settings.deletionhelper.AutomaticStorageManagerSettings">
|
android:fragment="com.android.settings.deletionhelper.AutomaticStorageManagerSettings">
|
||||||
</Preference>
|
</com.android.settings.deviceinfo.storage.StorageItemPreferenceAlternate>
|
||||||
|
<com.android.settings.deviceinfo.storage.StorageItemPreferenceAlternate
|
||||||
|
android:key="pref_music_audio"
|
||||||
|
android:title="@string/storage_music_audio"
|
||||||
|
android:fragment="com.android.settings.deletionhelper.AutomaticStorageManagerSettings">
|
||||||
|
</com.android.settings.deviceinfo.storage.StorageItemPreferenceAlternate>
|
||||||
|
<com.android.settings.deviceinfo.storage.StorageItemPreferenceAlternate
|
||||||
|
android:key="pref_games"
|
||||||
|
android:title="@string/storage_games"
|
||||||
|
android:fragment="com.android.settings.deletionhelper.AutomaticStorageManagerSettings">
|
||||||
|
</com.android.settings.deviceinfo.storage.StorageItemPreferenceAlternate>
|
||||||
|
<com.android.settings.deviceinfo.storage.StorageItemPreferenceAlternate
|
||||||
|
android:key="pref_other_apps"
|
||||||
|
android:title="@string/storage_other_apps"
|
||||||
|
android:fragment="com.android.settings.deletionhelper.AutomaticStorageManagerSettings">
|
||||||
|
</com.android.settings.deviceinfo.storage.StorageItemPreferenceAlternate>
|
||||||
|
<com.android.settings.deviceinfo.storage.StorageItemPreferenceAlternate
|
||||||
|
android:key="pref_system"
|
||||||
|
android:title="@string/storage_detail_system"
|
||||||
|
android:fragment="com.android.settings.deletionhelper.AutomaticStorageManagerSettings">
|
||||||
|
</com.android.settings.deviceinfo.storage.StorageItemPreferenceAlternate>
|
||||||
|
<com.android.settings.deviceinfo.storage.StorageItemPreferenceAlternate
|
||||||
|
android:key="pref_files"
|
||||||
|
android:title="@string/storage_files"
|
||||||
|
android:fragment="com.android.settings.deletionhelper.AutomaticStorageManagerSettings">
|
||||||
|
</com.android.settings.deviceinfo.storage.StorageItemPreferenceAlternate>
|
||||||
</PreferenceScreen>
|
</PreferenceScreen>
|
@@ -23,7 +23,7 @@ import com.android.settings.core.PreferenceController;
|
|||||||
|
|
||||||
public class ManageStoragePreferenceController extends PreferenceController {
|
public class ManageStoragePreferenceController extends PreferenceController {
|
||||||
|
|
||||||
public static final String KEY_MANAGE_STORAGE = "pref_manage_storage";
|
public static final String KEY_MANAGE_STORAGE = "footer_preference";
|
||||||
|
|
||||||
public ManageStoragePreferenceController(Context context) {
|
public ManageStoragePreferenceController(Context context) {
|
||||||
super(context);
|
super(context);
|
||||||
|
@@ -17,15 +17,24 @@
|
|||||||
package com.android.settings.deviceinfo;
|
package com.android.settings.deviceinfo;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.os.storage.StorageManager;
|
||||||
|
import android.os.storage.VolumeInfo;
|
||||||
import android.provider.SearchIndexableResource;
|
import android.provider.SearchIndexableResource;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
import com.android.internal.logging.nano.MetricsProto;
|
import com.android.internal.logging.nano.MetricsProto;
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.core.PreferenceController;
|
import com.android.settings.core.PreferenceController;
|
||||||
import com.android.settings.dashboard.DashboardFragment;
|
import com.android.settings.dashboard.DashboardFragment;
|
||||||
|
import com.android.settings.deviceinfo.storage.StorageItemPreferenceController;
|
||||||
|
import com.android.settings.deviceinfo.storage.StorageSummaryDonutPreferenceController;
|
||||||
import com.android.settings.overlay.FeatureFactory;
|
import com.android.settings.overlay.FeatureFactory;
|
||||||
import com.android.settings.search.BaseSearchIndexProvider;
|
import com.android.settings.search.BaseSearchIndexProvider;
|
||||||
import com.android.settings.search.Indexable;
|
import com.android.settings.search.Indexable;
|
||||||
|
import com.android.settings.widget.FooterPreference;
|
||||||
import com.android.settingslib.drawer.CategoryKey;
|
import com.android.settingslib.drawer.CategoryKey;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -33,9 +42,53 @@ import java.util.Arrays;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class StorageDashboardFragment extends DashboardFragment {
|
public class StorageDashboardFragment extends DashboardFragment {
|
||||||
|
|
||||||
private static final String TAG = "StorageDashboardFrag";
|
private static final String TAG = "StorageDashboardFrag";
|
||||||
|
|
||||||
|
private VolumeInfo mVolume;
|
||||||
|
private long mTotalSize;
|
||||||
|
|
||||||
|
private StorageSummaryDonutPreferenceController mSummaryController;
|
||||||
|
|
||||||
|
private boolean isVolumeValid() {
|
||||||
|
return (mVolume != null) && (mVolume.getType() == VolumeInfo.TYPE_PRIVATE)
|
||||||
|
&& mVolume.isMountedReadable();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle icicle) {
|
||||||
|
super.onCreate(icicle);
|
||||||
|
final Context context = getActivity();
|
||||||
|
|
||||||
|
// Initialize the storage sizes that we can quickly calc.
|
||||||
|
StorageManager sm = context.getSystemService(StorageManager.class);
|
||||||
|
mVolume = sm.findVolumeById(VolumeInfo.ID_PRIVATE_INTERNAL);
|
||||||
|
if (!isVolumeValid()) {
|
||||||
|
getActivity().finish();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final long sharedDataSize = mVolume.getPath().getTotalSpace();
|
||||||
|
mTotalSize = sm.getPrimaryStorageSize();
|
||||||
|
long systemSize = mTotalSize - sharedDataSize;
|
||||||
|
|
||||||
|
if (mTotalSize <= 0) {
|
||||||
|
mTotalSize = sharedDataSize;
|
||||||
|
systemSize = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
final long usedBytes = mTotalSize - mVolume.getPath().getFreeSpace();
|
||||||
|
mSummaryController.updateBytes(usedBytes, mTotalSize);
|
||||||
|
|
||||||
|
// Initialize the footer preference to go to the smart storage management.
|
||||||
|
final FooterPreference pref = mFooterPreferenceMixin.createFooterPreference();
|
||||||
|
pref.setTitle(R.string.storage_menu_manage);
|
||||||
|
pref.setFragment("com.android.settings.deletionhelper.AutomaticStorageManagerSettings");
|
||||||
|
pref.setIcon(R.drawable.ic_settings_storage);
|
||||||
|
pref.setEnabled(true);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getMetricsCategory() {
|
public int getMetricsCategory() {
|
||||||
return MetricsProto.MetricsEvent.SETTINGS_STORAGE_CATEGORY;
|
return MetricsProto.MetricsEvent.SETTINGS_STORAGE_CATEGORY;
|
||||||
@@ -59,10 +112,25 @@ public class StorageDashboardFragment extends DashboardFragment {
|
|||||||
@Override
|
@Override
|
||||||
protected List<PreferenceController> getPreferenceControllers(Context context) {
|
protected List<PreferenceController> getPreferenceControllers(Context context) {
|
||||||
final List<PreferenceController> controllers = new ArrayList<>();
|
final List<PreferenceController> controllers = new ArrayList<>();
|
||||||
|
mSummaryController = new StorageSummaryDonutPreferenceController(context);
|
||||||
|
controllers.add(mSummaryController);
|
||||||
controllers.add(new ManageStoragePreferenceController(context));
|
controllers.add(new ManageStoragePreferenceController(context));
|
||||||
|
controllers.add(new StorageItemPreferenceController(context, "pref_photos_videos"));
|
||||||
|
controllers.add(new StorageItemPreferenceController(context, "pref_music_audio"));
|
||||||
|
controllers.add(new StorageItemPreferenceController(context, "pref_games"));
|
||||||
|
controllers.add(new StorageItemPreferenceController(context, "pref_other_apps"));
|
||||||
|
controllers.add(new StorageItemPreferenceController(context, "pref_system"));
|
||||||
|
controllers.add(new StorageItemPreferenceController(context, "pref_files"));
|
||||||
return controllers;
|
return controllers;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||||
|
Bundle savedInstanceState) {
|
||||||
|
View root = super.onCreateView(inflater, container, savedInstanceState);
|
||||||
|
// TODO: Add loader to load the storage sizes for the StorageItemPreferenceControllers.
|
||||||
|
return root;
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* For Search.
|
* For Search.
|
||||||
*/
|
*/
|
||||||
|
@@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2011 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.storage;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.support.v7.preference.Preference;
|
||||||
|
import android.support.v7.preference.PreferenceViewHolder;
|
||||||
|
import android.text.format.Formatter;
|
||||||
|
import android.util.AttributeSet;
|
||||||
|
import android.view.View;
|
||||||
|
|
||||||
|
import com.android.settings.R;
|
||||||
|
|
||||||
|
public class StorageItemPreferenceAlternate extends Preference {
|
||||||
|
public StorageItemPreferenceAlternate(Context context) {
|
||||||
|
this(context, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public StorageItemPreferenceAlternate(Context context, AttributeSet attrs) {
|
||||||
|
super(context, attrs);
|
||||||
|
setLayoutResource(R.layout.storage_item_alternate);
|
||||||
|
setSummary(R.string.memory_calculating_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStorageSize(long size) {
|
||||||
|
setSummary(size == 0
|
||||||
|
? String.valueOf(0)
|
||||||
|
: Formatter.formatFileSize(getContext(), size));
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,69 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2016 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.storage;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.support.v7.preference.Preference;
|
||||||
|
|
||||||
|
import com.android.settings.core.PreferenceController;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* StorageItemPreferenceController handles the updating of a single storage preference line item.
|
||||||
|
*/
|
||||||
|
public class StorageItemPreferenceController extends PreferenceController {
|
||||||
|
private static final long NOT_YET_SET = -1;
|
||||||
|
private final String mKey;
|
||||||
|
private long mStorageSize;
|
||||||
|
|
||||||
|
public StorageItemPreferenceController(Context context, String key) {
|
||||||
|
super(context);
|
||||||
|
mKey = key;
|
||||||
|
mStorageSize = NOT_YET_SET;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAvailable() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean handlePreferenceTreeClick(Preference preference) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getPreferenceKey() {
|
||||||
|
return mKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateState(Preference preference) {
|
||||||
|
if (preference == null || mStorageSize == NOT_YET_SET) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
StorageItemPreferenceAlternate summary = (StorageItemPreferenceAlternate) preference;
|
||||||
|
summary.setStorageSize(mStorageSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the amount of bytes used by this storage item.
|
||||||
|
*/
|
||||||
|
public void setStorageSize(long size) {
|
||||||
|
mStorageSize = size;
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,71 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2016 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.storage;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.support.v7.preference.Preference;
|
||||||
|
import android.support.v7.preference.PreferenceViewHolder;
|
||||||
|
import android.util.AttributeSet;
|
||||||
|
import android.util.MathUtils;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.ProgressBar;
|
||||||
|
|
||||||
|
import com.android.settings.R;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* StorageSummaryDonutPreference is a preference which summarizes the used and remaining storage left
|
||||||
|
* on a given storage volume. It is visualized with a donut graphing the % used.
|
||||||
|
*/
|
||||||
|
public class StorageSummaryDonutPreference extends Preference {
|
||||||
|
private int mPercent = -1;
|
||||||
|
|
||||||
|
public StorageSummaryDonutPreference(Context context) {
|
||||||
|
this(context, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public StorageSummaryDonutPreference(Context context, AttributeSet attrs) {
|
||||||
|
super(context, attrs);
|
||||||
|
|
||||||
|
setLayoutResource(R.layout.storage_summary_donut);
|
||||||
|
setEnabled(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPercent(long usedBytes, long totalBytes) {
|
||||||
|
if (totalBytes == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
mPercent = MathUtils.constrain((int) ((usedBytes * 100) / totalBytes),
|
||||||
|
(usedBytes > 0) ? 1 : 0, 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBindViewHolder(PreferenceViewHolder view) {
|
||||||
|
// TODO: Replace the progress bar with a donut.
|
||||||
|
final ProgressBar progress = (ProgressBar) view.findViewById(android.R.id.progress);
|
||||||
|
if (mPercent != -1) {
|
||||||
|
progress.setVisibility(View.VISIBLE);
|
||||||
|
progress.setProgress(mPercent);
|
||||||
|
progress.setScaleY(7f);
|
||||||
|
} else {
|
||||||
|
progress.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
super.onBindViewHolder(view);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -0,0 +1,73 @@
|
|||||||
|
package com.android.settings.deviceinfo.storage;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.support.v7.preference.Preference;
|
||||||
|
import android.support.v7.preference.PreferenceGroup;
|
||||||
|
import android.support.v7.preference.PreferenceScreen;
|
||||||
|
import android.text.TextUtils;
|
||||||
|
import android.text.format.Formatter;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import com.android.settings.core.PreferenceController;
|
||||||
|
import com.android.settings.R;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* StorgaeSummaryPreferenceController updates the donut storage summary preference to have the
|
||||||
|
* correct sizes showing.
|
||||||
|
*/
|
||||||
|
public class StorageSummaryDonutPreferenceController extends PreferenceController {
|
||||||
|
private long mUsedBytes;
|
||||||
|
private long mTotalBytes;
|
||||||
|
|
||||||
|
public StorageSummaryDonutPreferenceController(Context context) {
|
||||||
|
super(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void displayPreference(PreferenceScreen screen) {
|
||||||
|
Log.d("dhnishi", "Preference displayed!");
|
||||||
|
StorageSummaryDonutPreference summary = (StorageSummaryDonutPreference)
|
||||||
|
screen.findPreference("pref_summary");
|
||||||
|
summary.setEnabled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateState(Preference preference) {
|
||||||
|
super.updateState(preference);
|
||||||
|
StorageSummaryDonutPreference summary = (StorageSummaryDonutPreference) preference;
|
||||||
|
final Formatter.BytesResult result = Formatter.formatBytes(mContext.getResources(),
|
||||||
|
mUsedBytes, 0);
|
||||||
|
summary.setTitle(TextUtils.expandTemplate(mContext.getText(R.string.storage_size_large),
|
||||||
|
result.value, result.units));
|
||||||
|
summary.setSummary(mContext.getString(R.string.storage_volume_used,
|
||||||
|
Formatter.formatFileSize(mContext, mTotalBytes)));
|
||||||
|
summary.setEnabled(true);
|
||||||
|
summary.setPercent(mUsedBytes, mTotalBytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAvailable() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean handlePreferenceTreeClick(Preference preference) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getPreferenceKey() {
|
||||||
|
return "pref_summary";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the state of the donut preference for the next update.
|
||||||
|
* @param used Total number of used bytes on the summarized volume.
|
||||||
|
* @param total Total number of bytes on the summarized volume.
|
||||||
|
*/
|
||||||
|
public void updateBytes(long used, long total) {
|
||||||
|
mUsedBytes = used;
|
||||||
|
mTotalBytes = total;
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,74 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2016 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 android.provider.SearchIndexableResource;
|
||||||
|
|
||||||
|
import com.android.settings.SettingsRobolectricTestRunner;
|
||||||
|
import com.android.settings.TestConfig;
|
||||||
|
import com.android.settings.testutils.FakeFeatureFactory;
|
||||||
|
import com.android.settingslib.drawer.CategoryKey;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.mockito.Answers;
|
||||||
|
import org.mockito.Mock;
|
||||||
|
import org.mockito.MockitoAnnotations;
|
||||||
|
import org.robolectric.annotation.Config;
|
||||||
|
import org.robolectric.shadows.ShadowApplication;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
@RunWith(SettingsRobolectricTestRunner.class)
|
||||||
|
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
|
||||||
|
public class StorageDashboardFragmentTest {
|
||||||
|
|
||||||
|
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
|
||||||
|
private Context mContext;
|
||||||
|
|
||||||
|
private StorageDashboardFragment mFragment;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() {
|
||||||
|
MockitoAnnotations.initMocks(this);
|
||||||
|
FakeFeatureFactory.setupForTest(mContext);
|
||||||
|
final FakeFeatureFactory factory =
|
||||||
|
(FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
|
||||||
|
when(factory.dashboardFeatureProvider.isEnabled()).thenReturn(true);
|
||||||
|
mFragment = new StorageDashboardFragment();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCategory_isConnectedDevice() {
|
||||||
|
assertThat(mFragment.getCategoryKey()).isEqualTo(CategoryKey.CATEGORY_STORAGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSearchIndexProvider_shouldIndexResource() {
|
||||||
|
final List<SearchIndexableResource> indexRes =
|
||||||
|
StorageDashboardFragment.SEARCH_INDEX_DATA_PROVIDER.getXmlResourcesToIndex(
|
||||||
|
ShadowApplication.getInstance().getApplicationContext(),
|
||||||
|
true /* enabled */);
|
||||||
|
|
||||||
|
assertThat(indexRes).isNotNull();
|
||||||
|
assertThat(indexRes.get(0).xmlResId).isEqualTo(mFragment.getPreferenceScreenResId());
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,56 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2016 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.storage;
|
||||||
|
|
||||||
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import com.android.settings.R;
|
||||||
|
import com.android.settings.SettingsRobolectricTestRunner;
|
||||||
|
import com.android.settings.TestConfig;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.robolectric.RuntimeEnvironment;
|
||||||
|
import org.robolectric.annotation.Config;
|
||||||
|
|
||||||
|
|
||||||
|
@RunWith(SettingsRobolectricTestRunner.class)
|
||||||
|
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
|
||||||
|
public class StorageItemPreferenceAlternateTest {
|
||||||
|
private Context mContext;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
mContext = RuntimeEnvironment.application;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testBeforeLoad() {
|
||||||
|
StorageItemPreferenceAlternate pref = new StorageItemPreferenceAlternate(mContext);
|
||||||
|
assertThat(((String) pref.getSummary())).isEqualTo(
|
||||||
|
mContext.getString(R.string.memory_calculating_size));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAfterLoad() {
|
||||||
|
StorageItemPreferenceAlternate pref = new StorageItemPreferenceAlternate(mContext);
|
||||||
|
pref.setStorageSize(1024L);
|
||||||
|
assertThat(((String) pref.getSummary())).isEqualTo("1.00KB");
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,79 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2016 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.storage;
|
||||||
|
|
||||||
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.support.v7.preference.Preference;
|
||||||
|
import android.support.v7.preference.PreferenceViewHolder;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.LinearLayout;
|
||||||
|
|
||||||
|
import com.android.settings.SettingsRobolectricTestRunner;
|
||||||
|
import com.android.settings.TestConfig;
|
||||||
|
import com.android.settings.deviceinfo.StorageItemPreference;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.mockito.Mockito;
|
||||||
|
import org.robolectric.RuntimeEnvironment;
|
||||||
|
import org.robolectric.annotation.Config;
|
||||||
|
|
||||||
|
@RunWith(SettingsRobolectricTestRunner.class)
|
||||||
|
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
|
||||||
|
public class StorageItemPreferenceControllerTest {
|
||||||
|
private static final String KEY = "pref";
|
||||||
|
private Context mContext;
|
||||||
|
private StorageItemPreferenceController mController;
|
||||||
|
private PreferenceViewHolder mHolder;
|
||||||
|
private StorageItemPreferenceAlternate mPreference;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
mContext = RuntimeEnvironment.application;
|
||||||
|
mController = new StorageItemPreferenceController(mContext, KEY);
|
||||||
|
mPreference = new StorageItemPreferenceAlternate(mContext);
|
||||||
|
|
||||||
|
// Inflate the preference and the widget.
|
||||||
|
LayoutInflater inflater = LayoutInflater.from(mContext);
|
||||||
|
final View view = inflater.inflate(mPreference.getLayoutResource(),
|
||||||
|
new LinearLayout(mContext), false);
|
||||||
|
|
||||||
|
mHolder = new PreferenceViewHolder(view);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetKey() {
|
||||||
|
assertThat(mController.getPreferenceKey()).isEqualTo(KEY);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testUpdateStateWithInitialState() {
|
||||||
|
mController.updateState(mPreference);
|
||||||
|
assertThat(mPreference.getSummary().toString()).isEqualTo("Calculating…");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPreferenceShouldUpdateAfterPopulatingData() {
|
||||||
|
mController.setStorageSize(1024L);
|
||||||
|
mController.updateState(mPreference);
|
||||||
|
assertThat(mPreference.getSummary().toString()).isEqualTo("1.00KB");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user