121809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori/*
221809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori * Copyright (C) 2010 The Android Open Source Project
321809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori *
421809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori * Licensed under the Apache License, Version 2.0 (the "License");
521809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori * you may not use this file except in compliance with the License.
621809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori * You may obtain a copy of the License at
721809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori *
821809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori *      http://www.apache.org/licenses/LICENSE-2.0
921809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori *
1021809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori * Unless required by applicable law or agreed to in writing, software
1121809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori * distributed under the License is distributed on an "AS IS" BASIS,
1221809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1321809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori * See the License for the specific language governing permissions and
1421809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori * limitations under the License.
1521809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori */
1621809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori
1721809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Noripackage com.android.settings.deviceinfo;
1821809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori
19104ea2873dff5fa3a5f6bd4cfdb893bac3527fdfGilles Debunneimport android.app.Activity;
2021809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Noriimport android.app.ListActivity;
2121809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Noriimport android.content.Context;
2221809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Noriimport android.os.Bundle;
23104ea2873dff5fa3a5f6bd4cfdb893bac3527fdfGilles Debunneimport android.os.storage.StorageVolume;
2421809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Noriimport android.text.format.Formatter;
2521809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Noriimport android.util.Log;
2621809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Noriimport android.util.SparseBooleanArray;
2721809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Noriimport android.view.ActionMode;
2821809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Noriimport android.view.LayoutInflater;
2921809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Noriimport android.view.Menu;
3021809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Noriimport android.view.MenuInflater;
3121809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Noriimport android.view.MenuItem;
3221809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Noriimport android.view.View;
3321809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Noriimport android.view.View.OnClickListener;
3421809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Noriimport android.view.View.OnLongClickListener;
3521809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Noriimport android.view.ViewGroup;
3621809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Noriimport android.widget.BaseAdapter;
3721809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Noriimport android.widget.CompoundButton;
3821809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Noriimport android.widget.CompoundButton.OnCheckedChangeListener;
3921809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Noriimport android.widget.ListView;
4021809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori
41104ea2873dff5fa3a5f6bd4cfdb893bac3527fdfGilles Debunneimport com.android.settings.R;
42104ea2873dff5fa3a5f6bd4cfdb893bac3527fdfGilles Debunneimport com.android.settings.deviceinfo.StorageMeasurement.FileInfo;
43104ea2873dff5fa3a5f6bd4cfdb893bac3527fdfGilles Debunne
4421809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Noriimport java.io.File;
4521809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Noriimport java.util.ArrayList;
4621809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Noriimport java.util.List;
4721809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori
4821809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori/**
4921809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori * This class handles the selection and removal of Misc files.
5021809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori */
5121809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Noripublic class MiscFilesHandler extends ListActivity {
5221809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori    private static final String TAG = "MemorySettings";
538128ff8cbe239c1d50f8ba12cf375c754862df0aVasu Nori    private String mNumSelectedFormat;
548128ff8cbe239c1d50f8ba12cf375c754862df0aVasu Nori    private String mNumBytesSelectedFormat;
5521809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori    private MemoryMearurementAdapter mAdapter;
5621809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori    private LayoutInflater mInflater;
5721809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori
5821809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori    @Override
5921809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori    public void onCreate(Bundle savedInstanceState) {
6021809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        super.onCreate(savedInstanceState);
6121809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        setFinishOnTouchOutside(true);
6221809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        setTitle(R.string.misc_files);
638128ff8cbe239c1d50f8ba12cf375c754862df0aVasu Nori        mNumSelectedFormat = getString(R.string.misc_files_selected_count);
648128ff8cbe239c1d50f8ba12cf375c754862df0aVasu Nori        mNumBytesSelectedFormat = getString(R.string.misc_files_selected_count_bytes);
6521809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        mAdapter = new MemoryMearurementAdapter(this);
6621809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
6721809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        setContentView(R.layout.settings_storage_miscfiles_list);
6821809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        ListView lv = getListView();
6921809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        lv.setItemsCanFocus(true);
7021809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
7121809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        lv.setMultiChoiceModeListener(new ModeCallback(this));
7221809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        setListAdapter(mAdapter);
7321809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori    }
7421809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori
7521809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori    private class ModeCallback implements ListView.MultiChoiceModeListener {
7621809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        private int mDataCount;
7721809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        private final Context mContext;
7821809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori
7921809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        public ModeCallback(Context context) {
8021809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            mContext = context;
8121809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            mDataCount = mAdapter.getCount();
8221809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        }
8321809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori
8421809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
8521809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            final MenuInflater inflater = getMenuInflater();
8621809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            inflater.inflate(R.menu.misc_files_menu, menu);
8721809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            return true;
8821809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        }
8921809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori
9021809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
9121809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            return true;
9221809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        }
9321809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori
9421809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
9521809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            ListView lv = getListView();
9621809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            switch (item.getItemId()) {
9721809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            case R.id.action_delete:
9821809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                // delete the files selected
9921809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                SparseBooleanArray checkedItems = lv.getCheckedItemPositions();
10021809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                int checkedCount = getListView().getCheckedItemCount();
10121809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                if (checkedCount > mDataCount) {
10221809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                    throw new IllegalStateException("checked item counts do not match. " +
10321809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                            "checkedCount: " + checkedCount + ", dataSize: " + mDataCount);
10421809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                }
10521809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                if (mDataCount > 0) {
10621809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                    ArrayList<Object> toRemove = new ArrayList<Object>();
10721809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                    for (int i = 0; i < mDataCount; i++) {
10821809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                        if (!checkedItems.get(i)) {
10921809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                            //item not selected
11021809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                            continue;
11121809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                        }
112104ea2873dff5fa3a5f6bd4cfdb893bac3527fdfGilles Debunne                        if (StorageMeasurement.LOGV) {
11321809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                            Log.i(TAG, "deleting: " + mAdapter.getItem(i));
11421809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                        }
11521809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                        // delete the file
11621809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                        File file = new File(mAdapter.getItem(i).mFileName);
11721809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                        if (file.isDirectory()) {
11821809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                            deleteDir(file);
11921809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                        } else {
12021809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                            file.delete();
12121809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                        }
12221809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                        toRemove.add(mAdapter.getItem(i));
12321809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                    }
12421809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                    mAdapter.removeAll(toRemove);
12521809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                    mAdapter.notifyDataSetChanged();
12621809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                    mDataCount = mAdapter.getCount();
12721809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                }
12821809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                mode.finish();
12921809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                break;
13021809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori
13121809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            case R.id.action_select_all:
13221809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                // check ALL items
13321809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                for (int i = 0; i < mDataCount; i++) {
13421809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                    lv.setItemChecked(i, true);
13521809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                }
13621809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                // update the title and subtitle with number selected and numberBytes selected
13721809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                onItemCheckedStateChanged(mode, 1, 0, true);
13821809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                break;
13921809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            }
14021809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            return true;
14121809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        }
14221809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori
14321809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        // Deletes all files and subdirectories under given dir.
14421809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        // Returns true if all deletions were successful.
14521809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        // If a deletion fails, the method stops attempting to delete and returns false.
14621809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        private boolean deleteDir(File dir) {
147aee4b75abac61a9e2755eba27fea9d344e6ae80aPredrag Stanojevic            String[] children = dir.list();
148aee4b75abac61a9e2755eba27fea9d344e6ae80aPredrag Stanojevic            if (children != null) {
14921809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                for (int i=0; i < children.length; i++) {
15021809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                    boolean success = deleteDir(new File(dir, children[i]));
15121809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                    if (!success) {
15221809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                        return false;
15321809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                    }
15421809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                }
15521809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            }
15621809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            // The directory is now empty so delete it
15721809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            return dir.delete();
15821809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        }
15921809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori
16021809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        public void onDestroyActionMode(ActionMode mode) {
161104ea2873dff5fa3a5f6bd4cfdb893bac3527fdfGilles Debunne            // This block intentionally left blank
16221809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        }
16321809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori
16421809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        public void onItemCheckedStateChanged(ActionMode mode, int position, long id,
16521809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                boolean checked) {
16621809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            ListView lv = getListView();
16721809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            int numChecked = lv.getCheckedItemCount();
1688128ff8cbe239c1d50f8ba12cf375c754862df0aVasu Nori            mode.setTitle(String.format(mNumSelectedFormat, numChecked, mAdapter.getCount()));
16921809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori
17021809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            // total the sizes of all items selected so far
17121809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            SparseBooleanArray checkedItems = lv.getCheckedItemPositions();
17221809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            long selectedDataSize = 0;
17321809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            if (numChecked > 0) {
17421809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                for (int i = 0; i < mDataCount; i++) {
17521809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                    if (checkedItems.get(i)) {
17621809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                        // item is checked
17721809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                        selectedDataSize += mAdapter.getItem(i).mSize;
17821809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                    }
17921809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                }
18021809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            }
1818128ff8cbe239c1d50f8ba12cf375c754862df0aVasu Nori            mode.setSubtitle(String.format(mNumBytesSelectedFormat,
1828128ff8cbe239c1d50f8ba12cf375c754862df0aVasu Nori                    Formatter.formatFileSize(mContext, selectedDataSize),
1838128ff8cbe239c1d50f8ba12cf375c754862df0aVasu Nori                    Formatter.formatFileSize(mContext, mAdapter.getDataSize())));
18421809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        }
18521809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori    }
18621809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori
187104ea2873dff5fa3a5f6bd4cfdb893bac3527fdfGilles Debunne    class MemoryMearurementAdapter extends BaseAdapter {
188104ea2873dff5fa3a5f6bd4cfdb893bac3527fdfGilles Debunne        private ArrayList<StorageMeasurement.FileInfo> mData = null;
18921809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        private long mDataSize = 0;
19021809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        private Context mContext;
19121809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori
192104ea2873dff5fa3a5f6bd4cfdb893bac3527fdfGilles Debunne        public MemoryMearurementAdapter(Activity activity) {
193104ea2873dff5fa3a5f6bd4cfdb893bac3527fdfGilles Debunne            mContext = activity;
1946d36fd3a03299b9b1bdaaceef2bfaa8714c3fa72Gilles Debunne            final StorageVolume storageVolume = activity.getIntent().getParcelableExtra(
1956d36fd3a03299b9b1bdaaceef2bfaa8714c3fa72Gilles Debunne                    StorageVolume.EXTRA_STORAGE_VOLUME);
19690c8b20ccfd8f2e877bfac7cf3e883631af7a3e3Jeff Sharkey            StorageMeasurement mMeasurement = StorageMeasurement.getInstance(
197da13ec0cb454f1aadada2acf12291cfaf0a7b176Jeff Sharkey                    activity, storageVolume);
1986d36fd3a03299b9b1bdaaceef2bfaa8714c3fa72Gilles Debunne            if (mMeasurement == null) return;
199104ea2873dff5fa3a5f6bd4cfdb893bac3527fdfGilles Debunne            mData = (ArrayList<StorageMeasurement.FileInfo>) mMeasurement.mFileInfoForMisc;
20021809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            if (mData != null) {
201104ea2873dff5fa3a5f6bd4cfdb893bac3527fdfGilles Debunne                for (StorageMeasurement.FileInfo info : mData) {
20221809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                    mDataSize += info.mSize;
20321809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                }
20421809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            }
20521809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        }
20621809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori
20721809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        @Override
20821809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        public int getCount() {
20921809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            return (mData == null) ? 0 : mData.size();
21021809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        }
21121809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori
21221809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        @Override
213104ea2873dff5fa3a5f6bd4cfdb893bac3527fdfGilles Debunne        public StorageMeasurement.FileInfo getItem(int position) {
21421809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            if (mData == null || mData.size() <= position) {
21521809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                return null;
21621809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            }
21721809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            return mData.get(position);
21821809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        }
21921809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori
22021809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        @Override
22121809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        public long getItemId(int position) {
22221809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            if (mData == null || mData.size() <= position) {
22321809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                return 0;
22421809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            }
22521809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            return mData.get(position).mId;
22621809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        }
227104ea2873dff5fa3a5f6bd4cfdb893bac3527fdfGilles Debunne
22821809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        public void removeAll(List<Object> objs) {
22921809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            if (mData == null) {
23021809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                return;
23121809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            }
23221809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            for (Object o : objs) {
23321809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                mData.remove(o);
234104ea2873dff5fa3a5f6bd4cfdb893bac3527fdfGilles Debunne                mDataSize -= ((StorageMeasurement.FileInfo) o).mSize;
23521809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            }
23621809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        }
23721809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori
23821809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        public long getDataSize() {
23921809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            return mDataSize;
24021809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        }
24121809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori
24221809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        @Override
24321809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        public void notifyDataSetChanged() {
24421809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            super.notifyDataSetChanged();
24521809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        }
24621809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori
24721809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        @Override
24821809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        public View getView(int position, View convertView, ViewGroup parent) {
24921809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            final FileItemInfoLayout view = (convertView == null) ?
25021809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                    (FileItemInfoLayout) mInflater.inflate(R.layout.settings_storage_miscfiles,
25121809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                            parent, false) : (FileItemInfoLayout) convertView;
25221809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            FileInfo item = getItem(position);
25321809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            view.setFileName(item.mFileName);
25421809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            view.setFileSize(Formatter.formatFileSize(mContext, item.mSize));
25521809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            final ListView listView = (ListView) parent;
25621809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            final int listPosition = position;
25721809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            view.getCheckBox().setOnCheckedChangeListener(new OnCheckedChangeListener() {
25821809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori
25921809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                @Override
26021809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
26121809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                    listView.setItemChecked(listPosition, isChecked);
26221809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                }
26321809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori
26421809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            });
26521809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            view.setOnLongClickListener(new OnLongClickListener() {
26621809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                @Override
26721809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                public boolean onLongClick(View v) {
26821809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                    if (listView.getCheckedItemCount() > 0) {
26921809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                        return false;
27021809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                    }
27121809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                    listView.setItemChecked(listPosition, !view.isChecked());
27221809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                    return true;
27321809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                }
27421809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            });
27521809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            view.setOnClickListener(new OnClickListener() {
27621809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                @Override
27721809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                public void onClick(View v) {
27821809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                    if (listView.getCheckedItemCount() > 0) {
27921809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                        listView.setItemChecked(listPosition, !view.isChecked());
28021809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                    }
28121809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori                }
28221809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            });
28321809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori            return view;
28421809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori        }
28521809740f2fd8fe8df4e300e5d1d15f0ccedbb5fVasu Nori    }
286aee4b75abac61a9e2755eba27fea9d344e6ae80aPredrag Stanojevic}
287