Versionstring shows YYYYMMDD
[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), BuildConfig.VERSION_CODE));
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 /* Link to Beta apks */
520 Preference pChangelogLink = findPreference("changelog_link");
521 if (pChangelogLink != null){
522 pChangelogLink.setOnPreferenceClickListener(new OnPreferenceClickListener() {
523 @Override
524 public boolean onPreferenceClick(Preference preference) {
525 String betaLinkWeb = getString(R.string.changelog);
526 if (betaLinkWeb != null && betaLinkWeb.length() > 0) {
527 Uri uriUrl = Uri.parse(betaLinkWeb);
528 Intent intent = new Intent(Intent.ACTION_VIEW, uriUrl);
529 startActivity(intent);
530 return true;
531 }
532 return true;
533 }
534 });
535 }
536 }
537
538 private void toggleInstantPictureOptions(Boolean value){
539 if (value){
540 mPrefInstantUploadCategory.addPreference(mPrefInstantUploadPathWiFi);
541 mPrefInstantUploadCategory.addPreference(mPrefInstantUploadPath);
542 } else {
543 // mPrefInstantUploadCategory.removePreference(mPrefInstantUploadPathWiFi);
544 // mPrefInstantUploadCategory.removePreference(mPrefInstantUploadPath);
545 }
546 }
547
548 private void toggleInstantVideoOptions(Boolean value){
549 if (value){
550 mPrefInstantUploadCategory.addPreference(mPrefInstantVideoUploadPathWiFi);
551 mPrefInstantUploadCategory.addPreference(mPrefInstantVideoUploadPath);
552 } else {
553 // mPrefInstantUploadCategory.removePreference(mPrefInstantVideoUploadPathWiFi);
554 // mPrefInstantUploadCategory.removePreference(mPrefInstantVideoUploadPath);
555 }
556 }
557
558 @Override
559 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
560
561 // Filter for only showing contextual menu when long press on the
562 // accounts
563 if (mShowContextMenu) {
564 getMenuInflater().inflate(R.menu.account_picker_long_click, menu);
565 mShowContextMenu = false;
566 }
567 super.onCreateContextMenu(menu, v, menuInfo);
568 }
569
570 @Override
571 public void run(AccountManagerFuture<Boolean> future) {
572 if (future.isDone()) {
573 // after remove account
574 Account account = new Account(mAccountName, MainApp.getAccountType());
575 if (!AccountUtils.exists(account, MainApp.getAppContext())) {
576 // Cancel tranfers
577 if (mUploaderBinder != null) {
578 mUploaderBinder.cancel(account);
579 }
580 if (mDownloaderBinder != null) {
581 mDownloaderBinder.cancel(account);
582 }
583 }
584
585 Account a = AccountUtils.getCurrentOwnCloudAccount(this);
586 String accountName = "";
587 if (a == null) {
588 Account[] accounts = AccountManager.get(this)
589 .getAccountsByType(MainApp.getAccountType());
590 if (accounts.length != 0)
591 accountName = accounts[0].name;
592 AccountUtils.setCurrentOwnCloudAccount(this, accountName);
593 }
594 addAccountsCheckboxPreferences();
595 }
596 }
597
598 @Override
599 protected void onResume() {
600 super.onResume();
601 SharedPreferences appPrefs =
602 PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
603 boolean state = appPrefs.getBoolean("set_pincode", false);
604 pCode.setChecked(state);
605
606 // Populate the accounts category with the list of accounts
607 addAccountsCheckboxPreferences();
608 }
609
610 @Override
611 public boolean onCreateOptionsMenu(Menu menu) {
612 super.onCreateOptionsMenu(menu);
613 return true;
614 }
615
616 @Override
617 public boolean onMenuItemSelected(int featureId, MenuItem item) {
618 super.onMenuItemSelected(featureId, item);
619 Intent intent;
620
621 switch (item.getItemId()) {
622 case android.R.id.home:
623 intent = new Intent(getBaseContext(), FileDisplayActivity.class);
624 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
625 startActivity(intent);
626 break;
627 default:
628 Log_OC.w(TAG, "Unknown menu item triggered");
629 return false;
630 }
631 return true;
632 }
633
634 @Override
635 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
636 super.onActivityResult(requestCode, resultCode, data);
637
638 if (requestCode == ACTION_SELECT_UPLOAD_PATH && resultCode == RESULT_OK){
639
640 OCFile folderToUpload =
641 (OCFile) data.getParcelableExtra(UploadPathActivity.EXTRA_FOLDER);
642
643 mUploadPath = folderToUpload.getRemotePath();
644
645 mUploadPath = DisplayUtils.getPathWithoutLastSlash(mUploadPath);
646
647 // Show the path on summary preference
648 mPrefInstantUploadPath.setSummary(mUploadPath);
649
650 saveInstantUploadPathOnPreferences();
651
652 } else if (requestCode == ACTION_SELECT_UPLOAD_VIDEO_PATH && resultCode == RESULT_OK){
653
654 OCFile folderToUploadVideo =
655 (OCFile) data.getParcelableExtra(UploadPathActivity.EXTRA_FOLDER);
656
657 mUploadVideoPath = folderToUploadVideo.getRemotePath();
658
659 mUploadVideoPath = DisplayUtils.getPathWithoutLastSlash(mUploadVideoPath);
660
661 // Show the video path on summary preference
662 mPrefInstantVideoUploadPath.setSummary(mUploadVideoPath);
663
664 saveInstantUploadVideoPathOnPreferences();
665 }
666 }
667
668 public ActionBar getSupportActionBar() {
669 return getDelegate().getSupportActionBar();
670 }
671
672 public void setSupportActionBar(@Nullable Toolbar toolbar) {
673 getDelegate().setSupportActionBar(toolbar);
674 }
675
676 @Override
677 public MenuInflater getMenuInflater() {
678 return getDelegate().getMenuInflater();
679 }
680
681 @Override
682 public void setContentView(@LayoutRes int layoutResID) {
683 getDelegate().setContentView(layoutResID);
684 }
685 @Override
686 public void setContentView(View view) {
687 getDelegate().setContentView(view);
688 }
689
690 @Override
691 public void setContentView(View view, ViewGroup.LayoutParams params) {
692 getDelegate().setContentView(view, params);
693 }
694
695 @Override
696 public void addContentView(View view, ViewGroup.LayoutParams params) {
697 getDelegate().addContentView(view, params);
698 }
699
700 @Override
701 protected void onPostResume() {
702 super.onPostResume();
703 getDelegate().onPostResume();
704 }
705
706 @Override
707 protected void onTitleChanged(CharSequence title, int color) {
708 super.onTitleChanged(title, color);
709 getDelegate().setTitle(title);
710 }
711
712 @Override
713 public void onConfigurationChanged(Configuration newConfig) {
714 super.onConfigurationChanged(newConfig);
715 getDelegate().onConfigurationChanged(newConfig);
716 }
717
718 @Override
719 protected void onPostCreate(Bundle savedInstanceState) {
720 super.onPostCreate(savedInstanceState);
721 getDelegate().onPostCreate(savedInstanceState);
722 }
723
724 @Override
725 protected void onDestroy() {
726 mDbHandler.close();
727
728 if (mDownloadServiceConnection != null) {
729 unbindService(mDownloadServiceConnection);
730 mDownloadServiceConnection = null;
731 }
732 if (mUploadServiceConnection != null) {
733 unbindService(mUploadServiceConnection);
734 mUploadServiceConnection = null;
735 }
736
737 super.onDestroy();
738 getDelegate().onDestroy();
739 }
740
741 @Override
742 protected void onStop() {
743 super.onStop();
744 getDelegate().onStop();
745 }
746
747 public void invalidateOptionsMenu() {
748 getDelegate().invalidateOptionsMenu();
749 }
750
751 private AppCompatDelegate getDelegate() {
752 if (mDelegate == null) {
753 mDelegate = AppCompatDelegate.create(this, null);
754 }
755 return mDelegate;
756 }
757
758 /**
759 * Create the list of accounts that has been added into the app
760 */
761 @SuppressWarnings("deprecation")
762 private void addAccountsCheckboxPreferences() {
763
764 // Remove accounts in case list is refreshing for avoiding to have
765 // duplicate items
766 if (mAccountsPrefCategory.getPreferenceCount() > 0) {
767 mAccountsPrefCategory.removeAll();
768 }
769
770 AccountManager am = (AccountManager) getSystemService(ACCOUNT_SERVICE);
771 Account accounts[] = am.getAccountsByType(MainApp.getAccountType());
772 Account currentAccount = AccountUtils.getCurrentOwnCloudAccount(getApplicationContext());
773
774 if (am.getAccountsByType(MainApp.getAccountType()).length == 0) {
775 // Show create account screen if there isn't any account
776 am.addAccount(MainApp.getAccountType(), null, null, null, this,
777 null,
778 null);
779 }
780 else {
781
782 for (Account a : accounts) {
783 RadioButtonPreference accountPreference = new RadioButtonPreference(this);
784 accountPreference.setKey(a.name);
785 // Handle internationalized domain names
786 accountPreference.setTitle(DisplayUtils.convertIdn(a.name, false));
787 mAccountsPrefCategory.addPreference(accountPreference);
788
789 // Check the current account that is being used
790 if (a.name.equals(currentAccount.name)) {
791 accountPreference.setChecked(true);
792 } else {
793 accountPreference.setChecked(false);
794 }
795
796 accountPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
797 @Override
798 public boolean onPreferenceChange(Preference preference, Object newValue) {
799 String key = preference.getKey();
800 AccountManager am = (AccountManager) getSystemService(ACCOUNT_SERVICE);
801 Account accounts[] = am.getAccountsByType(MainApp.getAccountType());
802 for (Account a : accounts) {
803 RadioButtonPreference p =
804 (RadioButtonPreference) findPreference(a.name);
805 if (key.equals(a.name)) {
806 boolean accountChanged = !p.isChecked();
807 p.setChecked(true);
808 AccountUtils.setCurrentOwnCloudAccount(
809 getApplicationContext(),
810 a.name
811 );
812 if (accountChanged) {
813 // restart the main activity
814 Intent i = new Intent(
815 Preferences.this,
816 FileDisplayActivity.class
817 );
818 i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
819 i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
820 startActivity(i);
821 } else {
822 finish();
823 }
824 } else {
825 p.setChecked(false);
826 }
827 }
828 return (Boolean) newValue;
829 }
830 });
831
832 }
833
834 // Add Create Account preference at the end of account list if
835 // Multiaccount is enabled
836 if (getResources().getBoolean(R.bool.multiaccount_support)) {
837 createAddAccountPreference();
838 }
839
840 }
841 }
842
843 /**
844 * Create the preference for allow adding new accounts
845 */
846 private void createAddAccountPreference() {
847 Preference addAccountPref = new Preference(this);
848 addAccountPref.setKey("add_account");
849 addAccountPref.setTitle(getString(R.string.prefs_add_account));
850 mAccountsPrefCategory.addPreference(addAccountPref);
851
852 addAccountPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
853 @Override
854 public boolean onPreferenceClick(Preference preference) {
855 AccountManager am = AccountManager.get(getApplicationContext());
856 am.addAccount(MainApp.getAccountType(), null, null, null, Preferences.this,
857 null, null);
858 return true;
859 }
860 });
861
862 }
863
864 /**
865 * Load upload path set on preferences
866 */
867 private void loadInstantUploadPath() {
868 SharedPreferences appPrefs =
869 PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
870 mUploadPath = appPrefs.getString("instant_upload_path", getString(R.string.instant_upload_path));
871 mPrefInstantUploadPath.setSummary(mUploadPath);
872 }
873
874 /**
875 * Save the "Instant Upload Path" on preferences
876 */
877 private void saveInstantUploadPathOnPreferences() {
878 SharedPreferences appPrefs =
879 PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
880 SharedPreferences.Editor editor = appPrefs.edit();
881 editor.putString("instant_upload_path", mUploadPath);
882 editor.commit();
883 }
884
885 /**
886 * Load upload video path set on preferences
887 */
888 private void loadInstantUploadVideoPath() {
889 SharedPreferences appPrefs =
890 PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
891 mUploadVideoPath = appPrefs.getString("instant_video_upload_path", getString(R.string.instant_upload_path));
892 // mPrefInstantVideoUploadPath.setSummary(mUploadVideoPath);
893 }
894
895 /**
896 * Save the "Instant Video Upload Path" on preferences
897 */
898 private void saveInstantUploadVideoPathOnPreferences() {
899 SharedPreferences appPrefs =
900 PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
901 SharedPreferences.Editor editor = appPrefs.edit();
902 editor.putString("instant_video_upload_path", mUploadVideoPath);
903 editor.commit();
904 }
905
906 // Methods for ComponetsGetter
907 @Override
908 public FileDownloader.FileDownloaderBinder getFileDownloaderBinder() {
909 return mDownloaderBinder;
910 }
911
912
913 @Override
914 public FileUploader.FileUploaderBinder getFileUploaderBinder() {
915 return mUploaderBinder;
916 }
917
918 @Override
919 public OperationsService.OperationsServiceBinder getOperationsServiceBinder() {
920 return null;
921 }
922
923 @Override
924 public FileDataStorageManager getStorageManager() {
925 return null;
926 }
927
928 @Override
929 public FileOperationsHelper getFileOperationsHelper() {
930 return null;
931 }
932
933 protected ServiceConnection newTransferenceServiceConnection() {
934 return new PreferencesServiceConnection();
935 }
936
937 /** Defines callbacks for service binding, passed to bindService() */
938 private class PreferencesServiceConnection implements ServiceConnection {
939
940 @Override
941 public void onServiceConnected(ComponentName component, IBinder service) {
942
943 if (component.equals(new ComponentName(Preferences.this, FileDownloader.class))) {
944 mDownloaderBinder = (FileDownloader.FileDownloaderBinder) service;
945
946 } else if (component.equals(new ComponentName(Preferences.this, FileUploader.class))) {
947 Log_OC.d(TAG, "Upload service connected");
948 mUploaderBinder = (FileUploader.FileUploaderBinder) service;
949 } else {
950 return;
951 }
952
953 }
954
955 @Override
956 public void onServiceDisconnected(ComponentName component) {
957 if (component.equals(new ComponentName(Preferences.this, FileDownloader.class))) {
958 Log_OC.d(TAG, "Download service suddenly disconnected");
959 mDownloaderBinder = null;
960 } else if (component.equals(new ComponentName(Preferences.this, FileUploader.class))) {
961 Log_OC.d(TAG, "Upload service suddenly disconnected");
962 mUploaderBinder = null;
963 }
964 }
965 };
966
967 /**
968 *
969 * Class for loading the version number
970 *
971 */
972 private class LoadingVersionNumberTask extends AsyncTask<Void, Void, Integer> {
973 protected Integer doInBackground(Void... args) {
974 try {
975 URL url = new URL("https://github.com/owncloud/android/raw/beta/apks/latest");
976 BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
977
978 Integer latestVersion = Integer.parseInt(in.readLine());
979 in.close();
980
981 return latestVersion;
982
983 } catch (MalformedURLException e) {
984 e.printStackTrace();
985 } catch (IOException e) {
986 e.printStackTrace();
987 }
988 return -1;
989 }
990 }
991 }