Update application dir

This commit is contained in:
Victor Shcherb 2015-04-27 22:37:57 +02:00
parent e48e1aef9f
commit ccd966c50b
2 changed files with 383 additions and 379 deletions

View file

@ -19,6 +19,7 @@ import net.osmand.plus.OsmandSettings.MetricsConstants;
import net.osmand.plus.R;
import net.osmand.plus.Version;
import net.osmand.plus.dashboard.DashChooseAppDirFragment;
import net.osmand.plus.dashboard.DashChooseAppDirFragment.ChooseAppDirFragment;
import net.osmand.plus.dashboard.DashChooseAppDirFragment.MoveFilesToDifferentDirectory;
import net.osmand.plus.download.DownloadActivity;
import net.osmand.plus.download.DownloadActivityType;
@ -26,8 +27,6 @@ import net.osmand.plus.helpers.FileNameTranslationHelper;
import net.osmand.plus.render.NativeOsmandLibrary;
import net.osmand.plus.voice.CommandPlayer;
import net.osmand.render.RenderingRulesStorage;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.Dialog;
@ -308,11 +307,11 @@ public class SettingsGeneralActivity extends SettingsBaseActivity {
});
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void showAppDirDialog(){
if(Build.VERSION.SDK_INT >= 19) {
ChooseAppDirDialogFragment newFragment = ChooseAppDirDialogFragment.newInstance();
newFragment.show(getFragmentManager(), "dialog");
showAppDirDialogV19();
return;
}
AlertDialog.Builder editalert = new AlertDialog.Builder(SettingsGeneralActivity.this);
editalert.setTitle(R.string.application_dir);
@ -336,34 +335,14 @@ public class SettingsGeneralActivity extends SettingsBaseActivity {
}
@SuppressLint("NewApi")
public static class ChooseAppDirDialogFragment extends android.app.DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Bundle args = getArguments();
final DashChooseAppDirFragment ssf = new DashChooseAppDirFragment();
ssf.setArguments(args);
ssf.onAttach(getActivity());
AlertDialog dlg = new AlertDialog.Builder(getActivity())
.setView(ssf.onCreateView(getActivity().getLayoutInflater(), null, savedInstanceState))
.setNegativeButton(R.string.shared_string_cancel, null)
.setPositiveButton(R.string.shared_string_ok, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
android.view.View.OnClickListener cf = ssf.getConfirmListener();
cf.onClick(null);
}
})
.create();
return dlg;
}
private void showAppDirDialogV19() {
Builder bld = new AlertDialog.Builder(this);
ChooseAppDirFragment frg = new DashChooseAppDirFragment.ChooseAppDirFragment(this, (Dialog) null);
bld.setView(frg.initView(getLayoutInflater(), null));
AlertDialog dlg = bld.show();
frg.setDialog(dlg);
}
public static ChooseAppDirDialogFragment newInstance() {
return new ChooseAppDirDialogFragment();
}
}
private void addMiscPreferences(PreferenceGroup misc) {

View file

@ -24,6 +24,7 @@ import net.osmand.util.Algorithms;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
@ -32,6 +33,7 @@ import android.os.Build;
import android.os.Bundle;
import android.os.StatFs;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.View;
@ -48,25 +50,12 @@ import android.widget.Toast;
public class DashChooseAppDirFragment extends DashBaseFragment {
public static final String TAG = "DASH_CHOOSE_APP_DIR_FRAGMENT";
public static final int VERSION_DEFAULTLOCATION_CHANGED = 19;
private TextView locationPath;
private TextView locationDesc;
MessageFormat formatGb = new MessageFormat("{0, number,#.##} GB", Locale.US);
private View copyMapsBtn;
private ImageView editBtn;
private View confirmBtn;
private boolean mapsCopied = false;
private TextView warningReadonly;
private int type = -1;
private File selectedFile = new File("/");
private File currentAppFile;
private OsmandSettings settings;
private Activity activity;
private ChooseAppDirFragment fragment;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
this.activity = activity;
fragment = new ChooseAppDirFragment(activity, this);
}
@ -77,348 +66,355 @@ public class DashChooseAppDirFragment extends DashBaseFragment {
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return initView(inflater, container);
return fragment.initView(inflater, container);
}
private String getFreeSpace(File dir) {
if(dir.canRead()){
StatFs fs = new StatFs(dir.getAbsolutePath());
return formatGb.format(new Object[]{(float) (fs.getAvailableBlocks()) * fs.getBlockSize() / (1 << 30) });
}
return "";
}
public void updateView() {
if (type == OsmandSettings.EXTERNAL_STORAGE_TYPE_DEFAULT ) {
locationPath.setText(R.string.storage_directory_default);
} else if (type == OsmandSettings.EXTERNAL_STORAGE_TYPE_EXTERNAL_FILE) {
locationPath.setText(R.string.storage_directory_external);
} else if (type == OsmandSettings.EXTERNAL_STORAGE_TYPE_OBB) {
locationPath.setText(R.string.storage_directory_multiuser);
} else if (type == OsmandSettings.EXTERNAL_STORAGE_TYPE_SPECIFIED) {
locationPath.setText(R.string.storage_directory_manual);
} else if (type == OsmandSettings.EXTERNAL_STORAGE_TYPE_SPECIFIED) {
locationPath.setText(R.string.storage_directory_manual);
}
locationDesc.setText(selectedFile.getAbsolutePath() + " \u2022 " + getFreeSpace(selectedFile));
boolean copyFiles = !currentAppFile.getAbsolutePath().equals(selectedFile.getAbsolutePath()) &&
!mapsCopied;
if (copyFiles) {
copyFiles = false;
File[] lf = currentAppFile.listFiles();
if (lf != null) {
for (File f : lf) {
if (f != null) {
if (f.getName().endsWith(IndexConstants.BINARY_MAP_INDEX_EXT)) {
copyFiles = true;
break;
}
}
}
}
}
warningReadonly.setVisibility(copyFiles ? View.VISIBLE : View.GONE);
if(copyFiles) {
if(OsmandSettings.isWritable(currentAppFile)) {
warningReadonly.setText(getString(R.string.android_19_location_disabled, currentAppFile.getAbsolutePath()));
} else {
warningReadonly.setText(getString(R.string.application_dir_change_warning3));
}
}
copyMapsBtn.setVisibility(copyFiles ? View.VISIBLE : View.GONE);
}
public View initView(LayoutInflater inflater, ViewGroup container) {
View view = inflater.inflate(R.layout.dash_storage_type_fragment, container, false);
settings = getMyApplication().getSettings();
locationPath = (TextView) view.findViewById(R.id.location_path);
locationDesc = (TextView) view.findViewById(R.id.location_desc);
warningReadonly = (TextView) view.findViewById(R.id.android_19_location_changed);
currentAppFile = settings.getExternalStorageDirectory();
selectedFile = currentAppFile;
if (settings.getExternalStorageDirectoryTypeV19() >= 0) {
type = settings.getExternalStorageDirectoryTypeV19();
} else {
ValueHolder<Integer> vh = new ValueHolder<Integer>();
settings.getExternalStorageDirectory(vh);
if (vh.value != null && vh.value >= 0) {
type = vh.value;
} else {
type = 0;
}
}
editBtn = (ImageView) view.findViewById(R.id.edit_icon);
copyMapsBtn = view.findViewById(R.id.copy_maps);
confirmBtn = view.findViewById(R.id.confirm);
addListeners();
updateView();
return view;
}
@TargetApi(Build.VERSION_CODES.KITKAT)
protected void showSelectDialog19() {
AlertDialog.Builder editalert = new AlertDialog.Builder(activity);
editalert.setTitle(R.string.application_dir);
final List<String> items = new ArrayList<String>();
final List<String> paths = new ArrayList<String>();
final TIntArrayList types = new TIntArrayList();
int selected = -1;
if(type == OsmandSettings.EXTERNAL_STORAGE_TYPE_SPECIFIED) {
items.add(getString(R.string.storage_directory_manual));
paths.add(selectedFile.getAbsolutePath());
types.add(OsmandSettings.EXTERNAL_STORAGE_TYPE_SPECIFIED);
}
File df = settings.getDefaultInternalStorage();
if(type == OsmandSettings.EXTERNAL_STORAGE_TYPE_DEFAULT ||
OsmandSettings.isWritable(df)) {
if(type == OsmandSettings.EXTERNAL_STORAGE_TYPE_DEFAULT) {
selected = items.size();
}
items.add(getString(R.string.storage_directory_default));
paths.add(df.getAbsolutePath());
types.add(OsmandSettings.EXTERNAL_STORAGE_TYPE_DEFAULT);
}
File[] externals = getMyApplication().getExternalFilesDirs(null);
if(externals != null) {
int i = 1;
for(File external : externals) {
if(external != null) {
if(selectedFile.getAbsolutePath().equals(external.getAbsolutePath()) ) {
selected = items.size();
}
items.add(getString(R.string.storage_directory_external) + " " + (i++));
paths.add(external.getAbsolutePath());
types.add(OsmandSettings.EXTERNAL_STORAGE_TYPE_EXTERNAL_FILE);
}
}
}
File[] obbDirs = getMyApplication().getObbDirs();
if(obbDirs != null) {
int i = 1;
for(File obb : obbDirs) {
if(obb != null) {
if(selectedFile.getAbsolutePath().equals(obb.getAbsolutePath()) ) {
selected = items.size();
}
items.add(getString(R.string.storage_directory_multiuser) + " " + (i++));
paths.add(obb.getAbsolutePath());
types.add(OsmandSettings.EXTERNAL_STORAGE_TYPE_OBB);
}
}
}
String pth = settings.getInternalAppPath().getAbsolutePath();
if(selectedFile.getAbsolutePath().equals(pth) ) {
selected = items.size();
}
items.add(getString(R.string.storage_directory_internal_app));
paths.add(pth);
types.add(OsmandSettings.EXTERNAL_STORAGE_TYPE_INTERNAL_FILE);
items.add(getString(R.string.storage_directory_manual) + getString(R.string.shared_string_ellipsis));
paths.add("");
types.add(OsmandSettings.EXTERNAL_STORAGE_TYPE_SPECIFIED);
editalert.setSingleChoiceItems(items.toArray(new String[items.size()]),
selected, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (which == items.size() - 1) {
dialog.dismiss();
showOtherDialog();
} else {
mapsCopied = false;
type = types.get(which);
selectedFile = new File(paths.get(which));
dialog.dismiss();
updateView();
}
}
});
editalert.setNegativeButton(R.string.shared_string_dismiss, null);
editalert.show();
}
public void showOtherDialog(){
AlertDialog.Builder editalert = new AlertDialog.Builder(activity);
editalert.setTitle(R.string.application_dir);
final EditText input = new EditText(activity);
input.setText(selectedFile.getAbsolutePath());
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT);
lp.leftMargin = lp.rightMargin = 5;
lp.bottomMargin = lp.topMargin = 5;
input.setLayoutParams(lp);
settings.getExternalStorageDirectory().getAbsolutePath();
editalert.setView(input);
editalert.setNegativeButton(R.string.shared_string_cancel, null);
editalert.setPositiveButton(R.string.shared_string_ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
selectedFile = new File(input.getText().toString());
mapsCopied = false;
updateView();
}
});
editalert.show();
}
private void addListeners() {
editBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
showOtherDialog();
} else {
showSelectDialog19();
}
}
});
copyMapsBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MoveFilesToDifferentDirectory task = new MoveFilesToDifferentDirectory(activity, currentAppFile,
selectedFile) {
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
if (result) {
mapsCopied = true;
getMyApplication().getResourceManager().resetStoreDirectory();
} else {
AccessibleToast.makeText(activity, R.string.copying_osmand_file_failed, Toast.LENGTH_SHORT)
.show();
}
updateView();
}
};
task.execute();
}
});
confirmBtn.setOnClickListener(getConfirmListener());
}
public OnClickListener getConfirmListener() {
return new View.OnClickListener() {
@Override
public void onClick(View v) {
boolean wr = OsmandSettings.isWritable(selectedFile);
if(wr) {
boolean changed = !currentAppFile.getAbsolutePath().equals(selectedFile.getAbsolutePath());
getMyApplication().setExternalStorageDirectory(type, selectedFile.getAbsolutePath());
if(changed) {
reloadData();
}
if (activity instanceof FragmentActivity) {
((FragmentActivity)activity).getSupportFragmentManager().beginTransaction().remove(DashChooseAppDirFragment.this)
.commit();
}
} else {
AccessibleToast.makeText(activity, R.string.specified_directiory_not_writeable,
Toast.LENGTH_LONG).show();
}
}
};
}
protected void reloadData() {
new ReloadData(activity, getMyApplication()).execute((Void)null );
}
public OsmandApplication getMyApplication(){
if (activity == null){
return null;
}
return (OsmandApplication) activity.getApplication();
}
public static class ReloadData extends AsyncTask<Void, Void, Boolean> {
private Context ctx;
protected ProgressImplementation progress;
private OsmandApplication app;
public ReloadData(Context ctx, OsmandApplication app) {
this.ctx = ctx;
this.app = app;
}
@Override
protected void onPreExecute() {
progress = ProgressImplementation.createProgressDialog(ctx, ctx.getString(R.string.loading_data),
ctx.getString(R.string.loading_data), ProgressDialog.STYLE_HORIZONTAL);
}
@Override
protected void onPostExecute(Boolean result) {
if (progress.getDialog().isShowing()) {
progress.getDialog().dismiss();
}
}
@Override
protected Boolean doInBackground(Void... params) {
app.getResourceManager().reloadIndexes(progress, new ArrayList<String>());
return true;
}
}
public static boolean isDashNeeded(OsmandSettings settings) {
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
return false;
}
// TODO
return true;
// return !settings.isExternalStorageDirectorySpecifiedV19();
return !settings.isExternalStorageDirectorySpecifiedV19();
}
public static HashSet<String> getExternalMounts() {
final HashSet<String> out = new HashSet<String>();
String reg = "(?i).*vold.*(vfat|ntfs|exfat|fat32|ext3|ext4).*rw.*";
String s = "";
try {
final Process process = new ProcessBuilder().command("mount")
.redirectErrorStream(true).start();
process.waitFor();
final InputStream is = process.getInputStream();
final byte[] buffer = new byte[1024];
while (is.read(buffer) != -1) {
s = s + new String(buffer);
}
is.close();
} catch (final Exception e) {
e.printStackTrace();
}
public static class ChooseAppDirFragment {
public static final int VERSION_DEFAULTLOCATION_CHANGED = 19;
private TextView locationPath;
private TextView locationDesc;
MessageFormat formatGb = new MessageFormat("{0, number,#.##} GB", Locale.US);
private View copyMapsBtn;
private ImageView editBtn;
private View confirmBtn;
private boolean mapsCopied = false;
private TextView warningReadonly;
private int type = -1;
private File selectedFile = new File("/");
private File currentAppFile;
private OsmandSettings settings;
private Activity activity;
private Fragment fragment;
private Dialog dlg;
public ChooseAppDirFragment(Activity activity, Fragment f) {
this.activity = activity;
this.fragment = f;
}
public ChooseAppDirFragment(Activity activity, Dialog dlg) {
this.activity = activity;
this.dlg = dlg;
}
private String getFreeSpace(File dir) {
if (dir.canRead()) {
StatFs fs = new StatFs(dir.getAbsolutePath());
return formatGb
.format(new Object[] { (float) (fs.getAvailableBlocks()) * fs.getBlockSize() / (1 << 30) });
}
return "";
}
public void updateView() {
if (type == OsmandSettings.EXTERNAL_STORAGE_TYPE_DEFAULT) {
locationPath.setText(R.string.storage_directory_default);
} else if (type == OsmandSettings.EXTERNAL_STORAGE_TYPE_EXTERNAL_FILE) {
locationPath.setText(R.string.storage_directory_external);
} else if (type == OsmandSettings.EXTERNAL_STORAGE_TYPE_OBB) {
locationPath.setText(R.string.storage_directory_multiuser);
} else if (type == OsmandSettings.EXTERNAL_STORAGE_TYPE_SPECIFIED) {
locationPath.setText(R.string.storage_directory_manual);
} else if (type == OsmandSettings.EXTERNAL_STORAGE_TYPE_SPECIFIED) {
locationPath.setText(R.string.storage_directory_manual);
}
locationDesc.setText(selectedFile.getAbsolutePath() + " \u2022 " + getFreeSpace(selectedFile));
boolean copyFiles = !currentAppFile.getAbsolutePath().equals(selectedFile.getAbsolutePath()) && !mapsCopied;
if (copyFiles) {
copyFiles = false;
File[] lf = currentAppFile.listFiles();
if (lf != null) {
for (File f : lf) {
if (f != null) {
if (f.getName().endsWith(IndexConstants.BINARY_MAP_INDEX_EXT)) {
copyFiles = true;
break;
}
}
}
}
}
warningReadonly.setVisibility(copyFiles ? View.VISIBLE : View.GONE);
if (copyFiles) {
if (!OsmandSettings.isWritable(currentAppFile)) {
warningReadonly.setText(activity.getString(R.string.android_19_location_disabled,
currentAppFile.getAbsolutePath()));
} else {
warningReadonly.setText(getString(R.string.application_dir_change_warning3));
}
}
copyMapsBtn.setVisibility(copyFiles ? View.VISIBLE : View.GONE);
}
public View initView(LayoutInflater inflater, ViewGroup container) {
View view = inflater.inflate(R.layout.dash_storage_type_fragment, container, false);
settings = getMyApplication().getSettings();
locationPath = (TextView) view.findViewById(R.id.location_path);
locationDesc = (TextView) view.findViewById(R.id.location_desc);
warningReadonly = (TextView) view.findViewById(R.id.android_19_location_changed);
currentAppFile = settings.getExternalStorageDirectory();
selectedFile = currentAppFile;
if (settings.getExternalStorageDirectoryTypeV19() >= 0) {
type = settings.getExternalStorageDirectoryTypeV19();
} else {
ValueHolder<Integer> vh = new ValueHolder<Integer>();
settings.getExternalStorageDirectory(vh);
if (vh.value != null && vh.value >= 0) {
type = vh.value;
} else {
type = 0;
}
}
editBtn = (ImageView) view.findViewById(R.id.edit_icon);
copyMapsBtn = view.findViewById(R.id.copy_maps);
confirmBtn = view.findViewById(R.id.confirm);
addListeners();
updateView();
return view;
}
public String getString(int string) {
return activity.getString(string);
}
@TargetApi(Build.VERSION_CODES.KITKAT)
protected void showSelectDialog19() {
AlertDialog.Builder editalert = new AlertDialog.Builder(activity);
editalert.setTitle(R.string.application_dir);
final List<String> items = new ArrayList<String>();
final List<String> paths = new ArrayList<String>();
final TIntArrayList types = new TIntArrayList();
int selected = -1;
if (type == OsmandSettings.EXTERNAL_STORAGE_TYPE_SPECIFIED) {
items.add(getString(R.string.storage_directory_manual));
paths.add(selectedFile.getAbsolutePath());
types.add(OsmandSettings.EXTERNAL_STORAGE_TYPE_SPECIFIED);
}
File df = settings.getDefaultInternalStorage();
if (type == OsmandSettings.EXTERNAL_STORAGE_TYPE_DEFAULT || OsmandSettings.isWritable(df)) {
if (type == OsmandSettings.EXTERNAL_STORAGE_TYPE_DEFAULT) {
selected = items.size();
}
items.add(getString(R.string.storage_directory_default));
paths.add(df.getAbsolutePath());
types.add(OsmandSettings.EXTERNAL_STORAGE_TYPE_DEFAULT);
}
File[] externals = getMyApplication().getExternalFilesDirs(null);
if (externals != null) {
int i = 1;
for (File external : externals) {
if (external != null) {
if (selectedFile.getAbsolutePath().equals(external.getAbsolutePath())) {
selected = items.size();
}
items.add(getString(R.string.storage_directory_external) + " " + (i++));
paths.add(external.getAbsolutePath());
types.add(OsmandSettings.EXTERNAL_STORAGE_TYPE_EXTERNAL_FILE);
}
}
}
File[] obbDirs = getMyApplication().getObbDirs();
if (obbDirs != null) {
int i = 1;
for (File obb : obbDirs) {
if (obb != null) {
if (selectedFile.getAbsolutePath().equals(obb.getAbsolutePath())) {
selected = items.size();
}
items.add(getString(R.string.storage_directory_multiuser) + " " + (i++));
paths.add(obb.getAbsolutePath());
types.add(OsmandSettings.EXTERNAL_STORAGE_TYPE_OBB);
}
}
}
String pth = settings.getInternalAppPath().getAbsolutePath();
if (selectedFile.getAbsolutePath().equals(pth)) {
selected = items.size();
}
items.add(getString(R.string.storage_directory_internal_app));
paths.add(pth);
types.add(OsmandSettings.EXTERNAL_STORAGE_TYPE_INTERNAL_FILE);
items.add(getString(R.string.storage_directory_manual) + getString(R.string.shared_string_ellipsis));
paths.add("");
types.add(OsmandSettings.EXTERNAL_STORAGE_TYPE_SPECIFIED);
editalert.setSingleChoiceItems(items.toArray(new String[items.size()]), selected,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (which == items.size() - 1) {
dialog.dismiss();
showOtherDialog();
} else {
mapsCopied = false;
type = types.get(which);
selectedFile = new File(paths.get(which));
dialog.dismiss();
updateView();
}
}
});
editalert.setNegativeButton(R.string.shared_string_dismiss, null);
editalert.show();
}
public void showOtherDialog() {
AlertDialog.Builder editalert = new AlertDialog.Builder(activity);
editalert.setTitle(R.string.application_dir);
final EditText input = new EditText(activity);
input.setText(selectedFile.getAbsolutePath());
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT);
lp.leftMargin = lp.rightMargin = 5;
lp.bottomMargin = lp.topMargin = 5;
input.setLayoutParams(lp);
settings.getExternalStorageDirectory().getAbsolutePath();
editalert.setView(input);
editalert.setNegativeButton(R.string.shared_string_cancel, null);
editalert.setPositiveButton(R.string.shared_string_ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
selectedFile = new File(input.getText().toString());
mapsCopied = false;
updateView();
}
});
editalert.show();
}
private void addListeners() {
editBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
showOtherDialog();
} else {
showSelectDialog19();
}
}
});
copyMapsBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MoveFilesToDifferentDirectory task = new MoveFilesToDifferentDirectory(activity, currentAppFile,
selectedFile) {
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
if (result) {
mapsCopied = true;
getMyApplication().getResourceManager().resetStoreDirectory();
} else {
AccessibleToast.makeText(activity, R.string.copying_osmand_file_failed,
Toast.LENGTH_SHORT).show();
}
updateView();
}
};
task.execute();
}
});
confirmBtn.setOnClickListener(getConfirmListener());
}
public OnClickListener getConfirmListener() {
return new View.OnClickListener() {
@Override
public void onClick(View v) {
boolean wr = OsmandSettings.isWritable(selectedFile);
if (wr) {
boolean changed = !currentAppFile.getAbsolutePath().equals(selectedFile.getAbsolutePath());
getMyApplication().setExternalStorageDirectory(type, selectedFile.getAbsolutePath());
if (changed) {
reloadData();
}
if (fragment != null && activity instanceof FragmentActivity) {
((FragmentActivity) activity).getSupportFragmentManager().beginTransaction()
.remove(fragment).commit();
}
} else {
AccessibleToast.makeText(activity, R.string.specified_directiory_not_writeable,
Toast.LENGTH_LONG).show();
}
if(dlg != null) {
dlg.dismiss();
}
}
};
}
protected void reloadData() {
new ReloadData(activity, getMyApplication()).execute((Void) null);
}
public OsmandApplication getMyApplication() {
if (activity == null) {
return null;
}
return (OsmandApplication) activity.getApplication();
}
public static HashSet<String> getExternalMounts() {
final HashSet<String> out = new HashSet<String>();
String reg = "(?i).*vold.*(vfat|ntfs|exfat|fat32|ext3|ext4).*rw.*";
String s = "";
try {
final Process process = new ProcessBuilder().command("mount").redirectErrorStream(true).start();
process.waitFor();
final InputStream is = process.getInputStream();
final byte[] buffer = new byte[1024];
while (is.read(buffer) != -1) {
s = s + new String(buffer);
}
is.close();
} catch (final Exception e) {
e.printStackTrace();
}
// parse output
final String[] lines = s.split("\n");
for (String line : lines) {
if (!line.toLowerCase(Locale.US).contains("asec")) {
if (line.matches(reg)) {
String[] parts = line.split(" ");
for (String part : parts) {
if (part.startsWith("/"))
if (!part.toLowerCase(Locale.US).contains("vold"))
out.add(part);
}
}
}
}
return out;
}
public void setDialog(Dialog dlg) {
this.dlg = dlg;
}
// parse output
final String[] lines = s.split("\n");
for (String line : lines) {
if (!line.toLowerCase(Locale.US).contains("asec")) {
if (line.matches(reg)) {
String[] parts = line.split(" ");
for (String part : parts) {
if (part.startsWith("/"))
if (!part.toLowerCase(Locale.US).contains("vold"))
out.add(part);
}
}
}
}
return out;
}
public static class MoveFilesToDifferentDirectory extends AsyncTask<Void, Void, Boolean> {
@ -513,5 +509,34 @@ public class DashChooseAppDirFragment extends DashBaseFragment {
}
}
public static class ReloadData extends AsyncTask<Void, Void, Boolean> {
private Context ctx;
protected ProgressImplementation progress;
private OsmandApplication app;
public ReloadData(Context ctx, OsmandApplication app) {
this.ctx = ctx;
this.app = app;
}
@Override
protected void onPreExecute() {
progress = ProgressImplementation.createProgressDialog(ctx, ctx.getString(R.string.loading_data),
ctx.getString(R.string.loading_data), ProgressDialog.STYLE_HORIZONTAL);
}
@Override
protected void onPostExecute(Boolean result) {
if (progress.getDialog().isShowing()) {
progress.getDialog().dismiss();
}
}
@Override
protected Boolean doInBackground(Void... params) {
app.getResourceManager().reloadIndexes(progress, new ArrayList<String>());
return true;
}
}
}