summaryrefslogtreecommitdiff
path: root/app/src/main/java/de/danoeh/antennapod/adapter/DataFolderAdapter.java
blob: 74bc848785e4c9969710f9fc2b3de6f8501a60d4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package de.danoeh.antennapod.adapter;

import android.app.Dialog;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RadioButton;
import android.widget.TextView;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import de.danoeh.antennapod.R;
import de.danoeh.antennapod.core.preferences.UserPreferences;
import de.danoeh.antennapod.core.util.Converter;
import de.danoeh.antennapod.core.util.StorageUtils;
import de.danoeh.antennapod.dialog.ChooseDataFolderDialog;
import me.zhanghai.android.materialprogressbar.MaterialProgressBar;


public class DataFolderAdapter extends RecyclerView.Adapter<DataFolderAdapter.ViewHolder> {
    private final ChooseDataFolderDialog.RunnableWithString selectionHandler;
    private final String currentPath;
    private final List<StoragePath> entries;
    private final String freeSpaceString;
    private Dialog dialog;

    public DataFolderAdapter(Context context, ChooseDataFolderDialog.RunnableWithString selectionHandler) {
        this.entries = getStorageEntries(context);
        this.currentPath = getCurrentPath();
        this.selectionHandler = selectionHandler;
        this.freeSpaceString = context.getString(R.string.choose_data_directory_available_space);
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View entryView = inflater.inflate(R.layout.choose_data_folder_dialog_entry, parent, false);
        return new ViewHolder(entryView);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        StoragePath storagePath = entries.get(position);
        String freeSpace = Converter.byteToString(storagePath.getAvailableSpace());
        String totalSpace = Converter.byteToString(storagePath.getTotalSpace());

        holder.path.setText(storagePath.getShortPath());
        holder.size.setText(String.format(freeSpaceString, freeSpace, totalSpace));
        holder.progressBar.setProgress(storagePath.getUsagePercentage());
        holder.root.setOnClickListener((View v) -> selectAndDismiss(storagePath));
        holder.radioButton.setOnClickListener((View v) -> selectAndDismiss(storagePath));
        if (storagePath.getFullPath().equals(currentPath)) {
            holder.radioButton.toggle();
        }
    }

    @Override
    public int getItemCount() {
        if (currentPath == null) {
            return 0;
        } else {
            return entries.size();
        }
    }

    public void setDialog(Dialog dialog) {
        this.dialog = dialog;
    }

    private String getCurrentPath() {
        File dataFolder = UserPreferences.getDataFolder(null);
        if (dataFolder != null) return dataFolder.getAbsolutePath();
        return null;
    }

    private List<StoragePath> getStorageEntries(Context context) {
        File[] mediaDirs = ContextCompat.getExternalFilesDirs(context, null);
        final List<StoragePath> entries = new ArrayList<>(mediaDirs.length);
        for (File dir : mediaDirs) {
            if (isNotWritable(dir)) continue;

            entries.add(new StoragePath(dir.getAbsolutePath()));
        }
        return entries;
    }

    private boolean isNotWritable(File dir) {
        return dir == null || !dir.exists() || !dir.canRead() || !dir.canWrite();
    }

    private void selectAndDismiss(StoragePath storagePath) {
        selectionHandler.run(storagePath.getFullPath());
        dialog.dismiss();
    }

    static class ViewHolder extends RecyclerView.ViewHolder {
        private View root;
        private TextView path;
        private TextView size;
        private RadioButton radioButton;
        private MaterialProgressBar progressBar;

        ViewHolder(View itemView) {
            super(itemView);
            root = itemView.findViewById(R.id.root);
            path = itemView.findViewById(R.id.path);
            size = itemView.findViewById(R.id.size);
            radioButton = itemView.findViewById(R.id.radio_button);
            progressBar = itemView.findViewById(R.id.used_space);
        }
    }

    static class StoragePath {
        private final String path;

        StoragePath(String path) {
            this.path = path;
        }

        String getShortPath() {
            int prefixIndex = path.indexOf("Android");
            return (prefixIndex > 0) ? path.substring(0, prefixIndex) : path;
        }

        String getFullPath() {
            return this.path;
        }

        long getAvailableSpace() {
            return StorageUtils.getFreeSpaceAvailable(path);
        }

        long getTotalSpace() {
            return StorageUtils.getTotalSpaceAvailable(path);
        }

        int getUsagePercentage() {
            return 100 - (int) (100 * getAvailableSpace() / (float) getTotalSpace());
        }
    }
}