9f4415f65d82ff31e48a0b271da62e4df3302ef4
[pub/Android/ownCloud.git] / src / com / owncloud / android / ui / activity / Preferences.java
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) 2015 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
24 import android.accounts.Account;
25 import android.accounts.AccountManager;
26 import android.accounts.AccountManagerCallback;
27 import android.accounts.AccountManagerFuture;
28 import android.content.ComponentName;
29 import android.content.Context;
30 import android.content.Intent;
31 import android.content.ServiceConnection;
32 import android.content.SharedPreferences;
33 import android.content.pm.PackageInfo;
34 import android.content.pm.PackageManager.NameNotFoundException;
35 import android.content.res.Configuration;
36 import android.net.Uri;
37 import android.os.AsyncTask;
38 import android.os.Bundle;
39 import android.os.Handler;
40 import android.os.IBinder;
41 import android.preference.CheckBoxPreference;
42 import android.preference.Preference;
43 import android.preference.Preference.OnPreferenceChangeListener;
44 import android.preference.Preference.OnPreferenceClickListener;
45 import android.preference.PreferenceActivity;
46 import android.preference.PreferenceCategory;
47 import android.preference.PreferenceManager;
48 import android.support.annotation.LayoutRes;
49 import android.support.annotation.Nullable;
50 import android.support.v7.app.ActionBar;
51 import android.support.v7.app.AlertDialog;
52 import android.support.v7.app.AppCompatDelegate;
53 import android.support.v7.widget.Toolbar;
54 import android.view.ContextMenu;
55 import android.view.ContextMenu.ContextMenuInfo;
56 import android.view.Menu;
57 import android.view.MenuInflater;
58 import android.view.MenuItem;
59 import android.view.View;
60 import android.view.ViewGroup;
61 import android.widget.AdapterView;
62 import android.widget.AdapterView.OnItemLongClickListener;
63 import android.widget.ArrayAdapter;
64 import android.widget.ListAdapter;
65 import android.widget.ListView;
66 import android.widget.Toast;
67
68 import com.owncloud.android.BuildConfig;
69 import com.owncloud.android.MainApp;
70 import com.owncloud.android.R;
71 import com.owncloud.android.authentication.AccountUtils;
72 import com.owncloud.android.authentication.AuthenticatorActivity;
73 import com.owncloud.android.datamodel.FileDataStorageManager;
74 import com.owncloud.android.datamodel.OCFile;
75 import com.owncloud.android.datamodel.ThumbnailsCacheManager;
76 import com.owncloud.android.db.DbHandler;
77 import com.owncloud.android.files.FileOperationsHelper;
78 import com.owncloud.android.files.services.FileDownloader;
79 import com.owncloud.android.files.services.FileUploader;
80 import com.owncloud.android.lib.common.utils.Log_OC;
81 import com.owncloud.android.services.OperationsService;
82 import com.owncloud.android.ui.RadioButtonPreference;
83 import com.owncloud.android.utils.DisplayUtils;
84
85 import java.io.BufferedReader;
86 import java.io.IOException;
87 import java.io.InputStreamReader;
88 import java.net.MalformedURLException;
89 import java.net.URL;
90 import java.util.concurrent.ExecutionException;
91
92
93 /**
94 * An Activity that allows the user to change the application's settings.
95 *
96 * It proxies the necessary calls via {@link android.support.v7.app.AppCompatDelegate} to be used
97 * with AppCompat.
98 */
99 public class Preferences extends PreferenceActivity
100 implements AccountManagerCallback<Boolean>, ComponentsGetter {
101
102 private static final String TAG = "OwnCloudPreferences";
103
104 private static final int ACTION_SELECT_UPLOAD_PATH = 1;
105 private static final int ACTION_SELECT_UPLOAD_VIDEO_PATH = 2;
106
107 private DbHandler mDbHandler;
108 private CheckBoxPreference pCode;
109 private Preference pAboutApp;
110 private AppCompatDelegate mDelegate;
111
112 private PreferenceCategory mAccountsPrefCategory = null;
113 private final Handler mHandler = new Handler();
114 private String mAccountName;
115 private boolean mShowContextMenu = false;
116 private String mUploadPath;
117 private PreferenceCategory mPrefInstantUploadCategory;
118 private Preference mPrefInstantUpload;
119 private Preference mPrefInstantUploadPath;
120 private Preference mPrefInstantUploadPathWiFi;
121 private Preference mPrefInstantVideoUpload;
122 private Preference mPrefInstantVideoUploadPath;
123 private Preference mPrefInstantVideoUploadPathWiFi;
124 private String mUploadVideoPath;
125
126 protected FileDownloader.FileDownloaderBinder mDownloaderBinder = null;
127 protected FileUploader.FileUploaderBinder mUploaderBinder = null;
128 private ServiceConnection mDownloadServiceConnection, mUploadServiceConnection = null;
129
130 @SuppressWarnings("deprecation")
131 @Override
132 public void onCreate(Bundle savedInstanceState) {
133 getDelegate().installViewFactory();
134 getDelegate().onCreate(savedInstanceState);
135 super.onCreate(savedInstanceState);
136 mDbHandler = new DbHandler(getBaseContext());
137 addPreferencesFromResource(R.xml.preferences);
138
139 ActionBar actionBar = getSupportActionBar();
140 actionBar.setDisplayHomeAsUpEnabled(true);
141 actionBar.setTitle(R.string.actionbar_settings);
142
143 // For adding content description tag to a title field in the action bar
144 int actionBarTitleId = getResources().getIdentifier("action_bar_title", "id", "android");
145 View actionBarTitleView = getWindow().getDecorView().findViewById(actionBarTitleId);
146 if (actionBarTitleView != null) { // it's null in Android 2.x
147 getWindow().getDecorView().findViewById(actionBarTitleId).
148 setContentDescription(getString(R.string.actionbar_settings));
149 }
150
151 // Load the accounts category for adding the list of accounts
152 mAccountsPrefCategory = (PreferenceCategory) findPreference("accounts_category");
153
154 ListView listView = getListView();
155 listView.setOnItemLongClickListener(new OnItemLongClickListener() {
156 @Override
157 public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
158 ListView listView = (ListView) parent;
159 ListAdapter listAdapter = listView.getAdapter();
160 Object obj = listAdapter.getItem(position);
161
162 if (obj != null && obj instanceof RadioButtonPreference) {
163 mShowContextMenu = true;
164 mAccountName = ((RadioButtonPreference) obj).getKey();
165
166 String[] items = {
167 getResources().getString(R.string.change_password),
168 getResources().getString(R.string.delete_account)
169 };
170 final AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(Preferences.this);
171 View convertView = getLayoutInflater().inflate(R.layout.alert_dialog_list_view, null);
172 alertDialogBuilder.setView(convertView);
173 ListView lv = (ListView) convertView.findViewById(R.id.list);
174 ArrayAdapter<String> adapter = new ArrayAdapter<String>(
175 Preferences.this,R.layout.simple_dialog_list_item,items);
176 lv.setAdapter(adapter);
177
178 //Setup proper inline listener
179 final AlertDialog alertDialog = alertDialogBuilder.create();
180 lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
181 @Override
182 public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
183 AccountManager am = (AccountManager) getSystemService(ACCOUNT_SERVICE);
184 Account accounts[] = am.getAccountsByType(MainApp.getAccountType());
185 for (Account a : accounts) {
186 if (a.name.equals(mAccountName)) {
187 if (position==0) {
188
189 // Change account password
190 Intent updateAccountCredentials = new Intent(Preferences.this, AuthenticatorActivity.class);
191 updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, a);
192 updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACTION,
193 AuthenticatorActivity.ACTION_UPDATE_TOKEN);
194 startActivity(updateAccountCredentials);
195 alertDialog.cancel();
196
197 } else if (position==1) {
198
199 // Remove account
200 am.removeAccount(a, Preferences.this, mHandler);
201 Log_OC.d(TAG, "Remove an account " + a.name);
202 alertDialog.cancel();
203 }
204 }
205 }
206 }
207 });
208 alertDialog.show();
209
210 View.OnLongClickListener longListener = (View.OnLongClickListener) obj;
211 return longListener.onLongClick(view);
212 }
213 return false;
214 }
215 });
216
217 // Load package info
218 String temp;
219 try {
220 PackageInfo pkg = getPackageManager().getPackageInfo(getPackageName(), 0);
221 temp = pkg.versionName;
222 } catch (NameNotFoundException e) {
223 temp = "";
224 Log_OC.e(TAG, "Error while showing about dialog", e);
225 }
226 final String appVersion = temp;
227
228 // Register context menu for list of preferences.
229 registerForContextMenu(getListView());
230
231 pCode = (CheckBoxPreference) findPreference("set_pincode");
232 if (pCode != null){
233 pCode.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
234 @Override
235 public boolean onPreferenceChange(Preference preference, Object newValue) {
236 Intent i = new Intent(getApplicationContext(), PassCodeActivity.class);
237 Boolean enable = (Boolean) newValue;
238 i.setAction(
239 enable.booleanValue() ? PassCodeActivity.ACTION_ENABLE :
240 PassCodeActivity.ACTION_DISABLE
241 );
242 startActivity(i);
243
244 return true;
245 }
246 });
247
248 }
249
250 final Preference pCacheSize = findPreference("pref_cache_size");
251 if (pCacheSize != null){
252 final SharedPreferences appPrefs =
253 PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
254 Long cacheSize = ThumbnailsCacheManager.getMaxSize();
255 pCacheSize.setSummary(cacheSize + " Mb");
256 pCacheSize.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
257 @Override
258 public boolean onPreferenceChange(Preference preference, Object newValue) {
259 Long size = Long.decode((String) newValue);
260 if (ThumbnailsCacheManager.setMaxSize(size)){
261 appPrefs.edit().putString("pref_cache_size", size.toString());
262 pCacheSize.setSummary(size + " MB");
263 return true;
264 } else {
265 return false;
266 }
267 }
268 });
269 }
270
271 PreferenceCategory preferenceCategory = (PreferenceCategory) findPreference("more");
272
273 boolean helpEnabled = getResources().getBoolean(R.bool.help_enabled);
274 Preference pHelp = findPreference("help");
275 if (pHelp != null ){
276 if (helpEnabled) {
277 pHelp.setOnPreferenceClickListener(new OnPreferenceClickListener() {
278 @Override
279 public boolean onPreferenceClick(Preference preference) {
280 String helpWeb =(String) getText(R.string.url_help);
281 if (helpWeb != null && helpWeb.length() > 0) {
282 Uri uriUrl = Uri.parse(helpWeb);
283 Intent intent = new Intent(Intent.ACTION_VIEW, uriUrl);
284 startActivity(intent);
285 }
286 return true;
287 }
288 });
289 } else {
290 preferenceCategory.removePreference(pHelp);
291 }
292
293 }
294
295 if (BuildConfig.DEBUG) {
296 Preference pLog = findPreference("log");
297 if (pLog != null ){
298 pLog.setOnPreferenceClickListener(new OnPreferenceClickListener() {
299 @Override
300 public boolean onPreferenceClick(Preference preference) {
301 Intent loggerIntent = new Intent(getApplicationContext(),
302 LogHistoryActivity.class);
303 startActivity(loggerIntent);
304 return true;
305 }
306 });
307 }
308 }
309
310 boolean recommendEnabled = getResources().getBoolean(R.bool.recommend_enabled);
311 Preference pRecommend = findPreference("recommend");
312 if (pRecommend != null){
313 if (recommendEnabled) {
314 pRecommend.setOnPreferenceClickListener(new OnPreferenceClickListener() {
315 @Override
316 public boolean onPreferenceClick(Preference preference) {
317
318 Intent intent = new Intent(Intent.ACTION_SENDTO);
319 intent.setType("text/plain");
320 intent.setData(Uri.parse(getString(R.string.mail_recommend)));
321 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
322
323 String appName = getString(R.string.app_name);
324 String downloadUrl = getString(R.string.url_app_download);
325 Account currentAccount = AccountUtils.
326 getCurrentOwnCloudAccount(Preferences.this);
327 String username = currentAccount.name.substring(0,
328 currentAccount.name.lastIndexOf('@'));
329
330 String recommendSubject = String.format(getString(R.string.recommend_subject),
331 appName);
332 String recommendText = String.format(getString(R.string.recommend_text),
333 appName, downloadUrl);
334
335 intent.putExtra(Intent.EXTRA_SUBJECT, recommendSubject);
336 intent.putExtra(Intent.EXTRA_TEXT, recommendText);
337 startActivity(intent);
338
339 return(true);
340
341 }
342 });
343 } else {
344 preferenceCategory.removePreference(pRecommend);
345 }
346
347 }
348
349 boolean feedbackEnabled = getResources().getBoolean(R.bool.feedback_enabled);
350 Preference pFeedback = findPreference("feedback");
351 if (pFeedback != null){
352 if (feedbackEnabled) {
353 pFeedback.setOnPreferenceClickListener(new OnPreferenceClickListener() {
354 @Override
355 public boolean onPreferenceClick(Preference preference) {
356 String feedbackMail =(String) getText(R.string.mail_feedback);
357 String feedback =(String) getText(R.string.prefs_feedback) + " - android v" + appVersion;
358 Intent intent = new Intent(Intent.ACTION_SENDTO);
359 intent.setType("text/plain");
360 intent.putExtra(Intent.EXTRA_SUBJECT, feedback);
361
362 intent.setData(Uri.parse(feedbackMail));
363 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
364 startActivity(intent);
365
366 return true;
367 }
368 });
369 } else {
370 preferenceCategory.removePreference(pFeedback);
371 }
372
373 }
374
375 boolean imprintEnabled = getResources().getBoolean(R.bool.imprint_enabled);
376 Preference pImprint = findPreference("imprint");
377 if (pImprint != null) {
378 if (imprintEnabled) {
379 pImprint.setOnPreferenceClickListener(new OnPreferenceClickListener() {
380 @Override
381 public boolean onPreferenceClick(Preference preference) {
382 String imprintWeb = (String) getText(R.string.url_imprint);
383 if (imprintWeb != null && imprintWeb.length() > 0) {
384 Uri uriUrl = Uri.parse(imprintWeb);
385 Intent intent = new Intent(Intent.ACTION_VIEW, uriUrl);
386 startActivity(intent);
387 }
388 //ImprintDialog.newInstance(true).show(preference.get, "IMPRINT_DIALOG");
389 return true;
390 }
391 });
392 } else {
393 preferenceCategory.removePreference(pImprint);
394 }
395 }
396
397 mPrefInstantUploadPath = findPreference("instant_upload_path");
398 if (mPrefInstantUploadPath != null){
399
400 mPrefInstantUploadPath.setOnPreferenceClickListener(new OnPreferenceClickListener() {
401 @Override
402 public boolean onPreferenceClick(Preference preference) {
403 if (!mUploadPath.endsWith(OCFile.PATH_SEPARATOR)) {
404 mUploadPath += OCFile.PATH_SEPARATOR;
405 }
406 Intent intent = new Intent(Preferences.this, UploadPathActivity.class);
407 intent.putExtra(UploadPathActivity.KEY_INSTANT_UPLOAD_PATH, mUploadPath);
408 startActivityForResult(intent, ACTION_SELECT_UPLOAD_PATH);
409 return true;
410 }
411 });
412 }
413
414 mPrefInstantUploadCategory =
415 (PreferenceCategory) findPreference("instant_uploading_category");
416
417 mPrefInstantUploadPathWiFi = findPreference("instant_upload_on_wifi");
418 mPrefInstantUpload = findPreference("instant_uploading");
419
420 toggleInstantPictureOptions(((CheckBoxPreference) mPrefInstantUpload).isChecked());
421
422 mPrefInstantUpload.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
423
424 @Override
425 public boolean onPreferenceChange(Preference preference, Object newValue) {
426 toggleInstantPictureOptions((Boolean) newValue);
427 return true;
428 }
429 });
430
431 mPrefInstantVideoUploadPath = findPreference("instant_video_upload_path");
432 if (mPrefInstantVideoUploadPath != null){
433
434 mPrefInstantVideoUploadPath.setOnPreferenceClickListener(new OnPreferenceClickListener() {
435 @Override
436 public boolean onPreferenceClick(Preference preference) {
437 if (!mUploadVideoPath.endsWith(OCFile.PATH_SEPARATOR)) {
438 mUploadVideoPath += OCFile.PATH_SEPARATOR;
439 }
440 Intent intent = new Intent(Preferences.this, UploadPathActivity.class);
441 intent.putExtra(UploadPathActivity.KEY_INSTANT_UPLOAD_PATH,
442 mUploadVideoPath);
443 startActivityForResult(intent, ACTION_SELECT_UPLOAD_VIDEO_PATH);
444 return true;
445 }
446 });
447 }
448
449 mPrefInstantVideoUploadPathWiFi = findPreference("instant_video_upload_on_wifi");
450 mPrefInstantVideoUpload = findPreference("instant_video_uploading");
451 toggleInstantVideoOptions(((CheckBoxPreference) mPrefInstantVideoUpload).isChecked());
452
453 mPrefInstantVideoUpload.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
454
455 @Override
456 public boolean onPreferenceChange(Preference preference, Object newValue) {
457 toggleInstantVideoOptions((Boolean) newValue);
458 return true;
459 }
460 });
461
462 /* About App */
463 pAboutApp = (Preference) findPreference("about_app");
464 if (pAboutApp != null) {
465 pAboutApp.setTitle(String.format(getString(R.string.about_android), getString(R.string.app_name)));
466 pAboutApp.setSummary(String.format(getString(R.string.about_version), appVersion));
467 }
468
469 loadInstantUploadPath();
470 loadInstantUploadVideoPath();
471
472 /* ComponentsGetter */
473 mDownloadServiceConnection = newTransferenceServiceConnection();
474 if (mDownloadServiceConnection != null) {
475 bindService(new Intent(this, FileDownloader.class), mDownloadServiceConnection,
476 Context.BIND_AUTO_CREATE);
477 }
478 mUploadServiceConnection = newTransferenceServiceConnection();
479 if (mUploadServiceConnection != null) {
480 bindService(new Intent(this, FileUploader.class), mUploadServiceConnection,
481 Context.BIND_AUTO_CREATE);
482 }
483
484 /* Link to Beta apks */
485 Preference pBetaLink = findPreference("beta_link");
486 if (pBetaLink != null ){
487 pBetaLink.setOnPreferenceClickListener(new OnPreferenceClickListener() {
488 @Override
489 public boolean onPreferenceClick(Preference preference) {
490 Integer currentVersion = BuildConfig.VERSION_CODE;
491 LoadingVersionNumberTask loadTask = new LoadingVersionNumberTask();
492 loadTask.execute();
493 Integer latestVersion = -1;
494 try {
495 latestVersion = loadTask.get();
496 } catch (InterruptedException | ExecutionException e) {
497 e.printStackTrace();
498 }
499 if (latestVersion == -1){
500 Toast.makeText(getApplicationContext(), "No information available!", Toast.LENGTH_SHORT).show();
501 }
502 if (latestVersion > currentVersion){
503 String betaLinkWeb = (String) getText(R.string.beta_link) + latestVersion + ".apk";
504 if (betaLinkWeb != null && betaLinkWeb.length() > 0) {
505 Uri uriUrl = Uri.parse(betaLinkWeb);
506 Intent intent = new Intent(Intent.ACTION_VIEW, uriUrl);
507 startActivity(intent);
508 return true;
509 }
510 } else {
511 Toast.makeText(getApplicationContext(), "No new version available!", Toast.LENGTH_SHORT).show();
512 return true;
513 }
514 return true;
515 }
516 });
517 }
518 }
519
520 private void toggleInstantPictureOptions(Boolean value){
521 if (value){
522 mPrefInstantUploadCategory.addPreference(mPrefInstantUploadPathWiFi);
523 mPrefInstantUploadCategory.addPreference(mPrefInstantUploadPath);
524 } else {
525 // mPrefInstantUploadCategory.removePreference(mPrefInstantUploadPathWiFi);
526 // mPrefInstantUploadCategory.removePreference(mPrefInstantUploadPath);
527 }
528 }
529
530 private void toggleInstantVideoOptions(Boolean value){
531 if (value){
532 mPrefInstantUploadCategory.addPreference(mPrefInstantVideoUploadPathWiFi);
533 mPrefInstantUploadCategory.addPreference(mPrefInstantVideoUploadPath);
534 } else {
535 // mPrefInstantUploadCategory.removePreference(mPrefInstantVideoUploadPathWiFi);
536 // mPrefInstantUploadCategory.removePreference(mPrefInstantVideoUploadPath);
537 }
538 }
539
540 @Override
541 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
542
543 // Filter for only showing contextual menu when long press on the
544 // accounts
545 if (mShowContextMenu) {
546 getMenuInflater().inflate(R.menu.account_picker_long_click, menu);
547 mShowContextMenu = false;
548 }
549 super.onCreateContextMenu(menu, v, menuInfo);
550 }
551
552 @Override
553 public void run(AccountManagerFuture<Boolean> future) {
554 if (future.isDone()) {
555 // after remove account
556 Account account = new Account(mAccountName, MainApp.getAccountType());
557 if (!AccountUtils.exists(account, MainApp.getAppContext())) {
558 // Cancel tranfers
559 if (mUploaderBinder != null) {
560 mUploaderBinder.cancel(account);
561 }
562 if (mDownloaderBinder != null) {
563 mDownloaderBinder.cancel(account);
564 }
565 }
566
567 Account a = AccountUtils.getCurrentOwnCloudAccount(this);
568 String accountName = "";
569 if (a == null) {
570 Account[] accounts = AccountManager.get(this)
571 .getAccountsByType(MainApp.getAccountType());
572 if (accounts.length != 0)
573 accountName = accounts[0].name;
574 AccountUtils.setCurrentOwnCloudAccount(this, accountName);
575 }
576 addAccountsCheckboxPreferences();
577 }
578 }
579
580 @Override
581 protected void onResume() {
582 super.onResume();
583 SharedPreferences appPrefs =
584 PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
585 boolean state = appPrefs.getBoolean("set_pincode", false);
586 pCode.setChecked(state);
587
588 // Populate the accounts category with the list of accounts
589 addAccountsCheckboxPreferences();
590 }
591
592 @Override
593 public boolean onCreateOptionsMenu(Menu menu) {
594 super.onCreateOptionsMenu(menu);
595 return true;
596 }
597
598 @Override
599 public boolean onMenuItemSelected(int featureId, MenuItem item) {
600 super.onMenuItemSelected(featureId, item);
601 Intent intent;
602
603 switch (item.getItemId()) {
604 case android.R.id.home:
605 intent = new Intent(getBaseContext(), FileDisplayActivity.class);
606 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
607 startActivity(intent);
608 break;
609 default:
610 Log_OC.w(TAG, "Unknown menu item triggered");
611 return false;
612 }
613 return true;
614 }
615
616 @Override
617 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
618 super.onActivityResult(requestCode, resultCode, data);
619
620 if (requestCode == ACTION_SELECT_UPLOAD_PATH && resultCode == RESULT_OK){
621
622 OCFile folderToUpload =
623 (OCFile) data.getParcelableExtra(UploadPathActivity.EXTRA_FOLDER);
624
625 mUploadPath = folderToUpload.getRemotePath();
626
627 mUploadPath = DisplayUtils.getPathWithoutLastSlash(mUploadPath);
628
629 // Show the path on summary preference
630 mPrefInstantUploadPath.setSummary(mUploadPath);
631
632 saveInstantUploadPathOnPreferences();
633
634 } else if (requestCode == ACTION_SELECT_UPLOAD_VIDEO_PATH && resultCode == RESULT_OK){
635
636 OCFile folderToUploadVideo =
637 (OCFile) data.getParcelableExtra(UploadPathActivity.EXTRA_FOLDER);
638
639 mUploadVideoPath = folderToUploadVideo.getRemotePath();
640
641 mUploadVideoPath = DisplayUtils.getPathWithoutLastSlash(mUploadVideoPath);
642
643 // Show the video path on summary preference
644 mPrefInstantVideoUploadPath.setSummary(mUploadVideoPath);
645
646 saveInstantUploadVideoPathOnPreferences();
647 }
648 }
649
650 public ActionBar getSupportActionBar() {
651 return getDelegate().getSupportActionBar();
652 }
653
654 public void setSupportActionBar(@Nullable Toolbar toolbar) {
655 getDelegate().setSupportActionBar(toolbar);
656 }
657
658 @Override
659 public MenuInflater getMenuInflater() {
660 return getDelegate().getMenuInflater();
661 }
662
663 @Override
664 public void setContentView(@LayoutRes int layoutResID) {
665 getDelegate().setContentView(layoutResID);
666 }
667 @Override
668 public void setContentView(View view) {
669 getDelegate().setContentView(view);
670 }
671
672 @Override
673 public void setContentView(View view, ViewGroup.LayoutParams params) {
674 getDelegate().setContentView(view, params);
675 }
676
677 @Override
678 public void addContentView(View view, ViewGroup.LayoutParams params) {
679 getDelegate().addContentView(view, params);
680 }
681
682 @Override
683 protected void onPostResume() {
684 super.onPostResume();
685 getDelegate().onPostResume();
686 }
687
688 @Override
689 protected void onTitleChanged(CharSequence title, int color) {
690 super.onTitleChanged(title, color);
691 getDelegate().setTitle(title);
692 }
693
694 @Override
695 public void onConfigurationChanged(Configuration newConfig) {
696 super.onConfigurationChanged(newConfig);
697 getDelegate().onConfigurationChanged(newConfig);
698 }
699
700 @Override
701 protected void onPostCreate(Bundle savedInstanceState) {
702 super.onPostCreate(savedInstanceState);
703 getDelegate().onPostCreate(savedInstanceState);
704 }
705
706 @Override
707 protected void onDestroy() {
708 mDbHandler.close();
709
710 if (mDownloadServiceConnection != null) {
711 unbindService(mDownloadServiceConnection);
712 mDownloadServiceConnection = null;
713 }
714 if (mUploadServiceConnection != null) {
715 unbindService(mUploadServiceConnection);
716 mUploadServiceConnection = null;
717 }
718
719 super.onDestroy();
720 getDelegate().onDestroy();
721 }
722
723 @Override
724 protected void onStop() {
725 super.onStop();
726 getDelegate().onStop();
727 }
728
729 public void invalidateOptionsMenu() {
730 getDelegate().invalidateOptionsMenu();
731 }
732
733 private AppCompatDelegate getDelegate() {
734 if (mDelegate == null) {
735 mDelegate = AppCompatDelegate.create(this, null);
736 }
737 return mDelegate;
738 }
739
740 /**
741 * Create the list of accounts that has been added into the app
742 */
743 @SuppressWarnings("deprecation")
744 private void addAccountsCheckboxPreferences() {
745
746 // Remove accounts in case list is refreshing for avoiding to have
747 // duplicate items
748 if (mAccountsPrefCategory.getPreferenceCount() > 0) {
749 mAccountsPrefCategory.removeAll();
750 }
751
752 AccountManager am = (AccountManager) getSystemService(ACCOUNT_SERVICE);
753 Account accounts[] = am.getAccountsByType(MainApp.getAccountType());
754 Account currentAccount = AccountUtils.getCurrentOwnCloudAccount(getApplicationContext());
755
756 if (am.getAccountsByType(MainApp.getAccountType()).length == 0) {
757 // Show create account screen if there isn't any account
758 am.addAccount(MainApp.getAccountType(), null, null, null, this,
759 null,
760 null);
761 }
762 else {
763
764 for (Account a : accounts) {
765 RadioButtonPreference accountPreference = new RadioButtonPreference(this);
766 accountPreference.setKey(a.name);
767 // Handle internationalized domain names
768 accountPreference.setTitle(DisplayUtils.convertIdn(a.name, false));
769 mAccountsPrefCategory.addPreference(accountPreference);
770
771 // Check the current account that is being used
772 if (a.name.equals(currentAccount.name)) {
773 accountPreference.setChecked(true);
774 } else {
775 accountPreference.setChecked(false);
776 }
777
778 accountPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
779 @Override
780 public boolean onPreferenceChange(Preference preference, Object newValue) {
781 String key = preference.getKey();
782 AccountManager am = (AccountManager) getSystemService(ACCOUNT_SERVICE);
783 Account accounts[] = am.getAccountsByType(MainApp.getAccountType());
784 for (Account a : accounts) {
785 RadioButtonPreference p =
786 (RadioButtonPreference) findPreference(a.name);
787 if (key.equals(a.name)) {
788 boolean accountChanged = !p.isChecked();
789 p.setChecked(true);
790 AccountUtils.setCurrentOwnCloudAccount(
791 getApplicationContext(),
792 a.name
793 );
794 if (accountChanged) {
795 // restart the main activity
796 Intent i = new Intent(
797 Preferences.this,
798 FileDisplayActivity.class
799 );
800 i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
801 i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
802 startActivity(i);
803 } else {
804 finish();
805 }
806 } else {
807 p.setChecked(false);
808 }
809 }
810 return (Boolean) newValue;
811 }
812 });
813
814 }
815
816 // Add Create Account preference at the end of account list if
817 // Multiaccount is enabled
818 if (getResources().getBoolean(R.bool.multiaccount_support)) {
819 createAddAccountPreference();
820 }
821
822 }
823 }
824
825 /**
826 * Create the preference for allow adding new accounts
827 */
828 private void createAddAccountPreference() {
829 Preference addAccountPref = new Preference(this);
830 addAccountPref.setKey("add_account");
831 addAccountPref.setTitle(getString(R.string.prefs_add_account));
832 mAccountsPrefCategory.addPreference(addAccountPref);
833
834 addAccountPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
835 @Override
836 public boolean onPreferenceClick(Preference preference) {
837 AccountManager am = AccountManager.get(getApplicationContext());
838 am.addAccount(MainApp.getAccountType(), null, null, null, Preferences.this,
839 null, null);
840 return true;
841 }
842 });
843
844 }
845
846 /**
847 * Load upload path set on preferences
848 */
849 private void loadInstantUploadPath() {
850 SharedPreferences appPrefs =
851 PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
852 mUploadPath = appPrefs.getString("instant_upload_path", getString(R.string.instant_upload_path));
853 mPrefInstantUploadPath.setSummary(mUploadPath);
854 }
855
856 /**
857 * Save the "Instant Upload Path" on preferences
858 */
859 private void saveInstantUploadPathOnPreferences() {
860 SharedPreferences appPrefs =
861 PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
862 SharedPreferences.Editor editor = appPrefs.edit();
863 editor.putString("instant_upload_path", mUploadPath);
864 editor.commit();
865 }
866
867 /**
868 * Load upload video path set on preferences
869 */
870 private void loadInstantUploadVideoPath() {
871 SharedPreferences appPrefs =
872 PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
873 mUploadVideoPath = appPrefs.getString("instant_video_upload_path", getString(R.string.instant_upload_path));
874 // mPrefInstantVideoUploadPath.setSummary(mUploadVideoPath);
875 }
876
877 /**
878 * Save the "Instant Video Upload Path" on preferences
879 */
880 private void saveInstantUploadVideoPathOnPreferences() {
881 SharedPreferences appPrefs =
882 PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
883 SharedPreferences.Editor editor = appPrefs.edit();
884 editor.putString("instant_video_upload_path", mUploadVideoPath);
885 editor.commit();
886 }
887
888 // Methods for ComponetsGetter
889 @Override
890 public FileDownloader.FileDownloaderBinder getFileDownloaderBinder() {
891 return mDownloaderBinder;
892 }
893
894
895 @Override
896 public FileUploader.FileUploaderBinder getFileUploaderBinder() {
897 return mUploaderBinder;
898 }
899
900 @Override
901 public OperationsService.OperationsServiceBinder getOperationsServiceBinder() {
902 return null;
903 }
904
905 @Override
906 public FileDataStorageManager getStorageManager() {
907 return null;
908 }
909
910 @Override
911 public FileOperationsHelper getFileOperationsHelper() {
912 return null;
913 }
914
915 protected ServiceConnection newTransferenceServiceConnection() {
916 return new PreferencesServiceConnection();
917 }
918
919 /** Defines callbacks for service binding, passed to bindService() */
920 private class PreferencesServiceConnection implements ServiceConnection {
921
922 @Override
923 public void onServiceConnected(ComponentName component, IBinder service) {
924
925 if (component.equals(new ComponentName(Preferences.this, FileDownloader.class))) {
926 mDownloaderBinder = (FileDownloader.FileDownloaderBinder) service;
927
928 } else if (component.equals(new ComponentName(Preferences.this, FileUploader.class))) {
929 Log_OC.d(TAG, "Upload service connected");
930 mUploaderBinder = (FileUploader.FileUploaderBinder) service;
931 } else {
932 return;
933 }
934
935 }
936
937 @Override
938 public void onServiceDisconnected(ComponentName component) {
939 if (component.equals(new ComponentName(Preferences.this, FileDownloader.class))) {
940 Log_OC.d(TAG, "Download service suddenly disconnected");
941 mDownloaderBinder = null;
942 } else if (component.equals(new ComponentName(Preferences.this, FileUploader.class))) {
943 Log_OC.d(TAG, "Upload service suddenly disconnected");
944 mUploaderBinder = null;
945 }
946 }
947 };
948
949 /**
950 *
951 * Class for loading the version number
952 *
953 */
954 private class LoadingVersionNumberTask extends AsyncTask<Void, Void, Integer> {
955 protected Integer doInBackground(Void... args) {
956 try {
957 URL url = new URL("https://github.com/owncloud/android/blob/beta/apks/latest");
958 BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
959
960 Integer latestVersion = Integer.parseInt(in.readLine());
961 in.close();
962
963 return latestVersion;
964
965 } catch (MalformedURLException e) {
966 e.printStackTrace();
967 } catch (IOException e) {
968 e.printStackTrace();
969 }
970 return -1;
971 }
972 }
973 }