diff --git a/skunkworks_crow/src/main/java/org/odk/share/network/WifiHospotConnector.java b/skunkworks_crow/src/main/java/org/odk/share/network/WifiHospotConnector.java
index be254e23..ce18f0ea 100644
--- a/skunkworks_crow/src/main/java/org/odk/share/network/WifiHospotConnector.java
+++ b/skunkworks_crow/src/main/java/org/odk/share/network/WifiHospotConnector.java
@@ -77,7 +77,7 @@ public boolean isSupported() {
public WifiConfiguration getWifiConfig() {
Object obj = null;
try {
- obj = getWifiApConfig.invoke(wifiManager, null);
+ obj = getWifiApConfig.invoke(wifiManager, obj);
if (obj != null) {
return (WifiConfiguration) obj;
}
diff --git a/skunkworks_crow/src/main/java/org/odk/share/tasks/DownloadJob.java b/skunkworks_crow/src/main/java/org/odk/share/tasks/DownloadJob.java
index 8a218059..abf76456 100644
--- a/skunkworks_crow/src/main/java/org/odk/share/tasks/DownloadJob.java
+++ b/skunkworks_crow/src/main/java/org/odk/share/tasks/DownloadJob.java
@@ -7,6 +7,7 @@
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
+import android.os.Build;
import android.preference.PreferenceManager;
import androidx.annotation.NonNull;
@@ -93,6 +94,7 @@ public class DownloadJob extends Job {
private int total;
private int progress;
+ private String directoryPath = null;
private DataInputStream dis;
private DataOutputStream dos;
public static final String RESULT_DIVIDER = "---------------\n";
@@ -368,9 +370,15 @@ private String getInstancesPath() {
private String getOdkDestinationDir() {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext().getApplicationContext());
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+ directoryPath = prefs.getString(PreferenceKeys.KEY_ODK_DESTINATION_DIR_DIRECTORY_PICKER,
+ getContext().getString(R.string.default_odk_destination_dir));
+ } else {
+ directoryPath = prefs.getString(PreferenceKeys.KEY_ODK_DESTINATION_DIR_EDIT_TEXT,
+ getContext().getString(R.string.default_odk_destination_dir));
- return prefs.getString(PreferenceKeys.KEY_ODK_DESTINATION_DIR,
- getContext().getString(R.string.default_odk_destination_dir));
+ }
+ return directoryPath;
}
private void readInstances(String formId, String formVersion) {
diff --git a/skunkworks_crow/src/main/java/org/odk/share/views/ui/settings/PreferenceKeys.java b/skunkworks_crow/src/main/java/org/odk/share/views/ui/settings/PreferenceKeys.java
index 8d026d51..4db11819 100644
--- a/skunkworks_crow/src/main/java/org/odk/share/views/ui/settings/PreferenceKeys.java
+++ b/skunkworks_crow/src/main/java/org/odk/share/views/ui/settings/PreferenceKeys.java
@@ -9,12 +9,15 @@ public class PreferenceKeys {
public static final String KEY_HOTSPOT_NAME = "hotspot_name";
public static final String KEY_HOTSPOT_PASSWORD = "hotspot_password";
public static final String KEY_HOTSPOT_PWD_REQUIRE = "hotspot_pwd_require";
- public static final String KEY_ODK_DESTINATION_DIR = "odk_destination_dir";
+ public static final String KEY_ODK_DESTINATION_DIR_EDIT_TEXT = "odk_destination_dir_edit_text";
+ public static final String KEY_ODK_DESTINATION_DIR_DIRECTORY_PICKER = "odk_destination_dir_directory_picker";
public static final String KEY_DEFAULT_TRANSFER_METHOD = "default_transfer_method";
public static final String KEY_BLUETOOTH_NAME = "bluetooth_name";
public static final String KEY_BLUETOOTH_SECURE_MODE = "bluetooth_secure_mode";
+ public static final String KEY_ODK_SETTINGS = "hotspot_setting";
+
private PreferenceKeys() {
}
-}
+}
\ No newline at end of file
diff --git a/skunkworks_crow/src/main/java/org/odk/share/views/ui/settings/SettingsActivity.java b/skunkworks_crow/src/main/java/org/odk/share/views/ui/settings/SettingsActivity.java
index dd9d517b..c0156fd1 100644
--- a/skunkworks_crow/src/main/java/org/odk/share/views/ui/settings/SettingsActivity.java
+++ b/skunkworks_crow/src/main/java/org/odk/share/views/ui/settings/SettingsActivity.java
@@ -1,6 +1,7 @@
package org.odk.share.views.ui.settings;
import android.bluetooth.BluetoothAdapter;
+import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Build;
import android.os.Bundle;
@@ -9,6 +10,7 @@
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
+import android.preference.PreferenceCategory;
import android.preference.PreferenceManager;
import android.text.TextUtils;
import android.view.LayoutInflater;
@@ -25,6 +27,8 @@
import org.odk.share.R;
+import timber.log.Timber;
+
/**
* Created by laksh on 5/27/2018.
@@ -37,10 +41,13 @@ public class SettingsActivity extends PreferenceActivity {
Preference hotspotPasswordPreference;
CheckBoxPreference passwordRequirePreference;
CheckBoxPreference btSecureModePreference;
- EditTextPreference odkDestinationDirPreference;
+ EditTextPreference odkDestinationDirPreferenceEditText;
ListPreference defaultMethodPreference;
+ Preference odkDestinationDirPreferenceDirectoryPicker;
private SharedPreferences prefs;
+ private static final int DIRECTORY_REQUEST_CODE = 9999;
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -51,6 +58,13 @@ protected void onCreate(Bundle savedInstanceState) {
addPreferencesFromResource(R.xml.preferences_menu);
addPreferences();
+
+ PreferenceCategory preferenceCategory = (PreferenceCategory) findPreference(PreferenceKeys.KEY_ODK_SETTINGS);
+ if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {
+ preferenceCategory.removePreference(odkDestinationDirPreferenceEditText);
+ } else {
+ preferenceCategory.removePreference(odkDestinationDirPreferenceDirectoryPicker);
+ }
}
@Override
@@ -68,7 +82,8 @@ private void addPreferences() {
hotspotPasswordPreference = findPreference(PreferenceKeys.KEY_HOTSPOT_PASSWORD);
passwordRequirePreference = (CheckBoxPreference) findPreference(PreferenceKeys.KEY_HOTSPOT_PWD_REQUIRE);
btSecureModePreference = (CheckBoxPreference) findPreference(PreferenceKeys.KEY_BLUETOOTH_SECURE_MODE);
- odkDestinationDirPreference = (EditTextPreference) findPreference(PreferenceKeys.KEY_ODK_DESTINATION_DIR);
+ odkDestinationDirPreferenceEditText = (EditTextPreference) findPreference(PreferenceKeys.KEY_ODK_DESTINATION_DIR_EDIT_TEXT);
+ odkDestinationDirPreferenceDirectoryPicker = (Preference) findPreference(PreferenceKeys.KEY_ODK_DESTINATION_DIR_DIRECTORY_PICKER);
prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
@@ -81,7 +96,10 @@ private void addPreferences() {
bluetoothNamePreference.setDefaultValue(defaultBluetoothName);
bluetoothNamePreference.setSummary(prefs.getString(PreferenceKeys.KEY_BLUETOOTH_NAME, defaultBluetoothName));
boolean isPasswordSet = prefs.getBoolean(PreferenceKeys.KEY_HOTSPOT_PWD_REQUIRE, false);
- odkDestinationDirPreference.setSummary(prefs.getString(PreferenceKeys.KEY_ODK_DESTINATION_DIR,
+
+
+ odkDestinationDirPreferenceDirectoryPicker.setSummary(prefs.getString(PreferenceKeys.KEY_ODK_DESTINATION_DIR_DIRECTORY_PICKER, getString(R.string.default_odk_destination_dir)));
+ odkDestinationDirPreferenceEditText.setSummary(prefs.getString(PreferenceKeys.KEY_ODK_DESTINATION_DIR_EDIT_TEXT,
getString(R.string.default_odk_destination_dir)));
boolean isSecureMode = prefs.getBoolean(PreferenceKeys.KEY_BLUETOOTH_SECURE_MODE, true);
@@ -93,7 +111,8 @@ private void addPreferences() {
bluetoothNamePreference.setOnPreferenceChangeListener(preferenceChangeListener());
hotspotPasswordPreference.setOnPreferenceChangeListener(preferenceChangeListener());
passwordRequirePreference.setOnPreferenceChangeListener(preferenceChangeListener());
- odkDestinationDirPreference.setOnPreferenceChangeListener(preferenceChangeListener());
+ odkDestinationDirPreferenceEditText.setOnPreferenceChangeListener(preferenceChangeListener());
+ odkDestinationDirPreferenceDirectoryPicker.setOnPreferenceClickListener(preferenceClickListener());
defaultMethodPreference.setOnPreferenceChangeListener(preferenceChangeListener());
hotspotPasswordPreference.setOnPreferenceClickListener(preferenceClickListener());
@@ -105,6 +124,9 @@ private Preference.OnPreferenceClickListener preferenceClickListener() {
case PreferenceKeys.KEY_HOTSPOT_PASSWORD:
showPasswordDialog();
break;
+ case PreferenceKeys.KEY_ODK_DESTINATION_DIR_DIRECTORY_PICKER:
+ chooseDirectory();
+ break;
}
return false;
};
@@ -148,13 +170,14 @@ private Preference.OnPreferenceChangeListener preferenceChangeListener() {
hotspotPasswordPreference.setEnabled(false);
}
break;
- case PreferenceKeys.KEY_ODK_DESTINATION_DIR:
+ case PreferenceKeys.KEY_ODK_DESTINATION_DIR_EDIT_TEXT:
String dir = newValue.toString();
if (dir.length() == 0) {
Toast.makeText(getApplicationContext(), getString(R.string.odk_destination_dir_error), Toast.LENGTH_LONG).show();
return false;
} else {
- odkDestinationDirPreference.setSummary(dir);
+ odkDestinationDirPreferenceEditText.setSummary(dir);
+ prefs.edit().putString(PreferenceKeys.KEY_ODK_DESTINATION_DIR_DIRECTORY_PICKER, null).apply();
}
break;
case PreferenceKeys.KEY_DEFAULT_TRANSFER_METHOD:
@@ -198,4 +221,26 @@ private void showPasswordDialog() {
alertDialog.setCancelable(true);
alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
+
+ public void chooseDirectory() {
+ Intent i = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
+ i.addCategory(Intent.CATEGORY_DEFAULT);
+ startActivityForResult(Intent.createChooser(i, getString(R.string.choose_directory)), DIRECTORY_REQUEST_CODE);
+ }
+
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ switch (requestCode) {
+ case DIRECTORY_REQUEST_CODE:
+ try {
+ String filePath = data.getData().getPath() + getString(R.string.directory_odk);
+ prefs.edit().putString(PreferenceKeys.KEY_ODK_DESTINATION_DIR_DIRECTORY_PICKER, filePath).apply();
+ prefs.edit().putString(PreferenceKeys.KEY_ODK_DESTINATION_DIR_EDIT_TEXT, null).apply();
+ odkDestinationDirPreferenceDirectoryPicker.setSummary(prefs.getString(PreferenceKeys.KEY_ODK_DESTINATION_DIR_DIRECTORY_PICKER, getString(R.string.default_odk_destination_dir)));
+ } catch (Exception e) {
+ Timber.e("Can not choose the Directory");
+ }
+ break;
+ }
+ }
}
+
diff --git a/skunkworks_crow/src/main/res/values/strings.xml b/skunkworks_crow/src/main/res/values/strings.xml
index 3e82f597..ebdaeb79 100644
--- a/skunkworks_crow/src/main/res/values/strings.xml
+++ b/skunkworks_crow/src/main/res/values/strings.xml
@@ -141,6 +141,8 @@
\/sdcard\/odk
ODK Destination Directory
+ /odk
+ Choose Directory
The destination should not be empty
Location Permission Needed
Enable location from the settings.
diff --git a/skunkworks_crow/src/main/res/xml/preferences_menu.xml b/skunkworks_crow/src/main/res/xml/preferences_menu.xml
index b7ac7d23..4306f53c 100644
--- a/skunkworks_crow/src/main/res/xml/preferences_menu.xml
+++ b/skunkworks_crow/src/main/res/xml/preferences_menu.xml
@@ -1,11 +1,20 @@
-
+
+
+
@@ -61,4 +70,4 @@
android:title="@string/secure_mode" />
-
+
\ No newline at end of file
diff --git a/skunkworks_crow/src/test/java/org/odk/share/activities/SettingsActivityTest.java b/skunkworks_crow/src/test/java/org/odk/share/activities/SettingsActivityTest.java
index e9171865..55b412fe 100644
--- a/skunkworks_crow/src/test/java/org/odk/share/activities/SettingsActivityTest.java
+++ b/skunkworks_crow/src/test/java/org/odk/share/activities/SettingsActivityTest.java
@@ -2,6 +2,7 @@
import android.bluetooth.BluetoothAdapter;
import android.content.SharedPreferences;
+import android.os.Build;
import android.preference.CheckBoxPreference;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
@@ -19,6 +20,7 @@
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
import static junit.framework.TestCase.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -26,6 +28,7 @@
import static org.junit.Assert.assertTrue;
@RunWith(RobolectricTestRunner.class)
+@Config(sdk = Build.VERSION_CODES.O_MR1)
public class SettingsActivityTest {
private SettingsActivity settingsActivity;
@@ -33,10 +36,12 @@ public class SettingsActivityTest {
private Preference hotspotPasswordPreference;
private CheckBoxPreference passwordRequirePreference;
private EditTextPreference hotspotNamePreference;
- private EditTextPreference odkDestinationDirPreference;
+ private EditTextPreference odkDestinationDirPreferenceEditText;
private CheckBoxPreference btSecureModePreference;
private ListPreference defaultMethodPreference;
private EditTextPreference bluetoothNamePreference;
+ private Preference odkDestinationDirDirectoryPicker;
+
@Before
public void setUp() throws Exception {
@@ -75,8 +80,10 @@ public void preferenceMenuTest() {
assertNotNull(settingsActivity.findPreference(PreferenceKeys.KEY_HOTSPOT_PASSWORD));
//test for passwordRequirePreference
assertNotNull(settingsActivity.findPreference(PreferenceKeys.KEY_HOTSPOT_PWD_REQUIRE));
- //test for odkDestinationDirPreference
- assertNotNull(settingsActivity.findPreference(PreferenceKeys.KEY_ODK_DESTINATION_DIR));
+ //test for odkDestinationDirPreferenceEditText
+ assertNotNull(settingsActivity.findPreference(PreferenceKeys.KEY_ODK_DESTINATION_DIR_EDIT_TEXT));
+ //test for odkDestinationDirDirectoryPicker
+ assertNotNull(settingsActivity.findPreference(PreferenceKeys.KEY_ODK_DESTINATION_DIR_DIRECTORY_PICKER));
//test for KEY_BLUETOOTH_SECURE_MODE
assertNotNull(settingsActivity.findPreference(PreferenceKeys.KEY_BLUETOOTH_SECURE_MODE));
//test for KEY_BLUETOOTH_NAME
@@ -91,15 +98,20 @@ public void preferenceMenuTest() {
@Test
public void preferenceSummaryTest() {
hotspotNamePreference = (EditTextPreference) settingsActivity.findPreference(PreferenceKeys.KEY_HOTSPOT_NAME);
- odkDestinationDirPreference = (EditTextPreference) settingsActivity.findPreference(PreferenceKeys.KEY_ODK_DESTINATION_DIR);
+ odkDestinationDirPreferenceEditText = (EditTextPreference) settingsActivity.findPreference(PreferenceKeys.KEY_ODK_DESTINATION_DIR_EDIT_TEXT);
+ odkDestinationDirDirectoryPicker = settingsActivity.findPreference(PreferenceKeys.KEY_ODK_DESTINATION_DIR_DIRECTORY_PICKER);
bluetoothNamePreference = (EditTextPreference) settingsActivity.findPreference(PreferenceKeys.KEY_BLUETOOTH_NAME);
//test the summary
assertEquals(prefs.getString(PreferenceKeys.KEY_HOTSPOT_NAME,
settingsActivity.getString(R.string.default_hotspot_ssid)), hotspotNamePreference.getSummary());
-
- assertEquals(prefs.getString(PreferenceKeys.KEY_ODK_DESTINATION_DIR,
- settingsActivity.getString(R.string.default_odk_destination_dir)), odkDestinationDirPreference.getSummary());
+ if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {
+ assertEquals(prefs.getString(PreferenceKeys.KEY_ODK_DESTINATION_DIR_DIRECTORY_PICKER,
+ settingsActivity.getString(R.string.default_odk_destination_dir)), odkDestinationDirDirectoryPicker.getSummary());
+ } else {
+ assertEquals(prefs.getString(PreferenceKeys.KEY_ODK_DESTINATION_DIR_EDIT_TEXT,
+ settingsActivity.getString(R.string.default_odk_destination_dir)), odkDestinationDirPreferenceEditText.getSummary());
+ }
assertEquals(prefs.getString(PreferenceKeys.KEY_BLUETOOTH_NAME,
BluetoothAdapter.getDefaultAdapter().getName()), bluetoothNamePreference.getSummary());
@@ -142,4 +154,4 @@ public void listPreferenceTest() {
assertEquals(settingsActivity.getString(R.string.bluetooth), defaultMethodPreference.getValue());
assertEquals(defaultMethodPreference.getEntries().length, settingsActivity.getResources().getStringArray(R.array.methods_array).length);
}
-}
\ No newline at end of file
+}