Merge "Update the storage summary header."
This commit is contained in:
@@ -14,18 +14,23 @@
|
|||||||
limitations under the License.
|
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"
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:background="?android:attr/selectableItemBackground">
|
||||||
|
|
||||||
|
<LinearLayout android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:minHeight="?android:attr/listPreferredItemHeightSmall"
|
android:minHeight="?android:attr/listPreferredItemHeightSmall"
|
||||||
android:gravity="center_vertical"
|
android:gravity="center_vertical"
|
||||||
android:paddingStart="@dimen/preference_no_icon_padding_start"
|
android:paddingStart="@dimen/preference_no_icon_padding_start"
|
||||||
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
|
android:paddingEnd="@dimen/storage_summary_padding_end"
|
||||||
android:paddingTop="16dip"
|
android:paddingTop="16dip"
|
||||||
android:paddingBottom="16dip"
|
android:paddingBottom="16dip"
|
||||||
android:background="?android:attr/selectableItemBackground">
|
android:enabled="false">
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@android:id/title"
|
android:id="@android:id/title"
|
||||||
@@ -41,20 +46,29 @@
|
|||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@android:id/summary"
|
android:id="@android:id/summary"
|
||||||
|
android:layout_marginStart="4dp"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:textAlignment="viewStart"
|
android:textAlignment="viewStart"
|
||||||
android:textAppearance="@android:style/TextAppearance.Material.Body1"
|
android:textAppearance="@android:style/TextAppearance.Material.Body1"
|
||||||
android:maxLines="10" />
|
android:maxLines="10" />
|
||||||
|
|
||||||
<ProgressBar
|
<Button
|
||||||
android:id="@android:id/progress"
|
android:id="@+id/deletion_helper_button"
|
||||||
android:layout_width="match_parent"
|
android:theme="@style/FreeUpStorageButton"
|
||||||
android:layout_height="8dp"
|
android:layout_width="wrap_content"
|
||||||
android:layout_marginTop="16dp"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginBottom="8dp"
|
android:layout_below="@android:id/summary"
|
||||||
android:visibility="gone"
|
android:text="@string/storage_menu_free"/>
|
||||||
android:max="100"
|
</LinearLayout>
|
||||||
style="?android:attr/progressBarStyleHorizontal" />
|
|
||||||
|
<com.android.settings.widget.DonutView
|
||||||
|
android:id="@+id/donut"
|
||||||
|
android:layout_width="100dp"
|
||||||
|
android:layout_height="100dp"
|
||||||
|
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
|
||||||
|
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
|
||||||
|
android:minWidth="58dip"
|
||||||
|
android:gravity="end|center_vertical"/>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
@@ -111,6 +111,9 @@
|
|||||||
<!-- Gestures settings -->
|
<!-- Gestures settings -->
|
||||||
<color name="gestures_setting_background_color">#f5f5f5</color>
|
<color name="gestures_setting_background_color">#f5f5f5</color>
|
||||||
|
|
||||||
<!-- TODO: revert it after the SettingsShadowResources is globally finalized -->
|
|
||||||
<color name="status_bar_color">#3c3c3c</color>
|
<color name="status_bar_color">#3c3c3c</color>
|
||||||
|
|
||||||
|
<!-- Color for the background of the donut graph.-->
|
||||||
|
<color name="donut_background_grey">#ffd7d7d7</color>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -307,4 +307,7 @@
|
|||||||
<!-- Padding for the escalation card in normal dimens -->
|
<!-- Padding for the escalation card in normal dimens -->
|
||||||
<dimen name="support_escalation_card_padding_start">40dp</dimen>
|
<dimen name="support_escalation_card_padding_start">40dp</dimen>
|
||||||
<dimen name="support_escalation_card_padding_end">40dp</dimen>
|
<dimen name="support_escalation_card_padding_end">40dp</dimen>
|
||||||
|
|
||||||
|
<!-- Padding between the donut and the storage summary. -->
|
||||||
|
<dimen name="storage_summary_padding_end">16dp</dimen>
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -8019,4 +8019,14 @@
|
|||||||
<!-- Preference label for the Files storage section. [CHAR LIMIT=50] -->
|
<!-- Preference label for the Files storage section. [CHAR LIMIT=50] -->
|
||||||
<string name="storage_files">Files</string>
|
<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>
|
||||||
|
|
||||||
|
<!-- Summary of a single storage volume used space. [CHAR LIMIT=24] -->
|
||||||
|
<string name="storage_size_large_alternate"><xliff:g id="number" example="128">^1</xliff:g><small><small> <xliff:g id="unit" example="KB">^2</xliff:g> used</small></small></string>
|
||||||
|
<!-- Summary of a single storage volume free space. [CHAR LIMIT=48]-->
|
||||||
|
<string name="storage_volume_free"><xliff:g id="total" example="32GB">%1$s</xliff:g> free</string>
|
||||||
|
<!-- The percent of storage used by a storage volume. Exposed inside of a donut graph. [CHAR LIMIT=4]-->
|
||||||
|
<string name="storage_percent_used"><xliff:g id="percent" example="50%">%1$s</xliff:g>%%</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -437,4 +437,10 @@
|
|||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="AppActionPrimaryButton" parent="android:Widget.Material.Button.Colored"/>
|
<style name="AppActionPrimaryButton" parent="android:Widget.Material.Button.Colored"/>
|
||||||
|
|
||||||
|
<style name="FreeUpStorageButton">
|
||||||
|
<item name="android:buttonStyle">@android:style/Widget.Material.Button</item>
|
||||||
|
<item name="android:colorButtonNormal">#fff</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -46,7 +46,6 @@ public class StorageDashboardFragment extends DashboardFragment {
|
|||||||
private static final String TAG = "StorageDashboardFrag";
|
private static final String TAG = "StorageDashboardFrag";
|
||||||
|
|
||||||
private VolumeInfo mVolume;
|
private VolumeInfo mVolume;
|
||||||
private long mTotalSize;
|
|
||||||
|
|
||||||
private StorageSummaryDonutPreferenceController mSummaryController;
|
private StorageSummaryDonutPreferenceController mSummaryController;
|
||||||
private StorageItemPreferenceController mPreferenceController;
|
private StorageItemPreferenceController mPreferenceController;
|
||||||
@@ -70,16 +69,16 @@ public class StorageDashboardFragment extends DashboardFragment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
final long sharedDataSize = mVolume.getPath().getTotalSpace();
|
final long sharedDataSize = mVolume.getPath().getTotalSpace();
|
||||||
mTotalSize = sm.getPrimaryStorageSize();
|
long totalSize = sm.getPrimaryStorageSize();
|
||||||
long systemSize = mTotalSize - sharedDataSize;
|
long systemSize = totalSize - sharedDataSize;
|
||||||
|
|
||||||
if (mTotalSize <= 0) {
|
if (totalSize <= 0) {
|
||||||
mTotalSize = sharedDataSize;
|
totalSize = sharedDataSize;
|
||||||
systemSize = 0;
|
systemSize = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
final long usedBytes = mTotalSize - mVolume.getPath().getFreeSpace();
|
final long usedBytes = totalSize - mVolume.getPath().getFreeSpace();
|
||||||
mSummaryController.updateBytes(usedBytes, mTotalSize);
|
mSummaryController.updateBytes(usedBytes, totalSize);
|
||||||
mPreferenceController.setVolume(mVolume);
|
mPreferenceController.setVolume(mVolume);
|
||||||
mPreferenceController.setSystemSize(systemSize);
|
mPreferenceController.setSystemSize(systemSize);
|
||||||
mPreferenceController.startMeasurement();
|
mPreferenceController.startMeasurement();
|
||||||
@@ -90,8 +89,6 @@ public class StorageDashboardFragment extends DashboardFragment {
|
|||||||
pref.setFragment("com.android.settings.deletionhelper.AutomaticStorageManagerSettings");
|
pref.setFragment("com.android.settings.deletionhelper.AutomaticStorageManagerSettings");
|
||||||
pref.setIcon(R.drawable.ic_settings_storage);
|
pref.setIcon(R.drawable.ic_settings_storage);
|
||||||
pref.setEnabled(true);
|
pref.setEnabled(true);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -128,13 +125,6 @@ public class StorageDashboardFragment extends DashboardFragment {
|
|||||||
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.
|
||||||
*/
|
*/
|
||||||
|
@@ -17,20 +17,23 @@
|
|||||||
package com.android.settings.deviceinfo.storage;
|
package com.android.settings.deviceinfo.storage;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.storage.StorageManager;
|
||||||
import android.support.v7.preference.Preference;
|
import android.support.v7.preference.Preference;
|
||||||
import android.support.v7.preference.PreferenceViewHolder;
|
import android.support.v7.preference.PreferenceViewHolder;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
import android.util.MathUtils;
|
import android.util.MathUtils;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.ProgressBar;
|
import android.widget.Button;
|
||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
|
import com.android.settings.widget.DonutView;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* StorageSummaryDonutPreference is a preference which summarizes the used and remaining storage left
|
* 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.
|
* on a given storage volume. It is visualized with a donut graphing the % used.
|
||||||
*/
|
*/
|
||||||
public class StorageSummaryDonutPreference extends Preference {
|
public class StorageSummaryDonutPreference extends Preference implements View.OnClickListener {
|
||||||
private int mPercent = -1;
|
private int mPercent = -1;
|
||||||
|
|
||||||
public StorageSummaryDonutPreference(Context context) {
|
public StorageSummaryDonutPreference(Context context) {
|
||||||
@@ -55,17 +58,23 @@ public class StorageSummaryDonutPreference extends Preference {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onBindViewHolder(PreferenceViewHolder view) {
|
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);
|
super.onBindViewHolder(view);
|
||||||
|
final DonutView donut = (DonutView) view.findViewById(R.id.donut);
|
||||||
|
if (donut != null) {
|
||||||
|
donut.setPercentage(mPercent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final Button deletionHelperButton = (Button) view.findViewById(R.id.deletion_helper_button);
|
||||||
|
if (deletionHelperButton != null) {
|
||||||
|
deletionHelperButton.setOnClickListener(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
if (v != null && R.id.deletion_helper_button == v.getId()) {
|
||||||
|
Intent intent = new Intent(StorageManager.ACTION_MANAGE_STORAGE);
|
||||||
|
getContext().startActivity(intent);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,16 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* 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.storage;
|
package com.android.settings.deviceinfo.storage;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.os.storage.StorageManager;
|
||||||
|
import android.os.storage.VolumeInfo;
|
||||||
import android.support.v7.preference.Preference;
|
import android.support.v7.preference.Preference;
|
||||||
import android.support.v7.preference.PreferenceGroup;
|
|
||||||
import android.support.v7.preference.PreferenceScreen;
|
import android.support.v7.preference.PreferenceScreen;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.text.format.Formatter;
|
import android.text.format.Formatter;
|
||||||
import android.util.Log;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import com.android.settings.core.PreferenceController;
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
|
import com.android.settings.core.PreferenceController;
|
||||||
|
import com.android.settingslib.deviceinfo.StorageManagerVolumeProvider;
|
||||||
|
import com.android.settingslib.deviceinfo.StorageVolumeProvider;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* StorgaeSummaryPreferenceController updates the donut storage summary preference to have the
|
* StorgaeSummaryPreferenceController updates the donut storage summary preference to have the
|
||||||
@@ -37,12 +54,13 @@ public class StorageSummaryDonutPreferenceController extends PreferenceControlle
|
|||||||
StorageSummaryDonutPreference summary = (StorageSummaryDonutPreference) preference;
|
StorageSummaryDonutPreference summary = (StorageSummaryDonutPreference) preference;
|
||||||
final Formatter.BytesResult result = Formatter.formatBytes(mContext.getResources(),
|
final Formatter.BytesResult result = Formatter.formatBytes(mContext.getResources(),
|
||||||
mUsedBytes, 0);
|
mUsedBytes, 0);
|
||||||
summary.setTitle(TextUtils.expandTemplate(mContext.getText(R.string.storage_size_large),
|
summary.setTitle(TextUtils.expandTemplate(
|
||||||
result.value, result.units));
|
mContext.getText(R.string.storage_size_large_alternate), result.value,
|
||||||
summary.setSummary(mContext.getString(R.string.storage_volume_used,
|
result.units));
|
||||||
Formatter.formatFileSize(mContext, mTotalBytes)));
|
summary.setSummary(mContext.getString(R.string.storage_volume_free,
|
||||||
summary.setEnabled(true);
|
Formatter.formatFileSize(mContext, mTotalBytes - mUsedBytes)));
|
||||||
summary.setPercent(mUsedBytes, mTotalBytes);
|
summary.setPercent(mUsedBytes, mTotalBytes);
|
||||||
|
summary.setEnabled(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -50,11 +68,6 @@ public class StorageSummaryDonutPreferenceController extends PreferenceControlle
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean handlePreferenceTreeClick(Preference preference) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getPreferenceKey() {
|
public String getPreferenceKey() {
|
||||||
return "pref_summary";
|
return "pref_summary";
|
||||||
@@ -69,4 +82,20 @@ public class StorageSummaryDonutPreferenceController extends PreferenceControlle
|
|||||||
mUsedBytes = used;
|
mUsedBytes = used;
|
||||||
mTotalBytes = total;
|
mTotalBytes = total;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the state of the donut preference for the next update using volume to summarize.
|
||||||
|
* @param volume VolumeInfo to use to populate the informayion.
|
||||||
|
*/
|
||||||
|
public void updateSizes(StorageVolumeProvider svp, VolumeInfo volume) {
|
||||||
|
final long sharedDataSize = volume.getPath().getTotalSpace();
|
||||||
|
long totalSize = svp.getPrimaryStorageSize();
|
||||||
|
|
||||||
|
if (totalSize <= 0) {
|
||||||
|
totalSize = sharedDataSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
final long usedBytes = totalSize - volume.getPath().getFreeSpace();
|
||||||
|
updateBytes(usedBytes, totalSize);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
102
src/com/android/settings/widget/DonutView.java
Normal file
102
src/com/android/settings/widget/DonutView.java
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
/*
|
||||||
|
* 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.widget;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.graphics.Canvas;
|
||||||
|
import android.graphics.Paint;
|
||||||
|
import android.text.TextPaint;
|
||||||
|
import android.util.AttributeSet;
|
||||||
|
import android.view.View;
|
||||||
|
|
||||||
|
import com.android.settings.R;
|
||||||
|
import com.android.settings.Utils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DonutView represents a donut graph. It visualizes a certain percentage of fullness with a
|
||||||
|
* corresponding label with the fullness on the inside (i.e. "50%" inside of the donut.
|
||||||
|
*/
|
||||||
|
public class DonutView extends View {
|
||||||
|
private static final int TOP = -90;
|
||||||
|
private float mStrokeWidth;
|
||||||
|
private int mPercent;
|
||||||
|
private Paint mBackgroundCircle;
|
||||||
|
private Paint mFilledArc;
|
||||||
|
private TextPaint mTextPaint;
|
||||||
|
|
||||||
|
public DonutView(Context context) {
|
||||||
|
super(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DonutView(Context context, AttributeSet attrs) {
|
||||||
|
super(context, attrs);
|
||||||
|
float density = getResources().getDisplayMetrics().density;
|
||||||
|
mStrokeWidth = 10f * density;
|
||||||
|
|
||||||
|
mBackgroundCircle = new Paint();
|
||||||
|
mBackgroundCircle.setAntiAlias(true);
|
||||||
|
mBackgroundCircle.setStrokeCap(Paint.Cap.BUTT);
|
||||||
|
mBackgroundCircle.setStyle(Paint.Style.STROKE);
|
||||||
|
mBackgroundCircle.setStrokeWidth(mStrokeWidth);
|
||||||
|
mBackgroundCircle.setColor(getResources().getColor(R.color.donut_background_grey));
|
||||||
|
|
||||||
|
mFilledArc = new Paint();
|
||||||
|
mFilledArc.setAntiAlias(true);
|
||||||
|
mFilledArc.setStrokeCap(Paint.Cap.BUTT);
|
||||||
|
mFilledArc.setStyle(Paint.Style.STROKE);
|
||||||
|
mFilledArc.setStrokeWidth(mStrokeWidth);
|
||||||
|
mFilledArc.setColor(Utils.getColorAccent(getContext()));
|
||||||
|
|
||||||
|
mTextPaint = new TextPaint();
|
||||||
|
mTextPaint.setColor(Utils.getColorAccent(getContext()));
|
||||||
|
mTextPaint.setAntiAlias(true);
|
||||||
|
mTextPaint.setTextSize(18f * density);
|
||||||
|
mTextPaint.setTextAlign(Paint.Align.CENTER);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onDraw(Canvas canvas) {
|
||||||
|
super.onDraw(canvas);
|
||||||
|
canvas.drawArc(0 + mStrokeWidth, 0 + mStrokeWidth, getWidth() - mStrokeWidth,
|
||||||
|
getHeight() - mStrokeWidth, TOP, 360, false, mBackgroundCircle);
|
||||||
|
|
||||||
|
canvas.drawArc(0 + mStrokeWidth, 0 + mStrokeWidth, getWidth() - mStrokeWidth,
|
||||||
|
getHeight() - mStrokeWidth, TOP, (360 * mPercent / 100), false, mFilledArc);
|
||||||
|
|
||||||
|
int centerX = getWidth() / 2;
|
||||||
|
int centerY = getHeight() / 2;
|
||||||
|
|
||||||
|
String percentString =
|
||||||
|
String.format(getContext().getString(R.string.storage_percent_used), mPercent);
|
||||||
|
// drawText uses the Y dimension as the floor of the text, so we do this to center.
|
||||||
|
canvas.drawText(percentString, centerX,
|
||||||
|
centerY + getTextHeight(mTextPaint) / 2 - mTextPaint.descent(),
|
||||||
|
mTextPaint);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set a percentage full to have the donut graph.
|
||||||
|
*/
|
||||||
|
public void setPercentage(int percent) {
|
||||||
|
mPercent = percent;
|
||||||
|
invalidate();
|
||||||
|
}
|
||||||
|
|
||||||
|
private float getTextHeight(TextPaint paint) {
|
||||||
|
// Technically, this should be the cap height, but I can live with the descent - ascent.
|
||||||
|
return paint.descent() - paint.ascent();
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,94 @@
|
|||||||
|
/*
|
||||||
|
* 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.storage;
|
||||||
|
|
||||||
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.storage.VolumeInfo;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.widget.LinearLayout;
|
||||||
|
|
||||||
|
import com.android.settings.SettingsRobolectricTestRunner;
|
||||||
|
import com.android.settings.TestConfig;
|
||||||
|
import com.android.settingslib.deviceinfo.StorageVolumeProvider;
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
@RunWith(SettingsRobolectricTestRunner.class)
|
||||||
|
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
|
||||||
|
public class StorageSummaryDonutPreferenceControllerTest {
|
||||||
|
private static String KEY = "pref";
|
||||||
|
|
||||||
|
private Context mContext;
|
||||||
|
private StorageSummaryDonutPreferenceController mController;
|
||||||
|
private StorageSummaryDonutPreference mPreference;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
mContext = RuntimeEnvironment.application;
|
||||||
|
mController = new StorageSummaryDonutPreferenceController(mContext);
|
||||||
|
mPreference = new StorageSummaryDonutPreference(mContext);
|
||||||
|
|
||||||
|
LayoutInflater inflater = LayoutInflater.from(mContext);
|
||||||
|
inflater.inflate(mPreference.getLayoutResource(), new LinearLayout(mContext), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEmpty() throws Exception {
|
||||||
|
mController.updateBytes(0, 0);
|
||||||
|
mController.updateState(mPreference);
|
||||||
|
|
||||||
|
assertThat(mPreference.getTitle().toString()).isEqualTo("0.00B used");
|
||||||
|
assertThat(mPreference.getSummary().toString()).isEqualTo("0.00B free");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testUsedStorage() throws Exception {
|
||||||
|
mController.updateBytes(1024, 1024 * 10);
|
||||||
|
mController.updateState(mPreference);
|
||||||
|
|
||||||
|
assertThat(mPreference.getTitle().toString()).isEqualTo("1.00KB used");
|
||||||
|
assertThat(mPreference.getSummary().toString()).isEqualTo("9.00KB free");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPopulateWithVolume() throws Exception {
|
||||||
|
VolumeInfo volume = Mockito.mock(VolumeInfo.class);
|
||||||
|
File file = Mockito.mock(File.class);
|
||||||
|
StorageVolumeProvider svp = Mockito.mock(StorageVolumeProvider.class);
|
||||||
|
when(volume.getPath()).thenReturn(file);
|
||||||
|
when(file.getTotalSpace()).thenReturn(1024L * 10);
|
||||||
|
when(file.getFreeSpace()).thenReturn(1024L);
|
||||||
|
when(svp.getPrimaryStorageSize()).thenReturn(1024L * 10);
|
||||||
|
|
||||||
|
mController.updateSizes(svp, volume);
|
||||||
|
mController.updateState(mPreference);
|
||||||
|
|
||||||
|
assertThat(mPreference.getTitle().toString()).isEqualTo("9.00KB used");
|
||||||
|
assertThat(mPreference.getSummary().toString()).isEqualTo("1.00KB free");
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user