2 * Copyright (C) 2012 The CyanogenMod Project
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package com.cyanogenmod.filemanager.ui.dialogs;
19 import android.app.AlertDialog;
20 import android.content.Context;
21 import android.content.DialogInterface;
22 import android.util.Log;
23 import android.view.LayoutInflater;
24 import android.view.View;
25 import android.view.View.OnClickListener;
26 import android.widget.Switch;
27 import android.widget.TextView;
29 import com.cyanogenmod.filemanager.FileManagerApplication;
30 import com.cyanogenmod.filemanager.R;
31 import com.cyanogenmod.filemanager.console.ConsoleBuilder;
32 import com.cyanogenmod.filemanager.model.DiskUsage;
33 import com.cyanogenmod.filemanager.model.MountPoint;
34 import com.cyanogenmod.filemanager.preferences.FileManagerSettings;
35 import com.cyanogenmod.filemanager.preferences.Preferences;
36 import com.cyanogenmod.filemanager.ui.widgets.DiskUsageGraph;
37 import com.cyanogenmod.filemanager.util.CommandHelper;
38 import com.cyanogenmod.filemanager.util.DialogHelper;
39 import com.cyanogenmod.filemanager.util.FileHelper;
40 import com.cyanogenmod.filemanager.util.MountPointHelper;
43 * A class that wraps a dialog for showing information about a mount point.<br />
44 * This class display information like mount point name, device name, size, type, ...
46 public class FilesystemInfoDialog implements OnClickListener {
49 * An interface to communicate when the user change the mount state
52 public interface OnMountListener {
54 * Method invoked when the mount state of a mount point has changed.
56 * @param mountPoint The mount point that has changed
58 void onRemount(MountPoint mountPoint);
63 private static final String TAG = "FilesystemInfoDialog"; //$NON-NLS-1$
65 private final MountPoint mMountPoint;
69 final DiskUsage mDiskUsage;
71 private final Context mContext;
72 private final AlertDialog mDialog;
73 private View mInfoViewTab;
74 private View mDiskUsageViewTab;
75 private View mInfoView;
76 private View mDiskUsageView;
77 private Switch mSwStatus;
81 DiskUsageGraph mDiskUsageGraph;
82 private TextView mInfoMsgView;
84 private OnMountListener mOnMountListener;
86 private boolean mIsMountAllowed;
87 private final boolean mIsAdvancedMode;
90 * Constructor of <code>FilesystemInfoDialog</code>.
92 * @param context The current context
93 * @param mountPoint The mount point information
94 * @param diskUsage The disk usage of the mount point
96 public FilesystemInfoDialog(Context context, MountPoint mountPoint, DiskUsage diskUsage) {
100 this.mContext = context;
103 this.mMountPoint = mountPoint;
104 this.mDiskUsage = diskUsage;
105 this.mIsMountAllowed = false;
106 this.mIsAdvancedMode = FileManagerApplication.isAdvancedMode();
108 //Inflate the content
110 (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
111 View contentView = li.inflate(R.layout.filesystem_info_dialog, null);
114 this.mDialog = DialogHelper.createDialog(
116 R.drawable.ic_holo_light_sdcard,
117 R.string.filesystem_info_dialog_title,
119 this.mDialog.setButton(
120 DialogInterface.BUTTON_NEGATIVE,
121 this.mContext.getString(android.R.string.cancel),
122 (DialogInterface.OnClickListener)null);
125 fillData(contentView);
129 * Method that shows the dialog.
136 * Method that sets the listener for listen mount events.
138 * @param onMountListener The mount listener
140 public void setOnMountListener(OnMountListener onMountListener) {
141 this.mOnMountListener = onMountListener;
145 * Method that fill the dialog with the data of the mount point.
147 * @param contentView The content view
149 @SuppressWarnings({ "boxing" })
150 private void fillData(View contentView) {
152 this.mInfoViewTab = contentView.findViewById(R.id.filesystem_info_dialog_tab_info);
153 this.mDiskUsageViewTab =
154 contentView.findViewById(R.id.filesystem_info_dialog_tab_disk_usage);
155 this.mInfoView = contentView.findViewById(R.id.filesystem_tab_info);
156 this.mDiskUsageView = contentView.findViewById(R.id.filesystem_tab_diskusage);
157 this.mDiskUsageGraph =
158 (DiskUsageGraph)contentView.findViewById(R.id.filesystem_disk_usage_graph);
160 // Set the user preference about free disk space warning level
161 String fds = Preferences.getSharedPreferences().getString(
162 FileManagerSettings.SETTINGS_DISK_USAGE_WARNING_LEVEL.getId(),
163 (String)FileManagerSettings.
164 SETTINGS_DISK_USAGE_WARNING_LEVEL.getDefaultValue());
165 this.mDiskUsageGraph.setFreeDiskSpaceWarningLevel(Integer.parseInt(fds));
167 //Register the listeners
168 this.mInfoViewTab.setOnClickListener(this);
169 this.mDiskUsageViewTab.setOnClickListener(this);
172 this.mSwStatus = (Switch)contentView.findViewById(R.id.filesystem_info_status);
173 this.mSwStatus.setOnClickListener(this);
174 TextView tvMountPoint =
175 (TextView)contentView.findViewById(R.id.filesystem_info_mount_point);
176 TextView tvDevice = (TextView)contentView.findViewById(R.id.filesystem_info_device);
177 TextView tvType = (TextView)contentView.findViewById(R.id.filesystem_info_type);
178 TextView tvOptions = (TextView)contentView.findViewById(R.id.filesystem_info_options);
179 TextView tvDumpPass = (TextView)contentView.findViewById(R.id.filesystem_info_dump_pass);
181 (TextView)contentView.findViewById(R.id.filesystem_info_total_disk_usage);
182 TextView tvUsed = (TextView)contentView.findViewById(R.id.filesystem_info_used_disk_usage);
183 TextView tvFree = (TextView)contentView.findViewById(R.id.filesystem_info_free_disk_usage);
184 this.mInfoMsgView = (TextView)contentView.findViewById(R.id.filesystem_info_msg);
186 //Fill the text views
187 tvMountPoint.setText(this.mMountPoint.getMountPoint());
188 tvDevice.setText(this.mMountPoint.getDevice());
189 tvType.setText(this.mMountPoint.getType());
190 tvOptions.setText(this.mMountPoint.getOptions());
192 String.format("%d / %d", //$NON-NLS-1$
193 this.mMountPoint.getDump(),
194 this.mMountPoint.getPass()));
195 if (this.mDiskUsage != null) {
196 tvTotal.setText(FileHelper.getHumanReadableSize(this.mDiskUsage.getTotal()));
197 tvUsed.setText(FileHelper.getHumanReadableSize(this.mDiskUsage.getUsed()));
198 tvFree.setText(FileHelper.getHumanReadableSize(this.mDiskUsage.getFree()));
200 tvTotal.setText("-"); //$NON-NLS-1$
201 tvUsed.setText("-"); //$NON-NLS-1$
202 tvFree.setText("-"); //$NON-NLS-1$
205 //Configure status switch
206 boolean hasPrivileged = false;
208 hasPrivileged = ConsoleBuilder.isPrivileged();
209 } catch (Throwable ex) {/**NON BLOCK**/}
210 boolean mountAllowed =
211 MountPointHelper.isMountAllowed(this.mMountPoint);
212 if (this.mIsAdvancedMode) {
215 this.mInfoMsgView.setText(
216 this.mContext.getString(
217 R.string.filesystem_info_cant_be_mounted_msg));
218 this.mInfoMsgView.setVisibility(View.VISIBLE);
221 this.mInfoMsgView.setVisibility(View.VISIBLE);
222 this.mInfoMsgView.setOnClickListener(this);
225 mountAllowed = false;
226 this.mInfoMsgView.setVisibility(View.GONE);
227 this.mInfoMsgView.setOnClickListener(null);
229 this.mIsMountAllowed = hasPrivileged && mountAllowed && this.mIsAdvancedMode;
230 this.mSwStatus.setEnabled(this.mIsMountAllowed);
231 this.mSwStatus.setChecked(MountPointHelper.isReadWrite(this.mMountPoint));
234 onClick(this.mInfoViewTab);
241 public void onClick(View v) {
243 case R.id.filesystem_info_dialog_tab_info:
244 if (!this.mInfoViewTab.isSelected()) {
245 this.mInfoViewTab.setSelected(true);
246 ((TextView)this.mInfoViewTab).setTextAppearance(
247 this.mContext, R.style.primary_text_appearance);
248 this.mDiskUsageViewTab.setSelected(false);
249 ((TextView)this.mDiskUsageViewTab).setTextAppearance(
250 this.mContext, R.style.secondary_text_appearance);
251 this.mInfoView.setVisibility(View.VISIBLE);
252 this.mDiskUsageView.setVisibility(View.GONE);
254 this.mInfoMsgView.setVisibility(
255 this.mIsMountAllowed || !this.mIsAdvancedMode ? View.GONE : View.VISIBLE);
258 case R.id.filesystem_info_dialog_tab_disk_usage:
259 if (!this.mDiskUsageViewTab.isSelected()) {
260 this.mInfoViewTab.setSelected(false);
261 ((TextView)this.mInfoViewTab).setTextAppearance(
262 this.mContext, R.style.secondary_text_appearance);
263 this.mDiskUsageViewTab.setSelected(true);
264 ((TextView)this.mDiskUsageViewTab).setTextAppearance(
265 this.mContext, R.style.primary_text_appearance);
266 this.mInfoView.setVisibility(View.GONE);
267 this.mDiskUsageView.setVisibility(View.VISIBLE);
269 this.mDiskUsageGraph.post(new Runnable() {
272 //Animate disk usage graph
273 FilesystemInfoDialog.this.mDiskUsageGraph.drawDiskUsage(
274 FilesystemInfoDialog.this.mDiskUsage);
279 case R.id.filesystem_info_status:
280 //Mount the filesystem
281 Switch sw = (Switch)v;
284 ret = CommandHelper.remount(
286 this.mMountPoint, sw.isChecked(), null);
287 //Hide warning message
288 this.mInfoMsgView.setVisibility(View.GONE);
289 //Communicate the mount change
290 if (this.mOnMountListener != null) {
291 this.mOnMountListener.onRemount(this.mMountPoint);
294 } catch (Throwable e) {
297 "Fail to remount %s", //$NON-NLS-1$
298 this.mMountPoint.getMountPoint()), e);
301 //Show warning message
302 this.mInfoMsgView.setText(R.string.filesystem_info_mount_failed_msg);
303 this.mInfoMsgView.setVisibility(View.VISIBLE);
304 sw.setChecked(!sw.isChecked());
308 case R.id.filesystem_info_msg:
310 boolean superuser = ConsoleBuilder.changeToPrivilegedConsole(this.mContext);
312 this.mInfoMsgView.setOnClickListener(null);
314 // Is filesystem able to be mounted?
315 boolean mountAllowed = MountPointHelper.isMountAllowed(this.mMountPoint);
317 this.mInfoMsgView.setVisibility(View.GONE);
318 this.mInfoMsgView.setBackground(null);
319 this.mSwStatus.setEnabled(true);
320 this.mIsMountAllowed = true;
325 this.mInfoMsgView.setText(
326 this.mContext.getString(
327 R.string.filesystem_info_cant_be_mounted_msg));
328 this.mInfoMsgView.setVisibility(View.VISIBLE);
329 this.mIsMountAllowed = false;