Preferences.java 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794
  1. /**
  2. * ownCloud Android client application
  3. *
  4. * @author Bartek Przybylski
  5. * @author David A. Velasco
  6. * Copyright (C) 2011 Bartek Przybylski
  7. * Copyright (C) 2016 ownCloud Inc.
  8. *
  9. * This program is free software: you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License version 2,
  11. * as published by the Free Software Foundation.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  20. *
  21. */
  22. package com.owncloud.android.ui.activity;
  23. import android.accounts.Account;
  24. import android.accounts.AuthenticatorException;
  25. import android.accounts.OperationCanceledException;
  26. import android.content.Intent;
  27. import android.content.SharedPreferences;
  28. import android.content.pm.PackageInfo;
  29. import android.content.pm.PackageManager.NameNotFoundException;
  30. import android.content.res.Configuration;
  31. import android.net.Uri;
  32. import android.os.Bundle;
  33. import android.os.Environment;
  34. import android.os.Handler;
  35. import android.os.IBinder;
  36. import android.preference.CheckBoxPreference;
  37. import android.preference.Preference;
  38. import android.preference.Preference.OnPreferenceChangeListener;
  39. import android.preference.Preference.OnPreferenceClickListener;
  40. import android.preference.PreferenceActivity;
  41. import android.preference.PreferenceCategory;
  42. import android.preference.PreferenceManager;
  43. import android.support.annotation.LayoutRes;
  44. import android.support.annotation.Nullable;
  45. import android.support.v7.app.ActionBar;
  46. import android.support.v7.app.AppCompatDelegate;
  47. import android.support.v7.widget.Toolbar;
  48. import android.view.Menu;
  49. import android.view.MenuInflater;
  50. import android.view.MenuItem;
  51. import android.view.View;
  52. import android.view.ViewGroup;
  53. import android.widget.Toast;
  54. import com.owncloud.android.BuildConfig;
  55. import com.owncloud.android.MainApp;
  56. import com.owncloud.android.R;
  57. import com.owncloud.android.authentication.AccountUtils;
  58. import com.owncloud.android.datamodel.OCFile;
  59. import com.owncloud.android.lib.common.OwnCloudAccount;
  60. import com.owncloud.android.lib.common.OwnCloudClientManagerFactory;
  61. import com.owncloud.android.lib.common.utils.Log_OC;
  62. import com.owncloud.android.services.OperationsService;
  63. import com.owncloud.android.ui.PreferenceWithLongSummary;
  64. import com.owncloud.android.ui.RadioButtonPreference;
  65. import com.owncloud.android.utils.DisplayUtils;
  66. import java.io.File;
  67. import java.io.IOException;
  68. /**
  69. * An Activity that allows the user to change the application's settings.
  70. *
  71. * It proxies the necessary calls via {@link android.support.v7.app.AppCompatDelegate} to be used
  72. * with AppCompat.
  73. */
  74. public class Preferences extends PreferenceActivity {
  75. private static final String TAG = Preferences.class.getSimpleName();
  76. private static final int ACTION_SELECT_UPLOAD_PATH = 1;
  77. private static final int ACTION_SELECT_UPLOAD_VIDEO_PATH = 2;
  78. private static final int ACTION_SELECT_STORAGE_PATH = 3;
  79. private static final int ACTION_PERFORM_MIGRATION = 4;
  80. private static final int ACTION_REQUEST_PASSCODE = 5;
  81. private static final int ACTION_CONFIRM_PASSCODE = 6;
  82. private static final int ACTION_REQUEST_CODE_DAVDROID_SETUP = 10;
  83. /**
  84. * The user's server base uri.
  85. */
  86. private Uri mUri;
  87. private CheckBoxPreference pCode;
  88. private CheckBoxPreference mShowHiddenFiles;
  89. private Preference pAboutApp;
  90. private AppCompatDelegate mDelegate;
  91. private PreferenceCategory mAccountsPrefCategory = null;
  92. private String mUploadPath;
  93. private PreferenceCategory mPrefInstantUploadCategory;
  94. private Preference mPrefInstantUpload;
  95. private Preference mPrefInstantUploadBehaviour;
  96. private Preference mPrefInstantUploadPath;
  97. private Preference mPrefInstantUploadUseSubfolders;
  98. private Preference mPrefInstantPictureUploadOnlyOnCharging;
  99. private Preference mPrefInstantUploadPathWiFi;
  100. private Preference mPrefInstantVideoUpload;
  101. private Preference mPrefInstantVideoUploadPath;
  102. private Preference mPrefInstantVideoUploadUseSubfolders;
  103. private Preference mPrefInstantVideoUploadPathWiFi;
  104. private Preference mPrefInstantVideoUploadOnlyOnCharging;
  105. private String mUploadVideoPath;
  106. private PreferenceWithLongSummary mPrefStoragePath;
  107. private String mStoragePath;
  108. @SuppressWarnings("deprecation")
  109. @Override
  110. public void onCreate(Bundle savedInstanceState) {
  111. getDelegate().installViewFactory();
  112. getDelegate().onCreate(savedInstanceState);
  113. super.onCreate(savedInstanceState);
  114. addPreferencesFromResource(R.xml.preferences);
  115. ActionBar actionBar = getSupportActionBar();
  116. actionBar.setDisplayHomeAsUpEnabled(true);
  117. actionBar.setTitle(R.string.actionbar_settings);
  118. // retrieve user's base uri
  119. setupBaseUri();
  120. // For adding content description tag to a title field in the action bar
  121. int actionBarTitleId = getResources().getIdentifier("action_bar_title", "id", "android");
  122. View actionBarTitleView = getWindow().getDecorView().findViewById(actionBarTitleId);
  123. if (actionBarTitleView != null) { // it's null in Android 2.x
  124. getWindow().getDecorView().findViewById(actionBarTitleId).
  125. setContentDescription(getString(R.string.actionbar_settings));
  126. }
  127. // Load package info
  128. String temp;
  129. try {
  130. PackageInfo pkg = getPackageManager().getPackageInfo(getPackageName(), 0);
  131. temp = pkg.versionName;
  132. } catch (NameNotFoundException e) {
  133. temp = "";
  134. Log_OC.e(TAG, "Error while showing about dialog", e);
  135. }
  136. final String appVersion = temp;
  137. // Register context menu for list of preferences.
  138. registerForContextMenu(getListView());
  139. pCode = (CheckBoxPreference) findPreference(PassCodeActivity.PREFERENCE_SET_PASSCODE);
  140. if (pCode != null){
  141. pCode.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
  142. @Override
  143. public boolean onPreferenceChange(Preference preference, Object newValue) {
  144. Intent i = new Intent(getApplicationContext(), PassCodeActivity.class);
  145. Boolean incoming = (Boolean) newValue;
  146. i.setAction(
  147. incoming ? PassCodeActivity.ACTION_REQUEST_WITH_RESULT :
  148. PassCodeActivity.ACTION_CHECK_WITH_RESULT
  149. );
  150. startActivityForResult(i, incoming ? ACTION_REQUEST_PASSCODE :
  151. ACTION_CONFIRM_PASSCODE);
  152. // Don't update just yet, we will decide on it in onActivityResult
  153. return false;
  154. }
  155. });
  156. }
  157. mShowHiddenFiles = (CheckBoxPreference) findPreference("show_hidden_files");
  158. mShowHiddenFiles.setOnPreferenceClickListener(new OnPreferenceClickListener() {
  159. @Override
  160. public boolean onPreferenceClick(Preference preference) {
  161. SharedPreferences appPrefs =
  162. PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
  163. SharedPreferences.Editor editor = appPrefs.edit();
  164. editor.putBoolean("show_hidden_files_pref", mShowHiddenFiles.isChecked());
  165. editor.commit();
  166. return true;
  167. }
  168. });
  169. PreferenceCategory preferenceCategory = (PreferenceCategory) findPreference("more");
  170. boolean calendarContactsEnabled = getResources().getBoolean(R.bool.calendar_contacts_enabled);
  171. Preference pCalendarContacts = findPreference("calendar_contacts");
  172. if (pCalendarContacts != null) {
  173. if (calendarContactsEnabled) {
  174. pCalendarContacts.setOnPreferenceClickListener(new OnPreferenceClickListener() {
  175. @Override
  176. public boolean onPreferenceClick(Preference preference) {
  177. try {
  178. launchDavDroidLogin();
  179. } catch (Throwable t) {
  180. Log_OC.e(TAG, "Base Uri for account could not be resolved to call DAVdroid!", t);
  181. Toast.makeText(
  182. MainApp.getAppContext(),
  183. R.string.prefs_calendar_contacts_address_resolve_error,
  184. Toast.LENGTH_SHORT)
  185. .show();
  186. }
  187. return true;
  188. }
  189. });
  190. } else {
  191. preferenceCategory.removePreference(pCalendarContacts);
  192. }
  193. }
  194. boolean helpEnabled = getResources().getBoolean(R.bool.help_enabled);
  195. Preference pHelp = findPreference("help");
  196. if (pHelp != null ){
  197. if (helpEnabled) {
  198. pHelp.setOnPreferenceClickListener(new OnPreferenceClickListener() {
  199. @Override
  200. public boolean onPreferenceClick(Preference preference) {
  201. String helpWeb =(String) getText(R.string.url_help);
  202. if (helpWeb != null && helpWeb.length() > 0) {
  203. Uri uriUrl = Uri.parse(helpWeb);
  204. Intent intent = new Intent(Intent.ACTION_VIEW, uriUrl);
  205. startActivity(intent);
  206. }
  207. return true;
  208. }
  209. });
  210. } else {
  211. preferenceCategory.removePreference(pHelp);
  212. }
  213. }
  214. boolean recommendEnabled = getResources().getBoolean(R.bool.recommend_enabled);
  215. Preference pRecommend = findPreference("recommend");
  216. if (pRecommend != null){
  217. if (recommendEnabled) {
  218. pRecommend.setOnPreferenceClickListener(new OnPreferenceClickListener() {
  219. @Override
  220. public boolean onPreferenceClick(Preference preference) {
  221. Intent intent = new Intent(Intent.ACTION_SENDTO);
  222. intent.setType("text/plain");
  223. intent.setData(Uri.parse(getString(R.string.mail_recommend)));
  224. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  225. String appName = getString(R.string.app_name);
  226. String downloadUrl = getString(R.string.url_app_download);
  227. String recommendSubject =
  228. String.format(getString(R.string.recommend_subject),
  229. appName);
  230. String recommendText = String.format(getString(R.string.recommend_text),
  231. appName, downloadUrl);
  232. intent.putExtra(Intent.EXTRA_SUBJECT, recommendSubject);
  233. intent.putExtra(Intent.EXTRA_TEXT, recommendText);
  234. startActivity(intent);
  235. return true;
  236. }
  237. });
  238. } else {
  239. preferenceCategory.removePreference(pRecommend);
  240. }
  241. }
  242. boolean feedbackEnabled = getResources().getBoolean(R.bool.feedback_enabled);
  243. Preference pFeedback = findPreference("feedback");
  244. if (pFeedback != null){
  245. if (feedbackEnabled) {
  246. pFeedback.setOnPreferenceClickListener(new OnPreferenceClickListener() {
  247. @Override
  248. public boolean onPreferenceClick(Preference preference) {
  249. String feedbackMail =(String) getText(R.string.mail_feedback);
  250. String feedback =(String) getText(R.string.prefs_feedback) +
  251. " - android v" + appVersion;
  252. Intent intent = new Intent(Intent.ACTION_SENDTO);
  253. intent.setType("text/plain");
  254. intent.putExtra(Intent.EXTRA_SUBJECT, feedback);
  255. intent.setData(Uri.parse(feedbackMail));
  256. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  257. startActivity(intent);
  258. return true;
  259. }
  260. });
  261. } else {
  262. preferenceCategory.removePreference(pFeedback);
  263. }
  264. }
  265. boolean loggerEnabled = getResources().getBoolean(R.bool.logger_enabled) || BuildConfig.DEBUG;
  266. Preference pLogger = findPreference("logger");
  267. if (pLogger != null){
  268. if (loggerEnabled) {
  269. pLogger.setOnPreferenceClickListener(new OnPreferenceClickListener() {
  270. @Override
  271. public boolean onPreferenceClick(Preference preference) {
  272. Intent loggerIntent = new Intent(getApplicationContext(), LogHistoryActivity.class);
  273. startActivity(loggerIntent);
  274. return true;
  275. }
  276. });
  277. } else {
  278. preferenceCategory.removePreference(pLogger);
  279. }
  280. }
  281. boolean imprintEnabled = getResources().getBoolean(R.bool.imprint_enabled);
  282. Preference pImprint = findPreference("imprint");
  283. if (pImprint != null) {
  284. if (imprintEnabled) {
  285. pImprint.setOnPreferenceClickListener(new OnPreferenceClickListener() {
  286. @Override
  287. public boolean onPreferenceClick(Preference preference) {
  288. String imprintWeb = (String) getText(R.string.url_imprint);
  289. if (imprintWeb != null && imprintWeb.length() > 0) {
  290. Uri uriUrl = Uri.parse(imprintWeb);
  291. Intent intent = new Intent(Intent.ACTION_VIEW, uriUrl);
  292. startActivity(intent);
  293. }
  294. //ImprintDialog.newInstance(true).show(preference.get, "IMPRINT_DIALOG");
  295. return true;
  296. }
  297. });
  298. } else {
  299. preferenceCategory.removePreference(pImprint);
  300. }
  301. }
  302. mPrefStoragePath = (PreferenceWithLongSummary)findPreference("storage_path");
  303. if (mPrefStoragePath != null) {
  304. mPrefStoragePath.setOnPreferenceClickListener(new OnPreferenceClickListener() {
  305. @Override
  306. public boolean onPreferenceClick(Preference preference) {
  307. Intent intent = new Intent(Preferences.this, LocalDirectorySelectorActivity.class);
  308. intent.putExtra(UploadFilesActivity.KEY_DIRECTORY_PATH, mStoragePath);
  309. startActivityForResult(intent, ACTION_SELECT_STORAGE_PATH);
  310. return true;
  311. }
  312. });
  313. mPrefStoragePath.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
  314. @Override
  315. public boolean onPreferenceChange(Preference preference, Object newValue) {
  316. MainApp.setStoragePath((String) newValue);
  317. return true;
  318. }
  319. });
  320. }
  321. mPrefInstantUploadPath = (PreferenceWithLongSummary)findPreference("instant_upload_path");
  322. if (mPrefInstantUploadPath != null){
  323. mPrefInstantUploadPath.setOnPreferenceClickListener(new OnPreferenceClickListener() {
  324. @Override
  325. public boolean onPreferenceClick(Preference preference) {
  326. if (!mUploadPath.endsWith(OCFile.PATH_SEPARATOR)) {
  327. mUploadPath += OCFile.PATH_SEPARATOR;
  328. }
  329. Intent intent = new Intent(Preferences.this, UploadPathActivity.class);
  330. intent.putExtra(UploadPathActivity.KEY_INSTANT_UPLOAD_PATH, mUploadPath);
  331. startActivityForResult(intent, ACTION_SELECT_UPLOAD_PATH);
  332. return true;
  333. }
  334. });
  335. }
  336. mPrefInstantUploadCategory =
  337. (PreferenceCategory) findPreference("instant_uploading_category");
  338. mPrefInstantUploadUseSubfolders = findPreference("instant_upload_path_use_subfolders");
  339. mPrefInstantUploadPathWiFi = findPreference("instant_upload_on_wifi");
  340. mPrefInstantPictureUploadOnlyOnCharging = findPreference("instant_upload_on_charging");
  341. mPrefInstantUpload = findPreference("instant_uploading");
  342. toggleInstantPictureOptions(((CheckBoxPreference) mPrefInstantUpload).isChecked());
  343. mPrefInstantUpload.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
  344. @Override
  345. public boolean onPreferenceChange(Preference preference, Object newValue) {
  346. toggleInstantPictureOptions((Boolean) newValue);
  347. toggleInstantUploadBehaviour(
  348. ((CheckBoxPreference)mPrefInstantVideoUpload).isChecked(),
  349. (Boolean) newValue);
  350. return true;
  351. }
  352. });
  353. mPrefInstantVideoUploadPath = findPreference("instant_video_upload_path");
  354. if (mPrefInstantVideoUploadPath != null){
  355. mPrefInstantVideoUploadPath.setOnPreferenceClickListener(new OnPreferenceClickListener() {
  356. @Override
  357. public boolean onPreferenceClick(Preference preference) {
  358. if (!mUploadVideoPath.endsWith(OCFile.PATH_SEPARATOR)) {
  359. mUploadVideoPath += OCFile.PATH_SEPARATOR;
  360. }
  361. Intent intent = new Intent(Preferences.this, UploadPathActivity.class);
  362. intent.putExtra(UploadPathActivity.KEY_INSTANT_UPLOAD_PATH,
  363. mUploadVideoPath);
  364. startActivityForResult(intent, ACTION_SELECT_UPLOAD_VIDEO_PATH);
  365. return true;
  366. }
  367. });
  368. }
  369. mPrefInstantVideoUploadUseSubfolders = findPreference("instant_video_upload_path_use_subfolders");
  370. mPrefInstantVideoUploadPathWiFi = findPreference("instant_video_upload_on_wifi");
  371. mPrefInstantVideoUpload = findPreference("instant_video_uploading");
  372. mPrefInstantVideoUploadOnlyOnCharging = findPreference("instant_video_upload_on_charging");
  373. toggleInstantVideoOptions(((CheckBoxPreference) mPrefInstantVideoUpload).isChecked());
  374. mPrefInstantVideoUpload.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
  375. @Override
  376. public boolean onPreferenceChange(Preference preference, Object newValue) {
  377. toggleInstantVideoOptions((Boolean) newValue);
  378. toggleInstantUploadBehaviour(
  379. (Boolean) newValue,
  380. ((CheckBoxPreference) mPrefInstantUpload).isChecked());
  381. return true;
  382. }
  383. });
  384. mPrefInstantUploadBehaviour = findPreference("prefs_instant_behaviour");
  385. toggleInstantUploadBehaviour(
  386. ((CheckBoxPreference)mPrefInstantVideoUpload).isChecked(),
  387. ((CheckBoxPreference)mPrefInstantUpload).isChecked());
  388. /* About App */
  389. pAboutApp = findPreference("about_app");
  390. if (pAboutApp != null) {
  391. pAboutApp.setTitle(String.format(getString(R.string.about_android),
  392. getString(R.string.app_name)));
  393. pAboutApp.setSummary(String.format(getString(R.string.about_version), appVersion));
  394. }
  395. loadInstantUploadPath();
  396. loadStoragePath();
  397. loadInstantUploadVideoPath();
  398. }
  399. private void launchDavDroidLogin()
  400. throws com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException,
  401. OperationCanceledException,
  402. AuthenticatorException,
  403. IOException {
  404. Account account = AccountUtils.getCurrentOwnCloudAccount(getApplicationContext());
  405. Intent davDroidLoginIntent = new Intent();
  406. davDroidLoginIntent.setClassName("at.bitfire.davdroid", "at.bitfire.davdroid.ui.setup.LoginActivity");
  407. if (getPackageManager().resolveActivity(davDroidLoginIntent, 0) != null) {
  408. // arguments
  409. if (mUri != null) {
  410. davDroidLoginIntent.putExtra("url", mUri.toString());
  411. }
  412. davDroidLoginIntent.putExtra("username", AccountUtils.getAccountUsername(account.name));
  413. //loginIntent.putExtra("password", "...");
  414. startActivityForResult(davDroidLoginIntent, ACTION_REQUEST_CODE_DAVDROID_SETUP);
  415. } else {
  416. // DAVdroid not installed
  417. Intent installIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=at.bitfire.davdroid"));
  418. // launch market(s)
  419. if (installIntent.resolveActivity(getPackageManager()) != null) {
  420. startActivity(installIntent);
  421. } else {
  422. // no f-droid market app or Play store installed --> launch browser for f-droid url
  423. Intent downloadIntent = new Intent(Intent.ACTION_VIEW,
  424. Uri.parse("https://f-droid.org/repository/browse/?fdid=at.bitfire.davdroid"));
  425. startActivity(downloadIntent);
  426. Toast.makeText(
  427. MainApp.getAppContext(),
  428. R.string.prefs_calendar_contacts_no_store_error,
  429. Toast.LENGTH_SHORT)
  430. .show();
  431. }
  432. }
  433. }
  434. private void setupBaseUri() {
  435. // retrieve and set user's base URI
  436. Thread t = new Thread(new Runnable() {
  437. public void run() {
  438. try {
  439. Account account = AccountUtils.getCurrentOwnCloudAccount(getApplicationContext());
  440. OwnCloudAccount ocAccount = new OwnCloudAccount(account, MainApp.getAppContext());
  441. mUri = OwnCloudClientManagerFactory.getDefaultSingleton().
  442. getClientFor(ocAccount, getApplicationContext()).getBaseUri();
  443. } catch (Throwable t) {
  444. Log_OC.e(TAG,"Error retrieving user's base URI", t);
  445. }
  446. }
  447. });
  448. t.start();
  449. }
  450. private void toggleInstantPictureOptions(Boolean value){
  451. if (value){
  452. mPrefInstantUploadCategory.addPreference(mPrefInstantUploadPathWiFi);
  453. mPrefInstantUploadCategory.addPreference(mPrefInstantUploadPath);
  454. mPrefInstantUploadCategory.addPreference(mPrefInstantUploadUseSubfolders);
  455. mPrefInstantUploadCategory.addPreference(mPrefInstantPictureUploadOnlyOnCharging);
  456. } else {
  457. mPrefInstantUploadCategory.removePreference(mPrefInstantUploadPathWiFi);
  458. mPrefInstantUploadCategory.removePreference(mPrefInstantUploadPath);
  459. mPrefInstantUploadCategory.removePreference(mPrefInstantUploadUseSubfolders);
  460. mPrefInstantUploadCategory.removePreference(mPrefInstantPictureUploadOnlyOnCharging);
  461. }
  462. }
  463. private void toggleInstantVideoOptions(Boolean value){
  464. if (value){
  465. mPrefInstantUploadCategory.addPreference(mPrefInstantVideoUploadPathWiFi);
  466. mPrefInstantUploadCategory.addPreference(mPrefInstantVideoUploadPath);
  467. mPrefInstantUploadCategory.addPreference(mPrefInstantVideoUploadUseSubfolders);
  468. mPrefInstantUploadCategory.addPreference(mPrefInstantVideoUploadOnlyOnCharging);
  469. } else {
  470. mPrefInstantUploadCategory.removePreference(mPrefInstantVideoUploadPathWiFi);
  471. mPrefInstantUploadCategory.removePreference(mPrefInstantVideoUploadPath);
  472. mPrefInstantUploadCategory.removePreference(mPrefInstantVideoUploadUseSubfolders);
  473. mPrefInstantUploadCategory.removePreference(mPrefInstantVideoUploadOnlyOnCharging);
  474. }
  475. }
  476. private void toggleInstantUploadBehaviour(Boolean video, Boolean picture){
  477. if (picture || video){
  478. mPrefInstantUploadCategory.addPreference(mPrefInstantUploadBehaviour);
  479. } else {
  480. mPrefInstantUploadCategory.removePreference(mPrefInstantUploadBehaviour);
  481. }
  482. }
  483. @Override
  484. protected void onResume() {
  485. super.onResume();
  486. SharedPreferences appPrefs =
  487. PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
  488. boolean state = appPrefs.getBoolean(PassCodeActivity.PREFERENCE_SET_PASSCODE, false);
  489. pCode.setChecked(state);
  490. }
  491. @Override
  492. public boolean onCreateOptionsMenu(Menu menu) {
  493. super.onCreateOptionsMenu(menu);
  494. return true;
  495. }
  496. @Override
  497. public boolean onMenuItemSelected(int featureId, MenuItem item) {
  498. super.onMenuItemSelected(featureId, item);
  499. Intent intent;
  500. switch (item.getItemId()) {
  501. case android.R.id.home:
  502. intent = new Intent(getBaseContext(), FileDisplayActivity.class);
  503. intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  504. startActivity(intent);
  505. break;
  506. default:
  507. Log_OC.w(TAG, "Unknown menu item triggered");
  508. return false;
  509. }
  510. return true;
  511. }
  512. @Override
  513. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  514. super.onActivityResult(requestCode, resultCode, data);
  515. if (requestCode == ACTION_SELECT_UPLOAD_PATH && resultCode == RESULT_OK){
  516. OCFile folderToUpload = data.getParcelableExtra(UploadPathActivity.EXTRA_FOLDER);
  517. mUploadPath = folderToUpload.getRemotePath();
  518. mUploadPath = DisplayUtils.getPathWithoutLastSlash(mUploadPath);
  519. // Show the path on summary preference
  520. mPrefInstantUploadPath.setSummary(mUploadPath);
  521. saveInstantUploadPathOnPreferences();
  522. } else if (requestCode == ACTION_SELECT_UPLOAD_VIDEO_PATH && resultCode == RESULT_OK) {
  523. OCFile folderToUploadVideo = data.getParcelableExtra(UploadPathActivity.EXTRA_FOLDER);
  524. mUploadVideoPath = folderToUploadVideo.getRemotePath();
  525. mUploadVideoPath = DisplayUtils.getPathWithoutLastSlash(mUploadVideoPath);
  526. // Show the video path on summary preference
  527. mPrefInstantVideoUploadPath.setSummary(mUploadVideoPath);
  528. saveInstantUploadVideoPathOnPreferences();
  529. } else if (requestCode == ACTION_REQUEST_PASSCODE && resultCode == RESULT_OK) {
  530. String passcode = data.getStringExtra(PassCodeActivity.KEY_PASSCODE);
  531. if (passcode != null && passcode.length() == 4) {
  532. SharedPreferences.Editor appPrefs = PreferenceManager
  533. .getDefaultSharedPreferences(getApplicationContext()).edit();
  534. for (int i = 1; i <= 4; ++i) {
  535. appPrefs.putString(PassCodeActivity.PREFERENCE_PASSCODE_D + i, passcode.substring(i-1, i));
  536. }
  537. appPrefs.putBoolean(PassCodeActivity.PREFERENCE_SET_PASSCODE, true);
  538. appPrefs.apply();
  539. Toast.makeText(this, R.string.pass_code_stored, Toast.LENGTH_LONG).show();
  540. }
  541. } else if (requestCode == ACTION_CONFIRM_PASSCODE && resultCode == RESULT_OK) {
  542. if (data.getBooleanExtra(PassCodeActivity.KEY_CHECK_RESULT, false)) {
  543. SharedPreferences.Editor appPrefs = PreferenceManager
  544. .getDefaultSharedPreferences(getApplicationContext()).edit();
  545. appPrefs.putBoolean(PassCodeActivity.PREFERENCE_SET_PASSCODE, false);
  546. appPrefs.apply();
  547. Toast.makeText(this, R.string.pass_code_removed, Toast.LENGTH_LONG).show();
  548. }
  549. } else if (requestCode == ACTION_SELECT_STORAGE_PATH && resultCode == RESULT_OK) {
  550. File currentStorageDir = new File(mStoragePath);
  551. File upcomingStorageDir = new File(data.getStringExtra(UploadFilesActivity.EXTRA_CHOSEN_FILES));
  552. if (currentStorageDir != upcomingStorageDir) {
  553. Intent migrationIntent = new Intent(this, StorageMigrationActivity.class);
  554. migrationIntent.putExtra(StorageMigrationActivity.KEY_MIGRATION_SOURCE_DIR,
  555. currentStorageDir.getAbsolutePath());
  556. migrationIntent.putExtra(StorageMigrationActivity.KEY_MIGRATION_TARGET_DIR,
  557. upcomingStorageDir.getAbsolutePath());
  558. startActivityForResult(migrationIntent, ACTION_PERFORM_MIGRATION);
  559. }
  560. } else if (requestCode == ACTION_PERFORM_MIGRATION && resultCode == RESULT_OK) {
  561. String resultStorageDir = data.getStringExtra(StorageMigrationActivity.KEY_MIGRATION_TARGET_DIR);
  562. saveStoragePath(resultStorageDir);
  563. } else if (requestCode == ACTION_REQUEST_CODE_DAVDROID_SETUP && resultCode == RESULT_OK) {
  564. Toast.makeText(this, R.string.prefs_calendar_contacts_sync_setup_successful, Toast.LENGTH_LONG).show(); }
  565. }
  566. public ActionBar getSupportActionBar() {
  567. return getDelegate().getSupportActionBar();
  568. }
  569. public void setSupportActionBar(@Nullable Toolbar toolbar) {
  570. getDelegate().setSupportActionBar(toolbar);
  571. }
  572. @Override
  573. public MenuInflater getMenuInflater() {
  574. return getDelegate().getMenuInflater();
  575. }
  576. @Override
  577. public void setContentView(@LayoutRes int layoutResID) {
  578. getDelegate().setContentView(layoutResID);
  579. }
  580. @Override
  581. public void setContentView(View view) {
  582. getDelegate().setContentView(view);
  583. }
  584. @Override
  585. public void setContentView(View view, ViewGroup.LayoutParams params) {
  586. getDelegate().setContentView(view, params);
  587. }
  588. @Override
  589. public void addContentView(View view, ViewGroup.LayoutParams params) {
  590. getDelegate().addContentView(view, params);
  591. }
  592. @Override
  593. protected void onPostResume() {
  594. super.onPostResume();
  595. getDelegate().onPostResume();
  596. }
  597. @Override
  598. protected void onTitleChanged(CharSequence title, int color) {
  599. super.onTitleChanged(title, color);
  600. getDelegate().setTitle(title);
  601. }
  602. @Override
  603. public void onConfigurationChanged(Configuration newConfig) {
  604. super.onConfigurationChanged(newConfig);
  605. getDelegate().onConfigurationChanged(newConfig);
  606. }
  607. @Override
  608. protected void onPostCreate(Bundle savedInstanceState) {
  609. super.onPostCreate(savedInstanceState);
  610. getDelegate().onPostCreate(savedInstanceState);
  611. }
  612. @Override
  613. protected void onDestroy() {
  614. super.onDestroy();
  615. getDelegate().onDestroy();
  616. }
  617. @Override
  618. protected void onStop() {
  619. super.onStop();
  620. getDelegate().onStop();
  621. }
  622. public void invalidateOptionsMenu() {
  623. getDelegate().invalidateOptionsMenu();
  624. }
  625. private AppCompatDelegate getDelegate() {
  626. if (mDelegate == null) {
  627. mDelegate = AppCompatDelegate.create(this, null);
  628. }
  629. return mDelegate;
  630. }
  631. /**
  632. * Load upload path set on preferences
  633. */
  634. private void loadInstantUploadPath() {
  635. SharedPreferences appPrefs =
  636. PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
  637. mUploadPath = appPrefs.getString("instant_upload_path", getString(R.string.instant_upload_path));
  638. mPrefInstantUploadPath.setSummary(mUploadPath);
  639. }
  640. /**
  641. * Save storage path
  642. */
  643. private void saveStoragePath(String newStoragePath) {
  644. SharedPreferences appPrefs =
  645. PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
  646. mStoragePath = newStoragePath;
  647. MainApp.setStoragePath(mStoragePath);
  648. SharedPreferences.Editor editor = appPrefs.edit();
  649. editor.putString("storage_path", mStoragePath);
  650. editor.commit();
  651. mPrefStoragePath.setSummary(mStoragePath);
  652. }
  653. /**
  654. * Load storage path set on preferences
  655. */
  656. private void loadStoragePath() {
  657. SharedPreferences appPrefs =
  658. PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
  659. mStoragePath = appPrefs.getString("storage_path", Environment.getExternalStorageDirectory()
  660. .getAbsolutePath());
  661. mPrefStoragePath.setSummary(mStoragePath);
  662. }
  663. /**
  664. * Save the "Instant Upload Path" on preferences
  665. */
  666. private void saveInstantUploadPathOnPreferences() {
  667. SharedPreferences appPrefs =
  668. PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
  669. SharedPreferences.Editor editor = appPrefs.edit();
  670. editor.putString("instant_upload_path", mUploadPath);
  671. editor.commit();
  672. }
  673. /**
  674. * Load upload video path set on preferences
  675. */
  676. private void loadInstantUploadVideoPath() {
  677. mPrefInstantVideoUploadPath.setSummary(MainApp.getStoragePath());
  678. }
  679. /**
  680. * Save the "Instant Video Upload Path" on preferences
  681. */
  682. private void saveInstantUploadVideoPathOnPreferences() {
  683. SharedPreferences appPrefs =
  684. PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
  685. SharedPreferences.Editor editor = appPrefs.edit();
  686. editor.putString("instant_video_upload_path", mUploadVideoPath);
  687. editor.commit();
  688. }
  689. }