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 +}