From f4032ba6011a209b9ae4b6834cef79c2b45f828d Mon Sep 17 00:00:00 2001 From: jmpascal Date: Thu, 25 Feb 2016 15:27:29 +0100 Subject: [PATCH 01/25] ANDROID-8 --- alfresco-mobile-android/build.gradle | 2 +- .../src/main/AndroidManifest.xml | 4 +- .../application/activity/BaseActivity.java | 27 ++++++++ .../FileExplorerMenuFragment.java | 64 ++++++++++++++++++- platform/foundation/build.gradle | 2 +- 5 files changed, 94 insertions(+), 5 deletions(-) diff --git a/alfresco-mobile-android/build.gradle b/alfresco-mobile-android/build.gradle index 2e2d7020..15f71727 100644 --- a/alfresco-mobile-android/build.gradle +++ b/alfresco-mobile-android/build.gradle @@ -26,7 +26,7 @@ android { applicationId APPLICATION_ID minSdkVersion 15 - targetSdkVersion 22 + targetSdkVersion 23 versionCode 60 versionName VERSION_NAME diff --git a/alfresco-mobile-android/src/main/AndroidManifest.xml b/alfresco-mobile-android/src/main/AndroidManifest.xml index 343307fe..fe7737fd 100644 --- a/alfresco-mobile-android/src/main/AndroidManifest.xml +++ b/alfresco-mobile-android/src/main/AndroidManifest.xml @@ -28,7 +28,9 @@ - + diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/activity/BaseActivity.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/activity/BaseActivity.java index f8dff88a..180def30 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/activity/BaseActivity.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/activity/BaseActivity.java @@ -28,12 +28,14 @@ import org.alfresco.mobile.android.ui.utils.UIUtils; import android.content.Intent; +import android.content.pm.PackageManager; import android.os.Bundle; import android.util.TypedValue; import android.view.ActionMode; import android.view.View; import android.view.WindowManager; import android.widget.ProgressBar; +import android.widget.Toast; /** * Base class for all activities. @@ -44,6 +46,8 @@ public abstract class BaseActivity extends AlfrescoActivity { protected boolean activateCheckPasscode = false; + public final static int REQUEST_CODE_ASK_PERMISSIONS = 123; + // /////////////////////////////////////////////////////////////////////////// // LIFECYCLE // /////////////////////////////////////////////////////////////////////////// @@ -185,4 +189,27 @@ protected void displayAsDialogActivity() { displayAsDialogActivity(0.90f, 0.9); } + + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) + { + switch (requestCode) + { + case REQUEST_CODE_ASK_PERMISSIONS: + if (grantResults[0] == PackageManager.PERMISSION_GRANTED) + { + // Permission Granted + Toast.makeText(this, "WRITE_CONTACTS Granted", Toast.LENGTH_SHORT).show(); + } + else + { + // Permission Denied + Toast.makeText(this, "WRITE_CONTACTS Denied", Toast.LENGTH_SHORT).show(); + } + break; + default: + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + } + } + } diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/fileexplorer/FileExplorerMenuFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/fileexplorer/FileExplorerMenuFragment.java index 87488d11..081fae9d 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/fileexplorer/FileExplorerMenuFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/fileexplorer/FileExplorerMenuFragment.java @@ -32,11 +32,19 @@ import org.alfresco.mobile.android.ui.fragments.AlfrescoFragment; import org.alfresco.mobile.android.ui.utils.UIUtils; +import android.Manifest; +import android.content.DialogInterface; +import android.content.pm.PackageManager; +import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; +import android.support.v4.app.ActivityCompat; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; +import android.support.v4.content.ContextCompat; +import android.support.v7.app.AlertDialog; +import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -135,10 +143,10 @@ public void onClick(View v) .getDownloadFolder(((BaseActivity) getActivity()).getCurrentAccount()); break; case R.id.shortcut_local_sdcard: - currentLocation = Environment.getExternalStorageDirectory(); + currentLocation = requestWriteExternalStorage(null); break; case R.id.shortcut_local_downloads: - currentLocation = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); + currentLocation = requestWriteExternalStorage(Environment.DIRECTORY_DOWNLOADS); break; case R.id.shortcut_library_office: mediatype = MediaStore.Files.FileColumns.MEDIA_TYPE_NONE; @@ -185,6 +193,58 @@ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) menu.clear(); } + private File requestWriteExternalStorage(final String externalFolder) + { + try + { + if (Build.VERSION.SDK_INT < 23) { return (externalFolder == null) + ? Environment.getExternalStorageDirectory() + : Environment.getExternalStoragePublicDirectory(externalFolder); } + + int hasWriteExternalStoragePermission = ContextCompat.checkSelfPermission(getActivity(), + Manifest.permission.WRITE_EXTERNAL_STORAGE); + if (hasWriteExternalStoragePermission != PackageManager.PERMISSION_GRANTED) + { + if (!ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), + Manifest.permission.WRITE_CONTACTS)) + { + showMessageOKCancel("You need to allow access to your storage", + new DialogInterface.OnClickListener() + { + @Override + public void onClick(DialogInterface dialog, int which) + { + ActivityCompat.requestPermissions(getActivity(), + new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, + BaseActivity.REQUEST_CODE_ASK_PERMISSIONS); + } + }); + return null; + } + ActivityCompat.requestPermissions(getActivity(), + new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, + BaseActivity.REQUEST_CODE_ASK_PERMISSIONS); + return null; + } + else + { + return (externalFolder == null) ? Environment.getExternalStorageDirectory() + : Environment.getExternalStoragePublicDirectory(externalFolder); + } + } + catch (Exception e) + { + Log.d(FileExplorerMenuFragment.TAG, Log.getStackTraceString(e)); + } + return null; + } + + private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) + { + new AlertDialog.Builder(getActivity()).setMessage(message).setPositiveButton("OK", okListener) + .setNegativeButton("Cancel", null).create().show(); + } + // /////////////////////////////////////////////////////////////////////////// // BUILDER // /////////////////////////////////////////////////////////////////////////// diff --git a/platform/foundation/build.gradle b/platform/foundation/build.gradle index 0c01d916..f87b72a0 100644 --- a/platform/foundation/build.gradle +++ b/platform/foundation/build.gradle @@ -24,7 +24,7 @@ android { defaultConfig { minSdkVersion 15 - targetSdkVersion 22 + targetSdkVersion 23 versionCode 1 versionName "1.0" From ee68b9bc39b6867a7086553b66cbe65b22b54d8a Mon Sep 17 00:00:00 2001 From: jmpascal Date: Thu, 17 Mar 2016 10:16:11 +0100 Subject: [PATCH 02/25] Update Version Number . --- README.md | 2 +- alfresco-mobile-android/build.gradle | 2 +- gradle.properties | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c5463a29..c57a427e 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ Before your code can be accepted into the project you must also sign the Individ ## What's the code License ? - Alfresco Mobile for Android 1.6.1 + Alfresco Mobile for Android 1.6.2 Copyright © 2015 Alfresco Software, Ltd. and others. diff --git a/alfresco-mobile-android/build.gradle b/alfresco-mobile-android/build.gradle index 15f71727..2960cca9 100644 --- a/alfresco-mobile-android/build.gradle +++ b/alfresco-mobile-android/build.gradle @@ -27,7 +27,7 @@ android { minSdkVersion 15 targetSdkVersion 23 - versionCode 60 + versionCode 62 versionName VERSION_NAME manifestPlaceholders = [PROVIDER_AUTHORITY: PROVIDER_AUTHORITY] diff --git a/gradle.properties b/gradle.properties index 67239bc6..f200a018 100644 --- a/gradle.properties +++ b/gradle.properties @@ -39,7 +39,7 @@ ## DEFAULT BUILD VARIANT #################################################################### # Current Version number of the application -VERSION_NAME=1.6.1 +VERSION_NAME=1.6.2 # Build Number of the application # Overrides by Continuous Integration System during build From a417aa6585a1faea1c07643db7170f9bd23af6bf Mon Sep 17 00:00:00 2001 From: jmpascal Date: Mon, 21 Mar 2016 09:55:42 +0100 Subject: [PATCH 03/25] Fix issues. --- .../fragments/MenuFragmentHelper.java | 2 +- .../fileexplorer/FileExplorerFragment.java | 6 +++- .../DocumentFolderBrowserFragment.java | 6 ++-- .../create/CreateDocumentDialogFragment.java | 2 +- .../node/details/NodeDetailsFragment.java | 3 +- .../node/download/DownloadDialogFragment.java | 2 +- .../preferences/AccountSettingsFragment.java | 8 ++++- .../application/managers/ActionUtils.java | 2 +- .../managers/RenditionManagerImpl.java | 4 ++- .../platform/intent/BaseActionUtils.java | 33 +++++++++++++------ 10 files changed, 48 insertions(+), 20 deletions(-) diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/MenuFragmentHelper.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/MenuFragmentHelper.java index 74d43bb7..b36f1ffd 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/MenuFragmentHelper.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/MenuFragmentHelper.java @@ -35,7 +35,7 @@ public class MenuFragmentHelper // ////////////////////////////////////////////////////////////////////// public static MenuItem getMenu(Context context, Menu menu) { - if (menu == null) { return null; } + if (menu == null || context == null) { return null; } if (AccessibilityUtils.isEnabled(context)) { MenuItem mi = menu.add(Menu.NONE, R.id.menu_refresh, Menu.FIRST + 40, R.string.refresh); diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/fileexplorer/FileExplorerFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/fileexplorer/FileExplorerFragment.java index 77905fbd..f43a5a9f 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/fileexplorer/FileExplorerFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/fileexplorer/FileExplorerFragment.java @@ -162,7 +162,11 @@ public void onActivityCreated(Bundle savedInstanceState) return; } } - privateFolder = AlfrescoStorageManager.getInstance(getActivity()).getRootPrivateFolder().getParentFile(); + if (AlfrescoStorageManager.getInstance(getActivity()) != null + && AlfrescoStorageManager.getInstance(getActivity()).getRootPrivateFolder() != null) + { + privateFolder = AlfrescoStorageManager.getInstance(getActivity()).getRootPrivateFolder().getParentFile(); + } displayTitle(); } diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/browser/DocumentFolderBrowserFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/browser/DocumentFolderBrowserFragment.java index e8835cc5..459e7edf 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/browser/DocumentFolderBrowserFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/browser/DocumentFolderBrowserFragment.java @@ -1039,6 +1039,7 @@ public boolean onOptionsItemSelected(MenuItem item) private boolean onOptionMenuItemSelected(int itemId) { + if (getActivity() == null) { return false; } switch (itemId) { case R.id.menu_search_from_folder: @@ -1148,11 +1149,12 @@ public List getNodes() { if (adapter != null) { - return ((ProgressNodeAdapter) adapter).getNodes(); + return ((ProgressNodeAdapter) adapter).getNodes() != null ? ((ProgressNodeAdapter) adapter).getNodes() + : new ArrayList(0); } else { - return null; + return new ArrayList<>(0); } } diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/create/CreateDocumentDialogFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/create/CreateDocumentDialogFragment.java index d4d35c04..9723cc68 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/create/CreateDocumentDialogFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/create/CreateDocumentDialogFragment.java @@ -369,7 +369,7 @@ public void onRetrieveDocumentName(RetrieveDocumentNameEvent event) if (tv == null) { return; } requestInProgress = false; recommandedName = event.data; - if (!recommandedName.equals(event.originalName)) + if (recommandedName != null && !recommandedName.equals(event.originalName)) { tv.setError(getString(R.string.create_document_filename_error)); if (getDialog() != null && getDialog() instanceof MaterialDialog) diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java index 9c7f0049..b56db573 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java @@ -1009,7 +1009,8 @@ public void onActivityNotFoundException(ActivityNotFoundException e) AnalyticsHelper.reportOperationEvent(getActivity(), AnalyticsManager.CATEGORY_DOCUMENT_MANAGEMENT, AnalyticsManager.ACTION_OPEN, node.isDocument() ? ((Document) node).getContentStreamMimeType() : AnalyticsManager.TYPE_FOLDER, 1, - false, AnalyticsManager.INDEX_FILE_SIZE, ((Document) node).getContentStreamLength()); + false, AnalyticsManager.INDEX_FILE_SIZE, + node.isDocument() ? ((Document) node).getContentStreamLength() : 0); } public void setDownloadDateTime(Date downloadDateTime) diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/download/DownloadDialogFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/download/DownloadDialogFragment.java index 0729656a..90c42b42 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/download/DownloadDialogFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/download/DownloadDialogFragment.java @@ -197,7 +197,7 @@ private void executeAction() AlfrescoNotificationManager.getInstance(getActivity()) .showToast(getActivity().getText(R.string.download_error).toString()); } - dismiss(); + getFragmentManager().beginTransaction().remove(this).commitAllowingStateLoss(); } @Override diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/preferences/AccountSettingsFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/preferences/AccountSettingsFragment.java index 537a9148..d0d4dbdd 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/preferences/AccountSettingsFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/preferences/AccountSettingsFragment.java @@ -136,9 +136,15 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa // TITLE UIUtils.displayTitle(getActivity(), getString(R.string.settings_account)); + if (account == null) + { + hide(R.id.settings_account_info_container); + return getRootView(); + } + // User Info TwoLinesViewHolder vh; - if (account.getTypeId() != AlfrescoAccount.TYPE_ALFRESCO_CLOUD) + if (account != null && account.getTypeId() != AlfrescoAccount.TYPE_ALFRESCO_CLOUD) { vh = new TwoLinesViewHolder(viewById(R.id.settings_account_info)); vh.topText.setText(R.string.settings_userinfo_account); diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/managers/ActionUtils.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/managers/ActionUtils.java index 590442a3..b0f49b8a 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/managers/ActionUtils.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/managers/ActionUtils.java @@ -454,6 +454,7 @@ public static void actionSendDocuments(Fragment fr, List files) */ public static void actionPickFile(Fragment fr, int requestCode) { + if (fr == null) { return; } try { Intent i = new Intent(Intent.ACTION_GET_CONTENT); @@ -571,7 +572,6 @@ public static boolean actionSendFeedbackEmail(Fragment fr) iBuilder.setText(builder.toString()); iBuilder.setChooserTitle(fr.getString(R.string.settings_feedback_email)).startChooser(); - return true; } catch (Exception e) diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/managers/RenditionManagerImpl.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/managers/RenditionManagerImpl.java index 161d3f96..5268372c 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/managers/RenditionManagerImpl.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/managers/RenditionManagerImpl.java @@ -548,9 +548,11 @@ public class ImageDownloader extends OkHttpDownloader public ImageDownloader(OkHttpClient client, AlfrescoSession alfSession) { super(client); + if (alfSession == null + && ((AbstractAlfrescoSessionImpl) alfSession).getAuthenticationProvider() == null) { return; } Map> httpHeaders = ((AbstractAlfrescoSessionImpl) alfSession) .getAuthenticationProvider().getHTTPHeaders(); - Map headers = new HashMap<>(httpHeaders.size()); + Map headers = new HashMap<>(httpHeaders != null ? httpHeaders.size() : 0); // set other headers if (httpHeaders != null) { diff --git a/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/intent/BaseActionUtils.java b/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/intent/BaseActionUtils.java index 49cba791..86783feb 100644 --- a/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/intent/BaseActionUtils.java +++ b/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/intent/BaseActionUtils.java @@ -22,6 +22,7 @@ import org.alfresco.mobile.android.foundation.R; import org.alfresco.mobile.android.platform.AlfrescoNotificationManager; import org.alfresco.mobile.android.platform.mimetype.MimeTypeManager; +import org.alfresco.mobile.android.platform.provider.CursorUtils; import android.content.ActivityNotFoundException; import android.content.Context; @@ -166,21 +167,33 @@ public static void actionPickFile(Fragment f, int requestCode) */ public static String getPath(Context context, Uri uri) { - String scheme = uri.getScheme(); String s = null; - if (scheme.equals("content")) + Cursor cursor = null; + try + { + String scheme = uri.getScheme(); + if (scheme.equals("content")) + { + String[] projection = { MediaStore.Files.FileColumns.DATA }; + cursor = context.getContentResolver().query(uri, projection, null, null, null); + int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATA); + cursor.moveToFirst(); + s = cursor.getString(columnIndex); + } + else if (scheme.equals("file")) + { + s = uri.getPath(); + } + // Log.d("ActionManager", "URI:" + uri + " - S:" + s); + } + catch (Exception e) { - String[] projection = { MediaStore.Files.FileColumns.DATA }; - Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null); - int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATA); - cursor.moveToFirst(); - s = cursor.getString(columnIndex); + } - else if (scheme.equals("file")) + finally { - s = uri.getPath(); + CursorUtils.closeCursor(cursor); } - // Log.d("ActionManager", "URI:" + uri + " - S:" + s); return s; } From dcfbb8c30660120f3cefd489b0c59a103a8c35e7 Mon Sep 17 00:00:00 2001 From: jmpascal Date: Tue, 29 Mar 2016 15:00:38 +0200 Subject: [PATCH 04/25] ANDROID-240 --- .../assets/Configuration/embedded_config.json | 136 ++++++++- .../ConfigurableActionHelper.java | 195 ++++++++++++ .../configuration/ConfigurationConstant.java | 34 +++ .../fragments/actions/NodeActions.java | 19 +- .../fragments/actions/NodeIdActions.java | 12 + .../DocumentFolderBrowserFragment.java | 58 ++-- .../node/browser/ProgressNodeAdapter.java | 11 +- .../node/comment/CommentsFragment.java | 4 +- .../node/details/NodeDetailsActionMode.java | 25 +- .../node/details/NodeDetailsFragment.java | 44 ++- .../workflow/task/TasksFragment.java | 20 +- .../application/managers/ConfigManager.java | 5 +- .../StorageAccessDocumentsProvider.java | 22 +- .../application/ui/form/FormManager.java | 20 +- .../src/main/res/values/strings.xml | 2 - .../api/model/config/ActionConfig.java | 28 ++ .../api/model/config/ActionGroupConfig.java | 33 +++ .../api/model/config/ConfigConstants.java | 48 +++ .../api/model/config/ConfigTypeIds.java | 10 +- .../api/model/config/ProfileConfig.java | 30 +- .../model/config/impl/ActionConfigImpl.java | 78 +++++ .../config/impl/ActionGroupConfigImpl.java | 83 ++++++ .../api/model/config/impl/ActionHelper.java | 278 ++++++++++++++++++ .../model/config/impl/ConfigurationImpl.java | 45 +++ .../model/config/impl/ProfileConfigImpl.java | 33 ++- .../android/api/services/ConfigService.java | 13 + .../impl/AbstractConfigServiceImpl.java | 24 ++ .../services/impl/LocalConfigServiceImpl.java | 24 ++ 28 files changed, 1227 insertions(+), 107 deletions(-) create mode 100644 alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/ConfigurableActionHelper.java create mode 100644 platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/ActionConfig.java create mode 100644 platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/ActionGroupConfig.java create mode 100644 platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/impl/ActionConfigImpl.java create mode 100644 platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/impl/ActionGroupConfigImpl.java create mode 100644 platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/impl/ActionHelper.java diff --git a/alfresco-mobile-android/src/main/assets/Configuration/embedded_config.json b/alfresco-mobile-android/src/main/assets/Configuration/embedded_config.json index 634422e9..9ab55261 100644 --- a/alfresco-mobile-android/src/main/assets/Configuration/embedded_config.json +++ b/alfresco-mobile-android/src/main/assets/Configuration/embedded_config.json @@ -7,7 +7,8 @@ "default": true, "label-id": "profile.default.title", "description-id": "profile.default.summary", - "root-view-id": "views-menu-default" + "root-view-id": "views-menu-default", + "root-action-id": "actions-default" } }, "features": [ @@ -17,6 +18,139 @@ "enable": false } ], + "action-groups": [ + { + "id": "actions-default", + "items": [ + { + "item-type": "action-id", + "view-id": "action-favorite-default" + }, + { + "item-type": "action-id", + "view-id": "action-like-default" + }, + { + "item-type": "action-id", + "view-id": "action-workflow-default" + }, + { + "item-type": "action-id", + "view-id": "action-comment-default" + }, + { + "item-type": "action-id", + "view-id": "action-edit-with-alfresco-default" + }, + { + "item-type": "action-id", + "view-id": "action-edit-default" + }, + { + "item-type": "action-id", + "view-id": "action-update-default" + }, + { + "item-type": "action-id", + "view-id": "action-download-default" + }, + { + "item-type": "action-id", + "view-id": "action-create-default" + }, + { + "item-type": "action-id", + "view-id": "action-sync-default" + }, + { + "item-type": "action-id", + "view-id": "action-open-default" + }, + { + "item-type": "action-id", + "view-id": "action-share-default" + }, + { + "item-type": "action-id", + "view-id": "action-delete-default" + }, + { + "item-type": "action-id", + "view-id": "action-upload-doc-default" + }, + { + "item-type": "action-id", + "view-id": "action-create-doc-default" + }, + { + "item-type": "action-id", + "view-id": "action-create-folder-default" + } + ] + } + ], + "actions": { + "action-favorite-default": { + "type": "org.alfresco.client.action.node.favorite", + "enable": true + }, + "action-like-default": { + "type": "org.alfresco.client.action.node.like", + "enable": true + }, + "action-workflow-default": { + "type": "org.alfresco.client.action.workflow.start", + "enable": true + }, + "action-comment-default": { + "type": "org.alfresco.client.action.node.comment", + "enable": true + }, + "action-edit-with-alfresco-default": { + "type": "org.alfresco.client.action.node.edit-with-alfresco", + "enable": true + }, + "action-edit-default": { + "type": "org.alfresco.client.action.node.edit", + "enable": true + }, + "action-update-default": { + "type": "org.alfresco.client.action.document.update", + "enable": true + }, + "action-download-default": { + "type": "org.alfresco.client.action.document.download", + "enable": true + }, + "action-sync-default": { + "type": "org.alfresco.client.action.node.sync", + "enable": true + }, + "action-open-default": { + "type": "org.alfresco.client.action.document.open", + "enable": true + }, + "action-share-default": { + "type": "org.alfresco.client.action.node.share", + "enable": true + }, + "action-delete-default": { + "type": "org.alfresco.client.action.node.delete", + "enable": true + }, + "action-upload-doc-default": { + "type": "org.alfresco.client.action.document.upload", + "enable": true + }, + "action-create-doc-default": { + "type": "org.alfresco.client.action.document.create", + "enable": true + }, + "action-create-folder-default": { + "type": "org.alfresco.client.action.folder.create", + "enable": true + } + }, "view-groups": [ { "id": "views-menu-default", diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/ConfigurableActionHelper.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/ConfigurableActionHelper.java new file mode 100644 index 00000000..5c8a7bf1 --- /dev/null +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/ConfigurableActionHelper.java @@ -0,0 +1,195 @@ +/* + * Copyright (C) 2005-2016 Alfresco Software Limited. + * + * This file is part of Alfresco Mobile for Android. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.alfresco.mobile.android.application.configuration; + +import org.alfresco.mobile.android.api.model.Node; +import org.alfresco.mobile.android.api.model.Permissions; +import org.alfresco.mobile.android.api.model.config.ActionConfig; +import org.alfresco.mobile.android.api.model.config.ActionGroupConfig; +import org.alfresco.mobile.android.api.model.impl.DocumentImpl; +import org.alfresco.mobile.android.api.services.ConfigService; +import org.alfresco.mobile.android.api.session.AlfrescoSession; +import org.alfresco.mobile.android.application.managers.ConfigManager; +import org.alfresco.mobile.android.platform.accounts.AlfrescoAccount; +import org.apache.chemistry.opencmis.commons.enums.Action; + +import android.content.Context; + +/** + * Created by jpascal on 21/03/2016. + */ +public final class ConfigurableActionHelper +{ + + // public static final int ACTION_NODE_CREATE = 0; + + public static final int ACTION_CREATE_FOLDER = 13; + + public static final int ACTION_CREATE_DOC = 14; + + public static final int ACTION_NODE_UPLOAD = 15; + + public static final int ACTION_NODE_DELETE = 1; + + public static final int ACTION_NODE_FAVORITE = 2; + + public static final int ACTION_NODE_LIKE = 3; + + public static final int ACTION_NODE_REVIEW = 4; + + public static final int ACTION_NODE_COMMENT = 5; + + public static final int ACTION_NODE_UPDATE = 6; + + public static final int ACTION_NODE_EDIT = 7; + + public static final int ACTION_NODE_RENAME = 8; + + public static final int ACTION_NODE_DOWNLOAD = 9; + + public static final int ACTION_NODE_SYNC = 10; + + public static final int ACTION_NODE_OPEN = 11; + + public static final int ACTION_NODE_SHARE = 12; + + public static final boolean isVisible(Context context, AlfrescoAccount account, int actionId) + { + return isVisible(context, account, null, null, actionId); + } + + public static final boolean isVisible(Context context, AlfrescoAccount account, AlfrescoSession session, Node node, + int actionId) + { + try + { + // First we check if configuration + // No Config ==> Everything is ON + boolean allowedByConfig = true; + boolean permissionRequired = false; + ConfigManager configManager = ConfigManager.getInstance(context); + if (configManager != null && configManager.getConfig(account.getId()) != null + && configManager.getConfig(account.getId()).hasActionConfig()) + { + ConfigService service = configManager.getConfig(account.getId()); + + String profileId = configManager.getCurrentProfileId(); + if (profileId == null) { return true; } + + String rootActionId = service.getProfile(profileId).getRootActionId(); + if (rootActionId == null || service.getActionConfig(rootActionId) == null) { return true; } + + String actionNameId = null; + // Config available Let's check + switch (actionId) + { + case ACTION_CREATE_FOLDER: + actionNameId = ConfigurationConstant.KEY_ACTION_CREATE_FOLDER; + permissionRequired = true; + break; + case ACTION_CREATE_DOC: + actionNameId = ConfigurationConstant.KEY_ACTION_CREATE_DOCUMENT; + permissionRequired = true; + break; + case ACTION_NODE_UPLOAD: + actionNameId = ConfigurationConstant.KEY_ACTION_NODE_UPLOAD; + permissionRequired = true; + break; + case ACTION_NODE_OPEN: + actionNameId = ConfigurationConstant.KEY_ACTION_NODE_OPEN; + break; + case ACTION_NODE_DOWNLOAD: + actionNameId = ConfigurationConstant.KEY_ACTION_NODE_DOWNLOAD; + break; + case ACTION_NODE_FAVORITE: + actionNameId = ConfigurationConstant.KEY_ACTION_NODE_FAVORITE; + break; + case ACTION_NODE_LIKE: + actionNameId = ConfigurationConstant.KEY_ACTION_NODE_LIKE; + break; + case ACTION_NODE_EDIT: + actionNameId = ConfigurationConstant.KEY_ACTION_NODE_EDIT; + permissionRequired = true; + break; + case ACTION_NODE_UPDATE: + actionNameId = ConfigurationConstant.KEY_ACTION_NODE_UPDATE; + permissionRequired = true; + break; + case ACTION_NODE_DELETE: + actionNameId = ConfigurationConstant.KEY_ACTION_NODE_DELETE; + permissionRequired = true; + break; + case ACTION_NODE_COMMENT: + actionNameId = ConfigurationConstant.KEY_ACTION_NODE_COMMENT; + permissionRequired = true; + break; + case ACTION_NODE_REVIEW: + actionNameId = ConfigurationConstant.KEY_ACTION_WORKFLOW; + break; + case ACTION_NODE_SYNC: + actionNameId = ConfigurationConstant.KEY_ACTION_NODE_SYNC; + break; + case ACTION_NODE_SHARE: + actionNameId = ConfigurationConstant.KEY_ACTION_NODE_SHARE; + break; + } + ActionConfig config = ((ActionGroupConfig) service.getActionConfig(rootActionId)) + .getChildById(actionNameId); + // Config disable the action + if (config != null && !config.isEnable()) { return false; } + // Config not present or is enable + allowedByConfig = (config == null) || config.isEnable(); + } + + // Configuration disable action + if (!permissionRequired) { return allowedByConfig; } + + // If configuration doesn't disable we can check permission. + boolean hasPermission = true; + + Permissions permission = session.getServiceRegistry().getDocumentFolderService().getPermissions(node); + switch (actionId) + { + case ACTION_NODE_UPLOAD: + case ACTION_CREATE_DOC: + case ACTION_CREATE_FOLDER: + hasPermission = permission.canAddChildren(); + break; + case ACTION_NODE_EDIT: + hasPermission = permission.canEdit(); + break; + case ACTION_NODE_UPDATE: + hasPermission = ((DocumentImpl) node).hasAllowableAction(Action.CAN_SET_CONTENT_STREAM.value()); + break; + case ACTION_NODE_DELETE: + hasPermission = permission.canDelete(); + break; + case ACTION_NODE_COMMENT: + hasPermission = permission.canComment(); + break; + } + + return hasPermission; + } + catch (Exception e) + { + return true; + } + } +} diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/ConfigurationConstant.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/ConfigurationConstant.java index cbdef0b1..52242ef5 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/ConfigurationConstant.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/ConfigurationConstant.java @@ -89,4 +89,38 @@ public interface ConfigurationConstant add(KEY_LOCAL_FILES); } }; + + // /////////////////////////////////////////////////////////////////////////// + // DEFAULT TEMPLATE ACTION VIEWS + // /////////////////////////////////////////////////////////////////////////// + String PREFIX_ACTION = "org.alfresco.client.action"; + + String KEY_ACTION_CREATE_FOLDER = PREFIX_ACTION.concat(".folder.create"); + + String KEY_ACTION_CREATE_DOCUMENT = PREFIX_ACTION.concat(".document.create"); + + String KEY_ACTION_NODE_UPLOAD = PREFIX_ACTION.concat(".document.upload"); + + String KEY_ACTION_NODE_DELETE = PREFIX_ACTION.concat(".node.delete"); + + String KEY_ACTION_NODE_FAVORITE = PREFIX_ACTION.concat(".node.favorite"); + + String KEY_ACTION_NODE_LIKE = PREFIX_ACTION.concat(".node.like"); + + String KEY_ACTION_WORKFLOW = PREFIX_ACTION.concat(".workflow.start"); + + String KEY_ACTION_NODE_COMMENT = PREFIX_ACTION.concat(".node.comment"); + + String KEY_ACTION_NODE_UPDATE = PREFIX_ACTION.concat(".document.update"); + + String KEY_ACTION_NODE_EDIT = PREFIX_ACTION.concat(".node.edit"); + + String KEY_ACTION_NODE_DOWNLOAD = PREFIX_ACTION.concat(".document.download"); + + String KEY_ACTION_NODE_SYNC = PREFIX_ACTION.concat(".node.sync"); + + String KEY_ACTION_NODE_OPEN = PREFIX_ACTION.concat(".document.open"); + + String KEY_ACTION_NODE_SHARE = PREFIX_ACTION.concat(".node.share"); + } diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/actions/NodeActions.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/actions/NodeActions.java index c90d0d3f..8e54f66c 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/actions/NodeActions.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/actions/NodeActions.java @@ -29,6 +29,7 @@ import org.alfresco.mobile.android.api.session.CloudSession; import org.alfresco.mobile.android.application.R; import org.alfresco.mobile.android.application.activity.PrivateDialogActivity; +import org.alfresco.mobile.android.application.configuration.ConfigurableActionHelper; import org.alfresco.mobile.android.application.fragments.FragmentDisplayer; import org.alfresco.mobile.android.application.fragments.node.browser.DocumentFolderBrowserFragment; import org.alfresco.mobile.android.application.fragments.node.details.NodeDetailsFragment; @@ -182,6 +183,7 @@ protected void getMenu(FragmentActivity activity, Menu menu) mi = menu.add(Menu.NONE, R.id.menu_action_download_all, Menu.FIRST, R.string.download); mi.setIcon(R.drawable.ic_download_light); mi.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); + removeActionIfNecessary(menu, mi.getItemId(), ConfigurableActionHelper.ACTION_NODE_DOWNLOAD); if (!(SessionUtils.getSession(activity) instanceof CloudSession)) { @@ -189,6 +191,7 @@ protected void getMenu(FragmentActivity activity, Menu menu) R.string.process_start_review); mi.setIcon(R.drawable.ic_start_review); mi.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); + removeActionIfNecessary(menu, mi.getItemId(), ConfigurableActionHelper.ACTION_NODE_REVIEW); } } @@ -199,6 +202,7 @@ protected void getMenu(FragmentActivity activity, Menu menu) createMenu = menu.addSubMenu(Menu.NONE, R.id.menu_action_sync_group, Menu.FIRST, R.string.sync); createMenu.setIcon(R.drawable.ic_sync_light); createMenu.getItem().setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); + removeActionIfNecessary(menu, createMenu.getItem().getItemId(), ConfigurableActionHelper.ACTION_NODE_SYNC); createMenu.add(Menu.NONE, R.id.menu_action_sync_group_sync, Menu.FIRST + 1, R.string.sync); createMenu.add(Menu.NONE, R.id.menu_action_sync_group_unsync, Menu.FIRST + 2, R.string.unsync); @@ -208,6 +212,7 @@ protected void getMenu(FragmentActivity activity, Menu menu) createMenu = menu.addSubMenu(Menu.NONE, R.id.menu_action_favorite_group, Menu.FIRST + 135, R.string.favorite); createMenu.setIcon(R.drawable.ic_favorite_light); createMenu.getItem().setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); + removeActionIfNecessary(menu, createMenu.getItem().getItemId(), ConfigurableActionHelper.ACTION_NODE_FAVORITE); createMenu.add(Menu.NONE, R.id.menu_action_favorite_group_favorite, Menu.FIRST + 1, R.string.favorite); createMenu.add(Menu.NONE, R.id.menu_action_favorite_group_unfavorite, Menu.FIRST + 2, R.string.unfavorite); @@ -221,17 +226,19 @@ protected void getMenu(FragmentActivity activity, Menu menu) createMenu = menu.addSubMenu(Menu.NONE, R.id.menu_action_like_group, Menu.FIRST + 150, R.string.like); createMenu.setIcon(R.drawable.ic_like); createMenu.getItem().setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); + removeActionIfNecessary(menu, createMenu.getItem().getItemId(), ConfigurableActionHelper.ACTION_NODE_LIKE); createMenu.add(Menu.NONE, R.id.menu_action_like_group_like, Menu.FIRST + 1, R.string.like); createMenu.add(Menu.NONE, R.id.menu_action_like_group_unlike, Menu.FIRST + 2, R.string.unlike); } - if (parentFolder != null - && alfSession.getServiceRegistry().getDocumentFolderService().getPermissions(parentFolder).canDelete()) + if (parentFolder != null && ConfigurableActionHelper.isVisible(getActivity(), getAccount(), getSession(), + parentFolder, ConfigurableActionHelper.ACTION_NODE_DELETE)) { mi = menu.add(Menu.NONE, R.id.menu_action_delete, Menu.FIRST + 1000, R.string.delete); mi.setIcon(R.drawable.ic_delete); mi.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); + removeActionIfNecessary(menu, mi.getItemId(), ConfigurableActionHelper.ACTION_NODE_DELETE); } } @@ -322,6 +329,14 @@ public boolean onActionItemClicked(ActionMode mode, MenuItem item) // /////////////////////////////////////////////////////////////////////////// // ACTIONS // /////////////////////////////////////////////////////////////////////////// + protected void removeActionIfNecessary(Menu menu, int menuItemId, int actionId) + { + if (!ConfigurableActionHelper.isVisible(getActivity(), getAccount(), actionId)) + { + menu.removeItem(menuItemId); + } + } + private void startReview() { Intent it = new Intent(PrivateIntent.ACTION_START_PROCESS, null, getActivity(), PrivateDialogActivity.class); diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/actions/NodeIdActions.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/actions/NodeIdActions.java index d76b2d2c..fada10c2 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/actions/NodeIdActions.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/actions/NodeIdActions.java @@ -22,6 +22,7 @@ import org.alfresco.mobile.android.api.session.AlfrescoSession; import org.alfresco.mobile.android.application.R; +import org.alfresco.mobile.android.application.configuration.ConfigurableActionHelper; import org.alfresco.mobile.android.platform.utils.SessionUtils; import org.alfresco.mobile.android.sync.SyncContentManager; @@ -77,6 +78,7 @@ protected void getMenu(FragmentActivity activity, Menu menu) createMenu = menu.addSubMenu(Menu.NONE, R.id.menu_action_sync_group, Menu.FIRST, R.string.sync); createMenu.setIcon(R.drawable.ic_sync_light); createMenu.getItem().setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); + hideActionIfNecessary(menu, createMenu.getItem().getItemId(), ConfigurableActionHelper.ACTION_NODE_SYNC); createMenu.add(Menu.NONE, R.id.menu_action_sync_group_sync, Menu.FIRST + 1, R.string.sync); createMenu.add(Menu.NONE, R.id.menu_action_sync_group_unsync, Menu.FIRST + 2, R.string.unsync); @@ -86,6 +88,7 @@ protected void getMenu(FragmentActivity activity, Menu menu) createMenu = menu.addSubMenu(Menu.NONE, R.id.menu_action_favorite_group, Menu.FIRST + 2, R.string.favorite); createMenu.setIcon(R.drawable.ic_favorite_light); createMenu.getItem().setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); + hideActionIfNecessary(menu, createMenu.getItem().getItemId(), ConfigurableActionHelper.ACTION_NODE_FAVORITE); createMenu.add(Menu.NONE, R.id.menu_action_favorite_group_favorite, Menu.FIRST + 1, R.string.favorite); createMenu.add(Menu.NONE, R.id.menu_action_favorite_group_unfavorite, Menu.FIRST + 2, R.string.unfavorite); @@ -99,6 +102,7 @@ protected void getMenu(FragmentActivity activity, Menu menu) createMenu = menu.addSubMenu(Menu.NONE, R.id.menu_action_like_group, Menu.FIRST + 3, R.string.like); createMenu.setIcon(R.drawable.ic_like); createMenu.getItem().setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); + hideActionIfNecessary(menu, createMenu.getItem().getItemId(), ConfigurableActionHelper.ACTION_NODE_LIKE); createMenu.add(Menu.NONE, R.id.menu_action_like_group_like, Menu.FIRST + 1, R.string.like); createMenu.add(Menu.NONE, R.id.menu_action_like_group_unlike, Menu.FIRST + 2, R.string.unlike); @@ -149,6 +153,14 @@ public boolean onActionItemClicked(ActionMode mode, MenuItem item) // /////////////////////////////////////////////////////////////////////////// // ACTIONS // /////////////////////////////////////////////////////////////////////////// + protected void hideActionIfNecessary(Menu menu, int menuItemId, int actionId) + { + if (!ConfigurableActionHelper.isVisible(getActivity(), getAccount(), actionId)) + { + menu.removeItem(menuItemId); + } + } + private void favorite(boolean doFavorite) { NodeActions.favorite(getFragment(), selectedItems, doFavorite); diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/browser/DocumentFolderBrowserFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/browser/DocumentFolderBrowserFragment.java index 459e7edf..5f50afbb 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/browser/DocumentFolderBrowserFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/browser/DocumentFolderBrowserFragment.java @@ -38,6 +38,7 @@ import org.alfresco.mobile.android.application.activity.PublicDispatcherActivity; import org.alfresco.mobile.android.application.capture.DeviceCapture; import org.alfresco.mobile.android.application.capture.DeviceCaptureHelper; +import org.alfresco.mobile.android.application.configuration.ConfigurableActionHelper; import org.alfresco.mobile.android.application.configuration.model.view.RepositoryConfigModel; import org.alfresco.mobile.android.application.fragments.DisplayUtils; import org.alfresco.mobile.android.application.fragments.FragmentDisplayer; @@ -304,7 +305,6 @@ protected void prepareEmptyView(View ev, ImageView emptyImageView, TextView firs TextView secondEmptyMessage) { - Permissions permission; int iconId = R.drawable.ic_empty_folder_ro; int titleId = R.string.nodebrowser_empty_ro_title; int descriptionId = -1; @@ -312,8 +312,8 @@ protected void prepareEmptyView(View ev, ImageView emptyImageView, TextView firs { if (parentFolder != null) { - permission = getSession().getServiceRegistry().getDocumentFolderService().getPermissions(parentFolder); - if (permission.canAddChildren()) + if (ConfigurableActionHelper.isVisible(getActivity(), getAccount(), getSession(), parentFolder, + ConfigurableActionHelper.ACTION_CREATE_FOLDER)) { iconId = R.drawable.ic_empty_folder_rw; titleId = R.string.nodebrowser_empty_rw_title; @@ -913,9 +913,10 @@ public void getMenu(Menu menu) } else if (getActivity() instanceof PublicDispatcherActivity || getActivity() instanceof BaseShortcutActivity) { - permission = getSession().getServiceRegistry().getDocumentFolderService().getPermissions(parentFolder); - - if (permission.canAddChildren()) + // permission = + // getSession().getServiceRegistry().getDocumentFolderService().getPermissions(parentFolder); + if (ConfigurableActionHelper.isVisible(getActivity(), getAccount(), getSession(), parentFolder, + ConfigurableActionHelper.ACTION_CREATE_FOLDER)) { MenuItem mi = menu.add(Menu.NONE, R.id.menu_create_folder, Menu.FIRST, R.string.folder_create); mi.setIcon(R.drawable.ic_repository_light); @@ -944,7 +945,12 @@ public void getMenu(AlfrescoSession session, Menu menu, Folder parentFolder) mi.setIcon(R.drawable.ic_search_light); mi.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); - if (permission.canAddChildren()) + if (ConfigurableActionHelper.isVisible(getActivity(), getAccount(), getSession(), parentFolder, + ConfigurableActionHelper.ACTION_CREATE_DOC) + || ConfigurableActionHelper.isVisible(getActivity(), getAccount(), getSession(), parentFolder, + ConfigurableActionHelper.ACTION_CREATE_FOLDER) + || ConfigurableActionHelper.isVisible(getActivity(), getAccount(), getSession(), parentFolder, + ConfigurableActionHelper.ACTION_NODE_UPLOAD)) { displayFab(); } @@ -962,17 +968,32 @@ public void onClick(View v) { BottomSheet.Builder builder = new BottomSheet.Builder(getActivity(), R.style.M_StyleDialog) .title(R.string.add_menu); - builder.sheet(R.id.menu_create_folder, R.drawable.ic_repository_light, R.string.folder_create); - builder.sheet(R.id.menu_upload, R.drawable.ic_upload, R.string.upload_title); - builder.sheet(R.id.menu_create_document, R.drawable.ic_doc_light, R.string.create_document); - builder.sheet(R.id.menu_device_capture_camera_photo, R.drawable.ic_camera, R.string.take_photo); - builder.sheet(R.id.menu_device_capture_camera_video, R.drawable.ic_videos, R.string.make_video); - builder.sheet(R.id.menu_device_capture_mic_audio, R.drawable.ic_microphone, R.string.record_audio); - if (ScanSnapManager.getInstance(getActivity()) != null - && ScanSnapManager.getInstance(getActivity()).hasScanSnapApplication()) + if (ConfigurableActionHelper.isVisible(getActivity(), getAccount(), getSession(), parentFolder, + ConfigurableActionHelper.ACTION_CREATE_FOLDER)) + { + builder.sheet(R.id.menu_create_folder, R.drawable.ic_repository_light, R.string.folder_create); + } + + if (ConfigurableActionHelper.isVisible(getActivity(), getAccount(), getSession(), parentFolder, + ConfigurableActionHelper.ACTION_NODE_UPLOAD)) + { + builder.sheet(R.id.menu_upload, R.drawable.ic_upload, R.string.upload_title); + } + + if (ConfigurableActionHelper.isVisible(getActivity(), getAccount(), getSession(), parentFolder, + ConfigurableActionHelper.ACTION_CREATE_DOC)) { - builder.sheet(R.id.menu_scan_document, R.drawable.ic_camera, R.string.scan); + builder.sheet(R.id.menu_create_document, R.drawable.ic_doc_light, R.string.create_document); + builder.sheet(R.id.menu_device_capture_camera_photo, R.drawable.ic_camera, R.string.take_photo); + builder.sheet(R.id.menu_device_capture_camera_video, R.drawable.ic_videos, R.string.make_video); + builder.sheet(R.id.menu_device_capture_mic_audio, R.drawable.ic_microphone, R.string.record_audio); + if (ScanSnapManager.getInstance(getActivity()) != null + && ScanSnapManager.getInstance(getActivity()).hasScanSnapApplication()) + { + builder.sheet(R.id.menu_scan_document, R.drawable.ic_camera, R.string.scan); + } } + builder.grid().listener(new DialogInterface.OnClickListener() { @Override @@ -1232,9 +1253,8 @@ private void checkValidationButton() if (parentFolder != null) { - Permissions permission = getSession().getServiceRegistry().getDocumentFolderService() - .getPermissions(parentFolder); - enable = permission.canAddChildren(); + enable = ConfigurableActionHelper.isVisible(getActivity(), getAccount(), getSession(), parentFolder, + ConfigurableActionHelper.ACTION_NODE_UPLOAD); } validationButton.setEnabled(enable); } diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/browser/ProgressNodeAdapter.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/browser/ProgressNodeAdapter.java index 518535d6..e8934638 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/browser/ProgressNodeAdapter.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/browser/ProgressNodeAdapter.java @@ -26,10 +26,10 @@ import org.alfresco.mobile.android.api.model.Folder; import org.alfresco.mobile.android.api.model.Node; -import org.alfresco.mobile.android.api.model.Permissions; import org.alfresco.mobile.android.api.model.impl.publicapi.PublicAPIPropertyIds; import org.alfresco.mobile.android.api.utils.NodeRefUtils; import org.alfresco.mobile.android.application.R; +import org.alfresco.mobile.android.application.configuration.ConfigurableActionHelper; import org.alfresco.mobile.android.application.fragments.DisplayUtils; import org.alfresco.mobile.android.application.fragments.actions.NodeActions; import org.alfresco.mobile.android.application.fragments.node.details.NodeDetailsFragment; @@ -548,19 +548,18 @@ public void getMenu(Menu menu, Node node) { MenuItem mi; - Permissions permission = SessionUtils.getSession(getActivity()).getServiceRegistry().getDocumentFolderService() - .getPermissions(node); - mi = menu.add(Menu.NONE, R.id.menu_node_details, Menu.FIRST, R.string.action_view_properties); mi.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); - if (permission.canEdit()) + if (ConfigurableActionHelper.isVisible(getActivity(), SessionUtils.getAccount(getActivity()), + SessionUtils.getSession(getActivity()), node, ConfigurableActionHelper.ACTION_NODE_EDIT)) { mi = menu.add(Menu.NONE, R.id.menu_action_edit, Menu.FIRST + 50, R.string.action_edit_properties); mi.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); } - if (permission.canDelete()) + if (ConfigurableActionHelper.isVisible(getActivity(), SessionUtils.getAccount(getActivity()), + SessionUtils.getSession(getActivity()), node, ConfigurableActionHelper.ACTION_NODE_DELETE)) { mi = menu.add(Menu.NONE, R.id.menu_action_delete_folder, Menu.FIRST + 1000, R.string.delete); mi.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/comment/CommentsFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/comment/CommentsFragment.java index 8a915806..ca397a54 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/comment/CommentsFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/comment/CommentsFragment.java @@ -25,6 +25,7 @@ import org.alfresco.mobile.android.api.model.Node; import org.alfresco.mobile.android.api.services.CommentService; import org.alfresco.mobile.android.application.R; +import org.alfresco.mobile.android.application.configuration.ConfigurableActionHelper; import org.alfresco.mobile.android.application.fragments.DisplayUtils; import org.alfresco.mobile.android.application.fragments.builder.ListingFragmentBuilder; import org.alfresco.mobile.android.async.Operator; @@ -152,7 +153,8 @@ public void onResume() try { - if (!getSession().getServiceRegistry().getDocumentFolderService().getPermissions(node).canEdit()) + if (!ConfigurableActionHelper.isVisible(getActivity(), getAccount(), getSession(), node, + ConfigurableActionHelper.ACTION_NODE_COMMENT)) { ((View) commentText.getParent().getParent()).setVisibility(View.GONE); } diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsActionMode.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsActionMode.java index ff9eb05c..cb216989 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsActionMode.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsActionMode.java @@ -24,18 +24,17 @@ import org.alfresco.mobile.android.api.constants.ContentModel; import org.alfresco.mobile.android.api.model.Document; import org.alfresco.mobile.android.api.model.Node; -import org.alfresco.mobile.android.api.model.impl.DocumentImpl; import org.alfresco.mobile.android.api.session.CloudSession; import org.alfresco.mobile.android.application.R; import org.alfresco.mobile.android.application.activity.PrivateDialogActivity; import org.alfresco.mobile.android.application.activity.PublicDispatcherActivity; +import org.alfresco.mobile.android.application.configuration.ConfigurableActionHelper; import org.alfresco.mobile.android.application.fragments.actions.AbstractActions; import org.alfresco.mobile.android.application.intent.RequestCode; import org.alfresco.mobile.android.platform.intent.PrivateIntent; import org.alfresco.mobile.android.platform.io.AlfrescoStorageManager; import org.alfresco.mobile.android.platform.utils.SessionUtils; import org.alfresco.mobile.android.sync.utils.NodeSyncPlaceHolder; -import org.apache.chemistry.opencmis.commons.enums.Action; import android.content.Intent; import android.support.v4.app.Fragment; @@ -86,22 +85,24 @@ protected void getMenu(FragmentActivity activity, Menu menu) if (node.isDocument()) { - if (((Document) node).getContentStreamLength() > 0 && !isRestrict) + if (((Document) node).getContentStreamLength() > 0 && !isRestrict && ConfigurableActionHelper + .isVisible(getActivity(), getAccount(), ConfigurableActionHelper.ACTION_NODE_DOWNLOAD)) { mi = menu.add(Menu.NONE, R.id.menu_action_download, Menu.FIRST, R.string.download); mi.setIcon(R.drawable.ic_download_light); mi.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); } - if (((Document) node).isLatestVersion() - && ((DocumentImpl) node).hasAllowableAction(Action.CAN_SET_CONTENT_STREAM.value())) + if (((Document) node).isLatestVersion() && ConfigurableActionHelper.isVisible(getActivity(), getAccount(), + getSession(), node, ConfigurableActionHelper.ACTION_NODE_UPDATE)) { mi = menu.add(Menu.NONE, R.id.menu_action_update, Menu.FIRST + 130, R.string.update); mi.setIcon(R.drawable.ic_upload); mi.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); } - if (!(SessionUtils.getSession(activity) instanceof CloudSession)) + if (!(SessionUtils.getSession(activity) instanceof CloudSession) && ConfigurableActionHelper + .isVisible(getActivity(), getAccount(), ConfigurableActionHelper.ACTION_NODE_REVIEW)) { mi = menu.add(Menu.NONE, R.id.menu_workflow_add, Menu.FIRST + 500, R.string.process_start_review); mi.setIcon(R.drawable.ic_start_review); @@ -109,16 +110,16 @@ protected void getMenu(FragmentActivity activity, Menu menu) } } - if (SessionUtils.getSession(activity).getServiceRegistry().getDocumentFolderService().getPermissions(node) - .canEdit()) + if (ConfigurableActionHelper.isVisible(getActivity(), getAccount(), getSession(), node, + ConfigurableActionHelper.ACTION_NODE_EDIT)) { mi = menu.add(Menu.NONE, R.id.menu_action_edit, Menu.FIRST + 50, R.string.edit); mi.setIcon(R.drawable.ic_edit); mi.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); } - if (SessionUtils.getSession(activity).getServiceRegistry().getDocumentFolderService().getPermissions(node) - .canDelete()) + if (ConfigurableActionHelper.isVisible(getActivity(), getAccount(), getSession(), node, + ConfigurableActionHelper.ACTION_NODE_DELETE)) { mi = menu.add(Menu.NONE, R.id.menu_action_delete, Menu.FIRST + 1000, R.string.delete); mi.setIcon(R.drawable.ic_delete); @@ -143,8 +144,8 @@ public boolean onActionItemClicked(ActionMode mode, MenuItem item) case R.id.menu_action_update: Intent i = new Intent(PrivateIntent.ACTION_PICK_FILE, null, getActivity(), PublicDispatcherActivity.class); - i.putExtra(PrivateIntent.EXTRA_FOLDER, AlfrescoStorageManager.getInstance(getActivity()) - .getDownloadFolder(getAccount())); + i.putExtra(PrivateIntent.EXTRA_FOLDER, + AlfrescoStorageManager.getInstance(getActivity()).getDownloadFolder(getAccount())); i.putExtra(PrivateIntent.EXTRA_ACCOUNT_ID, getAccount().getId()); getFragment().startActivityForResult(i, RequestCode.FILEPICKER); return true; diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java index b56db573..61878e89 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java @@ -27,7 +27,6 @@ import org.alfresco.mobile.android.api.model.Folder; import org.alfresco.mobile.android.api.model.Node; import org.alfresco.mobile.android.api.model.config.ConfigTypeIds; -import org.alfresco.mobile.android.api.model.impl.DocumentImpl; import org.alfresco.mobile.android.api.services.ConfigService; import org.alfresco.mobile.android.api.session.AlfrescoSession; import org.alfresco.mobile.android.api.session.CloudSession; @@ -37,6 +36,7 @@ import org.alfresco.mobile.android.application.activity.MainActivity; import org.alfresco.mobile.android.application.activity.PrivateDialogActivity; import org.alfresco.mobile.android.application.activity.PublicDispatcherActivity; +import org.alfresco.mobile.android.application.configuration.ConfigurableActionHelper; import org.alfresco.mobile.android.application.configuration.model.view.NodeDetailsConfigModel; import org.alfresco.mobile.android.application.fragments.DisplayUtils; import org.alfresco.mobile.android.application.fragments.FragmentDisplayer; @@ -105,10 +105,10 @@ import org.alfresco.mobile.android.ui.utils.Formatter; import org.alfresco.mobile.android.ui.utils.UIUtils; import org.apache.chemistry.opencmis.commons.PropertyIds; -import org.apache.chemistry.opencmis.commons.enums.Action; import android.content.ActivityNotFoundException; import android.content.ContentValues; +import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; @@ -328,9 +328,8 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) // Encrypt sync file if necessary AlfrescoStorageManager.getInstance(getActivity()).manageFile(dlFile); } - else if (modified && getSession() != null - && getSession().getServiceRegistry().getDocumentFolderService().getPermissions(node) != null - && getSession().getServiceRegistry().getDocumentFolderService().getPermissions(node).canEdit()) + else if (modified && getSession() != null && ConfigurableActionHelper.isVisible(getActivity(), + getAccount(), getSession(), node, ConfigurableActionHelper.ACTION_NODE_EDIT)) { // File modified + Sync File if (isSynced) @@ -559,6 +558,7 @@ public void onClick(View v) { b.setVisibility(View.GONE); } + hideActionIfNecessary(b, ConfigurableActionHelper.ACTION_NODE_OPEN); b = (ImageView) viewById(R.id.action_like); if (node instanceof NodeSyncPlaceHolder) @@ -588,6 +588,7 @@ public void onClick(View v) viewById(R.id.like_progress).setVisibility(View.GONE); } } + hideActionIfNecessary(b, ConfigurableActionHelper.ACTION_NODE_LIKE); // BUTTONS b = (ImageView) viewById(R.id.action_favorite); @@ -613,6 +614,8 @@ public void onClick(View v) b.setVisibility(View.GONE); viewById(R.id.favorite_progress).setVisibility(View.GONE); } + hideActionIfNecessary(b, ConfigurableActionHelper.ACTION_NODE_FAVORITE); + // SYNC b = (ImageView) viewById(R.id.action_sync); @@ -662,6 +665,8 @@ public void onClick(View v) { b.setVisibility(View.GONE); } + hideActionIfNecessary(b, ConfigurableActionHelper.ACTION_NODE_SYNC); + b = (ImageView) viewById(R.id.action_share); if (node.isDocument() && !isRestrictable) @@ -679,6 +684,7 @@ public void onClick(View v) { b.setVisibility(View.GONE); } + hideActionIfNecessary(b, ConfigurableActionHelper.ACTION_NODE_SHARE); } protected void displayTabs() @@ -694,6 +700,14 @@ protected void displayPreview() // /////////////////////////////////////////////////////////////////////////// // UI UTILS // /////////////////////////////////////////////////////////////////////////// + protected void hideActionIfNecessary(View v, int actionId) + { + if (!ConfigurableActionHelper.isVisible(getContext(), getAccount(), getSession(), node, actionId)) + { + v.setVisibility(View.GONE); + } + } + protected void displayData() { hide(R.id.empty); @@ -1136,7 +1150,7 @@ public void sync(View v) // /////////////////////////////////////////////////////////////////////////// // MENU // /////////////////////////////////////////////////////////////////////////// - public static void getMenu(AlfrescoSession session, Menu menu, Node node) + public void getMenu(Context context, AlfrescoSession session, Menu menu, Node node) { MenuItem mi; @@ -1147,22 +1161,24 @@ public static void getMenu(AlfrescoSession session, Menu menu, Node node) if (node.isDocument()) { - if (((Document) node).getContentStreamLength() > 0 && !isRestrict) + if (((Document) node).getContentStreamLength() > 0 && !isRestrict && ConfigurableActionHelper.isVisible( + getActivity(), getAccount(), getSession(), node, ConfigurableActionHelper.ACTION_NODE_DOWNLOAD)) { mi = menu.add(Menu.NONE, R.id.menu_action_download, Menu.FIRST, R.string.download); mi.setIcon(R.drawable.ic_download_light); mi.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); } - if (((Document) node).isLatestVersion() - && ((DocumentImpl) node).hasAllowableAction(Action.CAN_SET_CONTENT_STREAM.value())) + if (((Document) node).isLatestVersion() && ConfigurableActionHelper.isVisible(getActivity(), getAccount(), + getSession(), node, ConfigurableActionHelper.ACTION_NODE_UPDATE)) { mi = menu.add(Menu.NONE, R.id.menu_action_update, Menu.FIRST + 130, R.string.update); mi.setIcon(R.drawable.ic_upload); mi.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); } - if (!(session instanceof CloudSession)) + if (!(session instanceof CloudSession) && ConfigurableActionHelper.isVisible(getActivity(), getAccount(), + getSession(), node, ConfigurableActionHelper.ACTION_NODE_REVIEW)) { mi = menu.add(Menu.NONE, R.id.menu_workflow_add, Menu.FIRST + 500, R.string.process_start_review); mi.setIcon(R.drawable.ic_start_review); @@ -1172,7 +1188,8 @@ public static void getMenu(AlfrescoSession session, Menu menu, Node node) if (session == null) { return; } - if (session.getServiceRegistry().getDocumentFolderService().getPermissions(node).canEdit()) + if (ConfigurableActionHelper.isVisible(getActivity(), getAccount(), getSession(), node, + ConfigurableActionHelper.ACTION_NODE_EDIT)) { mi = menu.add(Menu.NONE, R.id.menu_action_edit, Menu.FIRST + 10, R.string.edit); mi.setIcon(R.drawable.ic_edit); @@ -1186,7 +1203,8 @@ public static void getMenu(AlfrescoSession session, Menu menu, Node node) mi.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); } - if (session.getServiceRegistry().getDocumentFolderService().getPermissions(node).canDelete()) + if (ConfigurableActionHelper.isVisible(getActivity(), getAccount(), getSession(), node, + ConfigurableActionHelper.ACTION_NODE_DELETE)) { mi = menu.add(Menu.NONE, R.id.menu_action_delete, Menu.FIRST + 1000, R.string.delete); mi.setIcon(R.drawable.ic_delete); @@ -1196,7 +1214,7 @@ public static void getMenu(AlfrescoSession session, Menu menu, Node node) public void getMenu(Menu menu) { - getMenu(getSession(), menu, node); + getMenu(getActivity(), getSession(), menu, node); } @Override diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/workflow/task/TasksFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/workflow/task/TasksFragment.java index 8a6d3165..ca90d2f9 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/workflow/task/TasksFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/workflow/task/TasksFragment.java @@ -23,6 +23,7 @@ import org.alfresco.mobile.android.api.model.Task; import org.alfresco.mobile.android.application.R; import org.alfresco.mobile.android.application.activity.PrivateDialogActivity; +import org.alfresco.mobile.android.application.configuration.ConfigurableActionHelper; import org.alfresco.mobile.android.application.configuration.model.view.TasksConfigModel; import org.alfresco.mobile.android.application.fragments.DisplayUtils; import org.alfresco.mobile.android.application.fragments.FragmentDisplayer; @@ -139,14 +140,21 @@ public void onResult(TasksEvent request) @Override protected View.OnClickListener onPrepareFabClickListener() { - return new View.OnClickListener() + if (ConfigurableActionHelper.isVisible(getContext(), getAccount(), ConfigurableActionHelper.ACTION_NODE_REVIEW)) { - @Override - public void onClick(View v) + return new View.OnClickListener() { - onOptionMenuItemSelected(R.id.menu_workflow_add); - } - }; + @Override + public void onClick(View v) + { + onOptionMenuItemSelected(R.id.menu_workflow_add); + } + }; + } + else + { + return null; + } } // /////////////////////////////////////////////////////////////////////////// diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/managers/ConfigManager.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/managers/ConfigManager.java index 218441ea..d400130c 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/managers/ConfigManager.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/managers/ConfigManager.java @@ -277,6 +277,9 @@ public ConfigService getConfig(long accountId, ConfigTypeIds id) case FEATURES: service = (service.getFeatureConfig() != null) ? service : null; break; + case ACTIONS: + service = (service.hasActionConfig()) ? service : null; + break; default: break; } @@ -373,7 +376,7 @@ public void onConfigContextEvent(ConfigurationEvent event) @Subscribe public void onSessionRequested(RequestSessionEvent event) { - if (event.accountToLoad == null){return;} + if (event.accountToLoad == null) { return; } if (hasConfig(event.accountToLoad.getId())) { currentService.remove(event.accountToLoad.getId()); diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/providers/storage/StorageAccessDocumentsProvider.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/providers/storage/StorageAccessDocumentsProvider.java index 25a615a4..f60e8d2e 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/providers/storage/StorageAccessDocumentsProvider.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/providers/storage/StorageAccessDocumentsProvider.java @@ -39,7 +39,6 @@ import org.alfresco.mobile.android.api.model.Folder; import org.alfresco.mobile.android.api.model.KeywordSearchOptions; import org.alfresco.mobile.android.api.model.Node; -import org.alfresco.mobile.android.api.model.Permissions; import org.alfresco.mobile.android.api.model.SearchLanguage; import org.alfresco.mobile.android.api.model.Site; import org.alfresco.mobile.android.api.services.DocumentFolderService; @@ -52,6 +51,7 @@ import org.alfresco.mobile.android.api.utils.IOUtils; import org.alfresco.mobile.android.api.utils.NodeRefUtils; import org.alfresco.mobile.android.application.R; +import org.alfresco.mobile.android.application.configuration.ConfigurableActionHelper; import org.alfresco.mobile.android.async.Operator; import org.alfresco.mobile.android.async.node.update.UpdateContentRequest; import org.alfresco.mobile.android.async.utils.ContentFileProgressImpl; @@ -1380,16 +1380,6 @@ private void addNodeRow(DocumentFolderCursor result, Node node, boolean isRoot) { int flags = 0; - Permissions permission = null; - try - { - permission = session.getServiceRegistry().getDocumentFolderService().getPermissions(node); - } - catch (Exception e) - { - - } - DocumentFolderCursor.RowBuilder row = result.newRow(); row.add(Document.COLUMN_DOCUMENT_ID, EncodedQueryUri.encodeItem(PREFIX_DOC, selectedAccountId, @@ -1400,7 +1390,9 @@ private void addNodeRow(DocumentFolderCursor result, Node node, boolean isRoot) { row.add(Document.COLUMN_SIZE, null); row.add(Document.COLUMN_MIME_TYPE, Document.MIME_TYPE_DIR); - if (permission != null && permission.canAddChildren()) + // if (permission != null && permission.canAddChildren()) + if (ConfigurableActionHelper.isVisible(getContext(), selectedAccount, session, parentFolder, + ConfigurableActionHelper.ACTION_NODE_UPLOAD)) { flags |= Document.FLAG_DIR_SUPPORTS_CREATE; } @@ -1412,12 +1404,14 @@ private void addNodeRow(DocumentFolderCursor result, Node node, boolean isRoot) flags |= Document.FLAG_SUPPORTS_THUMBNAIL; row.add(Document.COLUMN_MIME_TYPE, ((org.alfresco.mobile.android.api.model.Document) node).getContentStreamMimeType()); - if (permission != null && permission.canEdit()) + if (ConfigurableActionHelper.isVisible(getContext(), selectedAccount, session, parentFolder, + ConfigurableActionHelper.ACTION_NODE_EDIT)) { flags |= Document.FLAG_SUPPORTS_WRITE; } - if (permission != null && permission.canDelete()) + if (ConfigurableActionHelper.isVisible(getContext(), selectedAccount, session, parentFolder, + ConfigurableActionHelper.ACTION_NODE_DELETE)) { flags |= Document.FLAG_SUPPORTS_DELETE; } diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/ui/form/FormManager.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/ui/form/FormManager.java index 5b01ce20..0435eedc 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/ui/form/FormManager.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/ui/form/FormManager.java @@ -1,4 +1,22 @@ +/* + * Copyright (C) 2005-2016 Alfresco Software Limited. + * + * This file is part of Alfresco Mobile for Android. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.alfresco.mobile.android.application.ui.form; import java.io.Serializable; @@ -196,7 +214,7 @@ protected View generateForm(String formIdentifier, LayoutInflater li, boolean is } } - // Now time to evaluate everyone + // Now time to isVisible everyone evaluateViews(); return rootView; diff --git a/alfresco-mobile-android/src/main/res/values/strings.xml b/alfresco-mobile-android/src/main/res/values/strings.xml index 0988ed54..8ed78993 100644 --- a/alfresco-mobile-android/src/main/res/values/strings.xml +++ b/alfresco-mobile-android/src/main/res/values/strings.xml @@ -464,8 +464,6 @@ View Properties Edit Properties "Like" in progress - Like completed - Like complete Favorite Unfavorite diff --git a/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/ActionConfig.java b/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/ActionConfig.java new file mode 100644 index 00000000..9051cedc --- /dev/null +++ b/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/ActionConfig.java @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2005-2016 Alfresco Software Limited. + * + * This file is part of Alfresco Mobile for Android. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.alfresco.mobile.android.api.model.config; + +/** + * Base type for Action Configuration. + * + * @author Jean Marie Pascal + */ +public interface ActionConfig extends ItemConfig +{ + boolean isEnable(); +} diff --git a/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/ActionGroupConfig.java b/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/ActionGroupConfig.java new file mode 100644 index 00000000..a1bad8f0 --- /dev/null +++ b/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/ActionGroupConfig.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2005-2016 Alfresco Software Limited. + * + * This file is part of Alfresco Mobile for Android. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.alfresco.mobile.android.api.model.config; + +/** + * Base type for Action Group Configuration. + * + * @author Jean Marie Pascal + */ +public interface ActionGroupConfig extends GroupConfig +{ + /** + * Returns a list of GroupConfig or ItemConfig objects. + * + * @return + */ + ActionConfig getChildById(String actionId); +} diff --git a/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/ConfigConstants.java b/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/ConfigConstants.java index 6523567c..74a9cfbd 100644 --- a/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/ConfigConstants.java +++ b/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/ConfigConstants.java @@ -243,6 +243,8 @@ public interface ConfigConstants String ROOTVIEW_ID_VALUE = "root-view-id"; + String ROOTACTION_ID_VALUE = "root-action-id"; + String FOLDER_TYPE_ID = "folderTypeId"; // VALIDATION @@ -386,4 +388,50 @@ public static ValidationConfigType fromValue(String v) } } + // ///////////////////////////////////////////////// + // ACTION ENUM + // ///////////////////////////////////////////////// + enum ActionConfigType + { + ACTION_ID("action-id"), ACTION_GROUP_ID("action-group-id"), ACTION("action"); + + /** The value associated to an enum. */ + private final String value; + + /** + * Instantiates a new property type. + * + * @param v the value of the enum. + */ + ActionConfigType(String v) + { + value = v; + } + + /** + * Value. + * + * @return the string + */ + public String value() + { + return value; + } + + /** + * From value. + * + * @param v the value of the enum. + * @return the property type + */ + public static ActionConfigType fromValue(String v) + { + for (ActionConfigType c : ActionConfigType.values()) + { + if (c.value.equalsIgnoreCase(v)) { return c; } + } + return null; + } + } + } diff --git a/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/ConfigTypeIds.java b/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/ConfigTypeIds.java index a3541db2..6c1c3be5 100644 --- a/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/ConfigTypeIds.java +++ b/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/ConfigTypeIds.java @@ -25,15 +25,15 @@ public enum ConfigTypeIds { INFO("info"), - REPOSITORY("repository"), + REPOSITORY("repository"), VIEWS("views"), - FORMS("forms"), + FORMS("forms"), CREATION("creation"), FEATURES( - "features"), + "features"), ACTIONS("actions"), ACTION_GROUPS("action-groups"), VIEW_GROUPS("view-groups"), - FIELDS("fields"), - FIELD_GROUPS("field-groups"), + FIELDS( + "fields"), FIELD_GROUPS("field-groups"), EVALUATORS("evaluators"), VALIDATION_RULES("validation-rules"), PROFILES("profiles"); diff --git a/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/ProfileConfig.java b/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/ProfileConfig.java index 3e72457f..995a914d 100644 --- a/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/ProfileConfig.java +++ b/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/ProfileConfig.java @@ -1,20 +1,20 @@ -/******************************************************************************* - * Copyright (C) 2005-2014 Alfresco Software Limited. - * - * This file is part of the Alfresco Mobile SDK. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * +/* + * Copyright (C) 2005-2016 Alfresco Software Limited. + * + * This file is part of Alfresco Mobile for Android. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - ******************************************************************************/ + */ package org.alfresco.mobile.android.api.model.config; /** * Base type for Profile Configuration. @@ -29,4 +29,10 @@ public interface ProfileConfig extends BaseConfig /** Returns the id of the view or view group that acts as the entry point of the client. */ public String getRootViewId(); + + /** + * Returns the id of the action or action group that acts as the entry point + * of the client. + */ + public String getRootActionId(); } diff --git a/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/impl/ActionConfigImpl.java b/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/impl/ActionConfigImpl.java new file mode 100644 index 00000000..4befd9b9 --- /dev/null +++ b/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/impl/ActionConfigImpl.java @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2005-2016 Alfresco Software Limited. + * + * This file is part of Alfresco Mobile for Android. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.alfresco.mobile.android.api.model.config.impl; + +import java.io.Serializable; +import java.util.Map; + +import org.alfresco.mobile.android.api.model.config.ActionConfig; + +/** + * @author Jean Marie Pascal + */ +public class ActionConfigImpl extends ItemConfigImpl implements ActionConfig, Serializable +{ + protected String evaluatorId; + + private boolean isEnable = true; + + // /////////////////////////////////////////////////////////////////////////// + // CONSTRUCTORS + // /////////////////////////////////////////////////////////////////////////// + public ActionConfigImpl(String identifier, String label, String type, Map properties, + boolean enable) + { + super(identifier, null, label, null, type, null, properties); + isEnable = enable; + } + + public ActionConfigImpl(String identifier, String iconIdentifier, String label, String type, + Map properties, boolean enable) + { + super(identifier, null, label, null, type, null, properties); + isEnable = enable; + } + + public ActionConfigImpl(String identifier, String label, String type, String evaluatorId) + { + super(identifier, null, label, null, type, evaluatorId, null); + this.evaluatorId = evaluatorId; + } + + public ActionConfigImpl(String identifier, String iconIdentifier, String label, String description, String type, + Map properties, boolean enable, String evaluatorId) + { + super(identifier, iconIdentifier, label, description, type, evaluatorId, properties); + this.evaluatorId = evaluatorId; + isEnable = enable; + } + + // /////////////////////////////////////////////////////////////////////////// + // METHODS + // /////////////////////////////////////////////////////////////////////////// + public String getEvaluator() + { + return evaluatorId; + } + + @Override + public boolean isEnable() + { + return isEnable; + } +} diff --git a/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/impl/ActionGroupConfigImpl.java b/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/impl/ActionGroupConfigImpl.java new file mode 100644 index 00000000..0332a410 --- /dev/null +++ b/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/impl/ActionGroupConfigImpl.java @@ -0,0 +1,83 @@ +/******************************************************************************* + * Copyright (C) 005-014 Alfresco Software Limited. + * + * This file is part of the Alfresco Mobile SDK. + * + * Licensed under the Apache License, Version .0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ +package org.alfresco.mobile.android.api.model.config.impl; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import org.alfresco.mobile.android.api.model.config.ActionConfig; +import org.alfresco.mobile.android.api.model.config.ActionGroupConfig; + +/** + * @author Jean Marie Pascal + */ +public class ActionGroupConfigImpl extends ActionConfigImpl implements ActionGroupConfig +{ + private LinkedHashMap childrenIndex; + + private ArrayList children; + + // /////////////////////////////////////////////////////////////////////////// + // CONSTRUCTORS + // /////////////////////////////////////////////////////////////////////////// + ActionGroupConfigImpl(String identifier, String label, String type, ArrayList children, + String evaluatorId) + { + super(identifier, label, type, evaluatorId); + this.children = (children == null) ? new ArrayList(0) : children; + } + + ActionGroupConfigImpl(String identifier, String iconIdentifier, String label, String description, String type, + Map properties, LinkedHashMap childrenIndex, String evaluatorId) + { + super(identifier, iconIdentifier, label, description, type, properties, true, evaluatorId); + this.childrenIndex = (childrenIndex == null) ? new LinkedHashMap(0) : childrenIndex; + this.children = new ArrayList<>(this.childrenIndex.values()); + } + + // /////////////////////////////////////////////////////////////////////////// + // METHODS + // /////////////////////////////////////////////////////////////////////////// + public int getChildCount() + { + return (children == null) ? 0 : children.size(); + } + + public ActionConfig getChildAt(int index) + { + return (children == null) ? null : children.get(index); + } + + public ActionConfig getChildById(String id) + { + return (childrenIndex == null) ? null : childrenIndex.get(id); + } + + public void setChildren(ArrayList children) + { + this.children = children; + } + + @Override + public List getItems() + { + return children; + } +} diff --git a/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/impl/ActionHelper.java b/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/impl/ActionHelper.java new file mode 100644 index 00000000..d464b3a9 --- /dev/null +++ b/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/impl/ActionHelper.java @@ -0,0 +1,278 @@ +/******************************************************************************* + * Copyright (C) 005-014 Alfresco Software Limited. + * + * This file is part of the Alfresco Mobile SDK. + * + * Licensed under the Apache License, Version .0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ +package org.alfresco.mobile.android.api.model.config.impl; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import org.alfresco.mobile.android.api.model.config.ActionConfig; +import org.alfresco.mobile.android.api.model.config.ConfigConstants; +import org.alfresco.mobile.android.api.model.config.ConfigConstants.ActionConfigType; +import org.alfresco.mobile.android.api.model.config.ConfigScope; +import org.alfresco.mobile.android.api.model.config.GroupConfig; +import org.alfresco.mobile.android.api.model.config.ViewGroupConfig; +import org.apache.chemistry.opencmis.commons.impl.JSONConverter; + +/** + * @author Jean Marie Pascal + */ +public class ActionHelper extends HelperConfig +{ + private LinkedHashMap jsonActionConfigGroups; + + private LinkedHashMap actionConfigIndex; + + private LinkedHashMap actionIdIndex; + + // /////////////////////////////////////////////////////////////////////////// + // CONSTRUCTORS + // /////////////////////////////////////////////////////////////////////////// + ActionHelper(ConfigurationImpl context, StringHelper localHelper) + { + super(context, localHelper); + } + + ActionHelper(ConfigurationImpl context, StringHelper localHelper, + LinkedHashMap ActionConfigIndex) + { + super(context, localHelper); + this.actionConfigIndex = ActionConfigIndex; + } + + // /////////////////////////////////////////////////////////////////////////// + // INIT + // /////////////////////////////////////////////////////////////////////////// + void addActions(Map views) + { + actionConfigIndex = new LinkedHashMap<>(views.size()); + actionIdIndex = new LinkedHashMap<>(views.size()); + ActionConfig actionConfig; + for (Entry entry : views.entrySet()) + { + actionConfig = parse(JSONConverter.getMap(entry.getValue()), entry.getKey()); + if (actionConfig == null) + { + continue; + } + actionConfigIndex.put(actionConfig.getType(), actionConfig); + actionIdIndex.put(actionConfig.getIdentifier(), actionConfig); + } + } + + void addActionGroups(List viewsGroup) + { + jsonActionConfigGroups = new LinkedHashMap<>(viewsGroup.size()); + String viewGroupId; + for (Object object : viewsGroup) + { + viewGroupId = JSONConverter.getString(JSONConverter.getMap(object), ConfigConstants.ID_VALUE); + if (viewGroupId == null) + { + continue; + } + jsonActionConfigGroups.put(viewGroupId, object); + } + } + + // /////////////////////////////////////////////////////////////////////////// + // METHODS + // /////////////////////////////////////////////////////////////////////////// + public boolean hasActionConfig() + { + return ((jsonActionConfigGroups != null && !jsonActionConfigGroups.isEmpty()) + || (actionConfigIndex != null && !actionConfigIndex.isEmpty())); + } + + public ActionConfig getActionByType(String id) + { + return getActionByType(id, null); + } + + public ActionConfig getActionByType(String id, ConfigScope scope) + { + return retrieveConfig(id, scope); + } + + protected ActionConfig retrieveConfig(String id, ConfigScope scope) + { + ActionConfigImpl config = null; + if (jsonActionConfigGroups != null && jsonActionConfigGroups.containsKey(id)) + { + config = (ActionConfigImpl) parse(JSONConverter.getMap(jsonActionConfigGroups.get(id)), id); + } + else if (actionConfigIndex != null && actionConfigIndex.containsKey(id)) + { + config = (ActionConfigImpl) actionConfigIndex.get(id); + } + else if (actionIdIndex != null && actionIdIndex.containsKey(id)) + { + config = (ActionConfigImpl) actionIdIndex.get(id); + } + else + { + return null; + } + + // Evaluate + if (getEvaluatorHelper() == null) + { + return (config.getEvaluator() == null) ? config : null; + } + else + { + if (!getEvaluatorHelper().evaluate(config.getEvaluator(), scope)) { return null; } + if (config instanceof ActionGroupConfigImpl && ((ActionGroupConfigImpl) config).getItems() != null + && ((ActionGroupConfigImpl) config).getItems().size() > 0) + { + ((ActionGroupConfigImpl) config) + .setChildren(evaluateChildren(((ActionGroupConfigImpl) config).getItems())); + } + } + return config; + + } + + @SuppressWarnings("unchecked") + private ArrayList evaluateChildren(List listConfig) + { + if (listConfig == null) { return new ArrayList<>(0); } + ArrayList evaluatedViews = new ArrayList<>(listConfig.size()); + boolean addViewAsChild = true; + for (ActionConfig ActionConfig : listConfig) + { + if (getEvaluatorHelper() == null) + { + addViewAsChild = (((ActionConfigImpl) ActionConfig).getEvaluator() == null); + } + else if (!getEvaluatorHelper().evaluate(((ActionConfigImpl) ActionConfig).getEvaluator(), null)) + { + addViewAsChild = false; + } + + if (addViewAsChild) + { + evaluatedViews.add(ActionConfig); + if (ActionConfig instanceof ViewGroupConfig + && ((GroupConfig) ActionConfig).getItems() != null + && ((GroupConfig) ActionConfig).getItems().size() > 0) + { + ((ActionGroupConfigImpl) ActionConfig) + .setChildren(evaluateChildren(((ActionGroupConfigImpl) ActionConfig).getItems())); + } + } + addViewAsChild = true; + } + return evaluatedViews; + } + + // /////////////////////////////////////////////////////////////////////////// + // V1.0 + // /////////////////////////////////////////////////////////////////////////// + protected ActionConfig parse(Object object) + { + if (object instanceof Map) + { + Map viewMap = JSONConverter.getMap(object); + if (viewMap.containsKey(ConfigConstants.ITEM_TYPE_VALUE)) + { + + ActionConfigType type = ActionConfigType + .fromValue(JSONConverter.getString(viewMap, ConfigConstants.ITEM_TYPE_VALUE)); + + if (type == null) + { + type = ActionConfigType.ACTION; + } + + switch (type) + { + case ACTION_ID: + // View is defined inside the views registry + return getActionByType(JSONConverter.getString(viewMap, ActionConfigType.ACTION_ID.value())); + case ACTION_GROUP_ID: + // View is defined inside the view group registry + return getActionByType( + JSONConverter.getString(viewMap, ActionConfigType.ACTION_GROUP_ID.value())); + case ACTION: + default: + // inline definition + return parse( + JSONConverter.getMap(JSONConverter.getMap(object).get(ConfigConstants.VIEW_VALUE))); + } + } + else + { + return parse(JSONConverter.getMap(object), null); + } + } + else if (object instanceof String) + { + return getActionByType((String) object); + } + else + { + return null; + } + } + + protected ActionConfig parse(Map json, String identifier) + { + ItemConfigData data = new ItemConfigData(identifier, json, getConfiguration()); + + // Enable + Boolean isEnable = true; + if (json.containsKey(ConfigConstants.ENABLE_VALUE)) + { + isEnable = JSONConverter.getBoolean(json, ConfigConstants.ENABLE_VALUE); + } + + if (isEnable == null) + { + isEnable = true; + } + + // Check if it's a group view + LinkedHashMap childrenIndex = null; + if (json.containsKey(ConfigConstants.ITEMS_VALUE)) + { + List childrenObject = JSONConverter.getList(json.get(ConfigConstants.ITEMS_VALUE)); + LinkedHashMap childrenActionConfig = new LinkedHashMap<>(childrenObject.size()); + ActionConfig ActionConfig = null; + for (Object child : childrenObject) + { + ActionConfig = parse(child); + if (ActionConfig == null) + { + continue; + } + childrenActionConfig.put(ActionConfig.getType(), ActionConfig); + } + childrenIndex = childrenActionConfig; + return new ActionGroupConfigImpl(data.identifier, data.iconIdentifier, data.label, data.description, + data.type, data.properties, childrenIndex, data.evaluatorId); + } + else + { + return new ActionConfigImpl(data.identifier, data.iconIdentifier, data.label, data.description, data.type, + data.properties, isEnable, data.evaluatorId); + } + } +} diff --git a/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/impl/ConfigurationImpl.java b/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/impl/ConfigurationImpl.java index 8f26c87b..1c348b3a 100644 --- a/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/impl/ConfigurationImpl.java +++ b/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/impl/ConfigurationImpl.java @@ -28,6 +28,7 @@ import java.util.Map.Entry; import org.alfresco.mobile.android.api.model.Node; +import org.alfresco.mobile.android.api.model.config.ActionConfig; import org.alfresco.mobile.android.api.model.config.ConfigConstants; import org.alfresco.mobile.android.api.model.config.ConfigInfo; import org.alfresco.mobile.android.api.model.config.ConfigScope; @@ -70,6 +71,8 @@ public class ConfigurationImpl private ProfileHelper profileHelper; + private ActionHelper actionHelper; + private RepositoryConfig repositoryConfig; private WeakReference session; @@ -230,6 +233,27 @@ public static ConfigurationImpl parseJson(AlfrescoSession session, Map getFeatureConfig() if (featureHelper == null) { return new ArrayList<>(0); } return featureHelper.getFeatures(); } + // /////////////////////////////////////////////////////////////////////////// // INTERNALS // /////////////////////////////////////////////////////////////////////////// diff --git a/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/impl/ProfileConfigImpl.java b/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/impl/ProfileConfigImpl.java index 2237ac21..f86edce4 100644 --- a/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/impl/ProfileConfigImpl.java +++ b/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/impl/ProfileConfigImpl.java @@ -1,20 +1,20 @@ -/******************************************************************************* - * Copyright (C) 2005-2014 Alfresco Software Limited. - * - * This file is part of the Alfresco Mobile SDK. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * +/* + * Copyright (C) 2005-2016 Alfresco Software Limited. + * + * This file is part of Alfresco Mobile for Android. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - ******************************************************************************/ + */ package org.alfresco.mobile.android.api.model.config.impl; import java.util.Map; @@ -33,6 +33,8 @@ public class ProfileConfigImpl extends BaseConfigImpl implements ProfileConfig private String rootViewId; + private String rootActionId; + private String evaluatorId; // /////////////////////////////////////////////////////////////////////////// @@ -55,6 +57,7 @@ static ProfileConfig parse(String identifier, Map json, Configur profileConfig.evaluatorId = JSONConverter.getString(json, ConfigConstants.EVALUATOR); profileConfig.rootViewId = JSONConverter.getString(json, ConfigConstants.ROOTVIEW_ID_VALUE); + profileConfig.rootActionId = JSONConverter.getString(json, ConfigConstants.ROOTACTION_ID_VALUE); return profileConfig; } @@ -78,4 +81,10 @@ public String getRootViewId() { return rootViewId; } + + @Override + public String getRootActionId() + { + return rootActionId; + } } diff --git a/platform/foundation/src/main/java/org/alfresco/mobile/android/api/services/ConfigService.java b/platform/foundation/src/main/java/org/alfresco/mobile/android/api/services/ConfigService.java index f0e47b9b..fa32f0cb 100644 --- a/platform/foundation/src/main/java/org/alfresco/mobile/android/api/services/ConfigService.java +++ b/platform/foundation/src/main/java/org/alfresco/mobile/android/api/services/ConfigService.java @@ -19,6 +19,7 @@ import java.util.List; +import org.alfresco.mobile.android.api.model.config.ActionConfig; import org.alfresco.mobile.android.api.model.config.ConfigInfo; import org.alfresco.mobile.android.api.model.config.ConfigScope; import org.alfresco.mobile.android.api.model.config.CreationConfig; @@ -150,4 +151,16 @@ public interface ConfigService extends Service /** Returns the configuration for creation related features. */ List getFeatureConfig(); + + // /////////////////////////////////////////////////////////////////////////// + // ACTIONS + /** + * Returns the configuration for the action with the given identifier and + * optionally for the given node. + */ + boolean hasActionConfig(); + + ActionConfig getActionConfig(String actionId); + + ActionConfig getActionConfig(String actionId, ConfigScope scope); } diff --git a/platform/foundation/src/main/java/org/alfresco/mobile/android/api/services/impl/AbstractConfigServiceImpl.java b/platform/foundation/src/main/java/org/alfresco/mobile/android/api/services/impl/AbstractConfigServiceImpl.java index 9b67a209..9983fb21 100644 --- a/platform/foundation/src/main/java/org/alfresco/mobile/android/api/services/impl/AbstractConfigServiceImpl.java +++ b/platform/foundation/src/main/java/org/alfresco/mobile/android/api/services/impl/AbstractConfigServiceImpl.java @@ -31,6 +31,7 @@ import org.alfresco.mobile.android.api.model.Folder; import org.alfresco.mobile.android.api.model.Node; import org.alfresco.mobile.android.api.model.SearchLanguage; +import org.alfresco.mobile.android.api.model.config.ActionConfig; import org.alfresco.mobile.android.api.model.config.ConfigConstants; import org.alfresco.mobile.android.api.model.config.ConfigInfo; import org.alfresco.mobile.android.api.model.config.ConfigScope; @@ -335,6 +336,29 @@ public boolean hasViewConfig() return configuration != null && configuration.hasViewConfig(); } + // /////////////////////////////////////////////////////////////////////////// + // ACTIONS + // /////////////////////////////////////////////////////////////////////////// + @Override + public ActionConfig getActionConfig(String viewId, ConfigScope scope) + { + if (configuration == null) { return null; } + return configuration.getActionConfig(viewId, scope); + } + + @Override + public ActionConfig getActionConfig(String viewId) + { + if (configuration == null) { return null; } + return configuration.getActionConfig(viewId); + } + + @Override + public boolean hasActionConfig() + { + return configuration != null && configuration.hasActionConfig(); + } + // /////////////////////////////////////////////////////////////////////////// // FORMS // /////////////////////////////////////////////////////////////////////////// diff --git a/platform/foundation/src/main/java/org/alfresco/mobile/android/api/services/impl/LocalConfigServiceImpl.java b/platform/foundation/src/main/java/org/alfresco/mobile/android/api/services/impl/LocalConfigServiceImpl.java index e5d1f82c..496e0a17 100644 --- a/platform/foundation/src/main/java/org/alfresco/mobile/android/api/services/impl/LocalConfigServiceImpl.java +++ b/platform/foundation/src/main/java/org/alfresco/mobile/android/api/services/impl/LocalConfigServiceImpl.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; +import org.alfresco.mobile.android.api.model.config.ActionConfig; import org.alfresco.mobile.android.api.model.config.ConfigInfo; import org.alfresco.mobile.android.api.model.config.ConfigScope; import org.alfresco.mobile.android.api.model.config.ConfigTypeIds; @@ -224,6 +225,29 @@ public boolean hasViewConfig() return configuration != null && configuration.hasViewConfig(); } + // /////////////////////////////////////////////////////////////////////////// + // VIEWS + // /////////////////////////////////////////////////////////////////////////// + @Override + public ActionConfig getActionConfig(String viewId, ConfigScope scope) + { + if (configuration == null) { return null; } + return configuration.getActionConfig(viewId, scope); + } + + @Override + public ActionConfig getActionConfig(String viewId) + { + if (configuration == null) { return null; } + return configuration.getActionConfig(viewId); + } + + @Override + public boolean hasActionConfig() + { + return configuration != null && configuration.hasActionConfig(); + } + // /////////////////////////////////////////////////////////////////////////// // FORMS // /////////////////////////////////////////////////////////////////////////// From 4b2153c2388af8d99179ae2ad2b9a9bf8246394d Mon Sep 17 00:00:00 2001 From: jmpascal Date: Mon, 4 Apr 2016 15:41:49 +0200 Subject: [PATCH 05/25] ANDROID-8 Version increase --- alfresco-mobile-android/build.gradle | 2 +- .../android/application/VersionNumber.java | 5 +++- .../application/activity/BaseActivity.java | 23 +++++++++++++++---- .../FileExplorerMenuFragment.java | 22 ++++++------------ .../fileexplorer/LibraryFragment.java | 16 ++++++++++++- gradle.properties | 2 +- .../platform/extensions/AnalyticsManager.java | 6 +++++ 7 files changed, 52 insertions(+), 24 deletions(-) diff --git a/alfresco-mobile-android/build.gradle b/alfresco-mobile-android/build.gradle index 98d429de..cfca74f8 100644 --- a/alfresco-mobile-android/build.gradle +++ b/alfresco-mobile-android/build.gradle @@ -27,7 +27,7 @@ android { minSdkVersion 15 targetSdkVersion 23 - versionCode 62 + versionCode 63 versionName VERSION_NAME diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/VersionNumber.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/VersionNumber.java index 06aa348a..5663990a 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/VersionNumber.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/VersionNumber.java @@ -67,5 +67,8 @@ public interface VersionNumber /** Release April 2015. */ int VERSION_1_6_2 = 61; - int LATEST_VERSION = VERSION_1_6_2; + /** Release XXX 2015. */ + int VERSION_1_6_3 = 63; + + int LATEST_VERSION = VERSION_1_6_3; } diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/activity/BaseActivity.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/activity/BaseActivity.java index 180def30..82194425 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/activity/BaseActivity.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/activity/BaseActivity.java @@ -18,10 +18,13 @@ package org.alfresco.mobile.android.application.activity; import org.alfresco.mobile.android.application.R; +import org.alfresco.mobile.android.application.fragments.fileexplorer.FileExplorerFragment; import org.alfresco.mobile.android.application.fragments.preferences.PasscodePreferences; import org.alfresco.mobile.android.application.security.PassCodeActivity; import org.alfresco.mobile.android.platform.SessionManager; import org.alfresco.mobile.android.platform.accounts.AlfrescoAccountManager; +import org.alfresco.mobile.android.platform.extensions.AnalyticsHelper; +import org.alfresco.mobile.android.platform.extensions.AnalyticsManager; import org.alfresco.mobile.android.platform.intent.AlfrescoIntentAPI; import org.alfresco.mobile.android.platform.intent.PrivateIntent; import org.alfresco.mobile.android.ui.activity.AlfrescoActivity; @@ -30,12 +33,12 @@ import android.content.Intent; import android.content.pm.PackageManager; import android.os.Bundle; +import android.os.Environment; import android.util.TypedValue; import android.view.ActionMode; import android.view.View; import android.view.WindowManager; import android.widget.ProgressBar; -import android.widget.Toast; /** * Base class for all activities. @@ -46,7 +49,9 @@ public abstract class BaseActivity extends AlfrescoActivity { protected boolean activateCheckPasscode = false; - public final static int REQUEST_CODE_ASK_PERMISSIONS = 123; + public final static int REQUEST_PERMISSION_SD = 70; + + public final static int REQUEST_PERMISSION_DL = 80; // /////////////////////////////////////////////////////////////////////////// // LIFECYCLE @@ -195,16 +200,24 @@ public void onRequestPermissionsResult(int requestCode, String[] permissions, in { switch (requestCode) { - case REQUEST_CODE_ASK_PERMISSIONS: + case REQUEST_PERMISSION_SD: + case REQUEST_PERMISSION_DL: if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { + FileExplorerFragment.with(this) + .file(requestCode == REQUEST_PERMISSION_DL ? Environment.getExternalStorageDirectory() + : Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)) + .display(); + // Permission Granted - Toast.makeText(this, "WRITE_CONTACTS Granted", Toast.LENGTH_SHORT).show(); + AnalyticsHelper.reportOperationEvent(this, AnalyticsManager.CATEGORY_SETTINGS, + AnalyticsManager.ACTION_GRANT_PERMISSION, AnalyticsManager.LABEL_STORAGE, 1, false); } else { // Permission Denied - Toast.makeText(this, "WRITE_CONTACTS Denied", Toast.LENGTH_SHORT).show(); + AnalyticsHelper.reportOperationEvent(this, AnalyticsManager.CATEGORY_SETTINGS, + AnalyticsManager.ACTION_DENY_PERMISSION, AnalyticsManager.LABEL_STORAGE, 1, false); } break; default: diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/fileexplorer/FileExplorerMenuFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/fileexplorer/FileExplorerMenuFragment.java index 081fae9d..91771b74 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/fileexplorer/FileExplorerMenuFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/fileexplorer/FileExplorerMenuFragment.java @@ -174,7 +174,7 @@ public void onClick(View v) { FileExplorerFragment.with(getActivity()).file(currentLocation).display(); } - else if (mediatype >= 0) + else if (mediatype >= 0 && requestWriteExternalStorage(null) != null) { LibraryFragment.with(getActivity()).mediaType(mediatype).display(); } @@ -206,24 +206,16 @@ private File requestWriteExternalStorage(final String externalFolder) if (hasWriteExternalStoragePermission != PackageManager.PERMISSION_GRANTED) { if (!ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), - Manifest.permission.WRITE_CONTACTS)) + Manifest.permission.WRITE_EXTERNAL_STORAGE)) { - showMessageOKCancel("You need to allow access to your storage", - new DialogInterface.OnClickListener() - { - @Override - public void onClick(DialogInterface dialog, int which) - { - ActivityCompat.requestPermissions(getActivity(), - new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, - BaseActivity.REQUEST_CODE_ASK_PERMISSIONS); - } - }); + ActivityCompat.requestPermissions(getActivity(), + new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, externalFolder == null + ? BaseActivity.REQUEST_PERMISSION_SD : BaseActivity.REQUEST_PERMISSION_DL); return null; } ActivityCompat.requestPermissions(getActivity(), - new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, - BaseActivity.REQUEST_CODE_ASK_PERMISSIONS); + new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, externalFolder == null + ? BaseActivity.REQUEST_PERMISSION_SD : BaseActivity.REQUEST_PERMISSION_DL); return null; } else diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/fileexplorer/LibraryFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/fileexplorer/LibraryFragment.java index 93957f7b..8caede63 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/fileexplorer/LibraryFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/fileexplorer/LibraryFragment.java @@ -32,13 +32,17 @@ import org.alfresco.mobile.android.ui.activity.AlfrescoActivity; import org.alfresco.mobile.android.ui.fragments.BaseCursorGridFragment; +import android.Manifest; import android.content.Intent; +import android.content.pm.PackageManager; import android.database.Cursor; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.provider.MediaStore; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; +import android.support.v4.content.ContextCompat; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.text.Html; @@ -148,7 +152,17 @@ protected BaseAdapter onAdapterCreation() @Override protected void performRequest(ListingContext lcorigin) { - getLoaderManager().initLoader(0, null, this); + int hasWriteExternalStoragePermission = PackageManager.PERMISSION_GRANTED; + if (Build.VERSION.SDK_INT >= 23) + { + hasWriteExternalStoragePermission = ContextCompat.checkSelfPermission(getActivity(), + Manifest.permission.WRITE_EXTERNAL_STORAGE); + } + + if (hasWriteExternalStoragePermission == PackageManager.PERMISSION_GRANTED) + { + getLoaderManager().initLoader(0, null, this); + } } // /////////////////////////////////////////////////////////////////////////// diff --git a/gradle.properties b/gradle.properties index f200a018..98bb703f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -39,7 +39,7 @@ ## DEFAULT BUILD VARIANT #################################################################### # Current Version number of the application -VERSION_NAME=1.6.2 +VERSION_NAME=1.6.3 # Build Number of the application # Overrides by Continuous Integration System during build diff --git a/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/extensions/AnalyticsManager.java b/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/extensions/AnalyticsManager.java index 2e2662fc..23426985 100644 --- a/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/extensions/AnalyticsManager.java +++ b/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/extensions/AnalyticsManager.java @@ -135,6 +135,10 @@ public abstract class AnalyticsManager extends Manager public static final String ACTION_COMPLETE_TASK = "Complete"; + public static final String ACTION_GRANT_PERMISSION = "Grant Permission"; + + public static final String ACTION_DENY_PERMISSION = "Deny Permission"; + /////////////////////////////////////////////////////////// // EVENTS : LABELS /////////////////////////////////////////////////////////// @@ -190,6 +194,8 @@ public abstract class AnalyticsManager extends Manager public static final String LABEL_PEOPLE = "People"; + public static final String LABEL_STORAGE = "Storage"; + /////////////////////////////////////////////////////////// // CUSTOM DIMENSIONS /////////////////////////////////////////////////////////// From 63d6962f40f899087cb1e0fbfce082c507204465 Mon Sep 17 00:00:00 2001 From: jmpascal Date: Tue, 5 Apr 2016 10:45:35 +0200 Subject: [PATCH 06/25] ANDROID-283 --- .../fragments/node/details/MetadataUtils.java | 136 ------------------ .../node/details/NodeDetailsFragment.java | 44 +++++- .../node/download/DownloadDialogFragment.java | 15 +- .../application/managers/ActionUtils.java | 26 ++++ .../src/main/res/values/ids.xml | 1 + .../src/main/res/values/strings.xml | 3 + 6 files changed, 80 insertions(+), 145 deletions(-) delete mode 100644 alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/MetadataUtils.java diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/MetadataUtils.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/MetadataUtils.java deleted file mode 100644 index 8087fbf6..00000000 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/MetadataUtils.java +++ /dev/null @@ -1,136 +0,0 @@ -/******************************************************************************* - * Copyright (C) 2005-2014 Alfresco Software Limited. - * - * This file is part of Alfresco Mobile for Android. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *******************************************************************************/ -package org.alfresco.mobile.android.application.fragments.node.details; - -import java.util.LinkedHashMap; -import java.util.Map; - -import org.alfresco.mobile.android.api.constants.ContentModel; -import org.alfresco.mobile.android.foundation.R; - -public class MetadataUtils -{ - - @SuppressWarnings("serial") - private static final Map ASPECT_GENERAL = new LinkedHashMap(2) - { - { - put(ContentModel.PROP_NAME, R.string.metadata_prop_name); - put(ContentModel.PROP_DESCRIPTION, R.string.metadata_prop_description); - put(ContentModel.PROP_VERSION_LABEL, R.string.metadata_prop_version); - put(ContentModel.PROP_CREATOR, R.string.metadata_prop_creator); - put(ContentModel.PROP_CREATED, R.string.metadata_prop_creationdate); - put(ContentModel.PROP_MODIFIED, R.string.metadata_prop_modificationdate); - put(ContentModel.PROP_MODIFIER, R.string.metadata_prop_modifier); - } - }; - - @SuppressWarnings("serial") - private static final Map ASPECT_GEOGRAPHIC = new LinkedHashMap(2) - { - { - put(ContentModel.PROP_LATITUDE, R.string.metadata_prop_latitude); - put(ContentModel.PROP_LONGITUDE, R.string.metadata_prop_longitude); - } - }; - - @SuppressWarnings("serial") - private static final Map ASPECT_AUDIO = new LinkedHashMap(9) - { - { - put(ContentModel.PROP_ALBUM, R.string.metadata_prop_album); - put(ContentModel.PROP_ARTIST, R.string.metadata_prop_artist); - put(ContentModel.PROP_COMPOSER, R.string.metadata_prop_composer); - put(ContentModel.PROP_ENGINEER, R.string.metadata_prop_engineer); - put(ContentModel.PROP_GENRE, R.string.metadata_prop_genre); - put(ContentModel.PROP_TRACK_NUMBER, R.string.metadata_prop_track_number); - put(ContentModel.PROP_RELEASE_DATE, R.string.metadata_prop_release_date); - put(ContentModel.PROP_SAMPLE_RATE, R.string.metadata_prop_sample_rate); - put(ContentModel.PROP_SAMPLE_TYPE, R.string.metadata_prop_sample_type); - put(ContentModel.PROP_CHANNEL_TYPE, R.string.metadata_prop_channel_type); - put(ContentModel.PROP_COMPRESSOR, R.string.metadata_prop_compressor); - - } - }; - - @SuppressWarnings("serial") - private static final Map ASPECT_EXIF = new LinkedHashMap(15) - { - { - put(ContentModel.PROP_DATETIME_ORIGINAL, R.string.metadata_prop_datetime_original); - put(ContentModel.PROP_PIXELX_DIMENSION, R.string.metadata_prop_pixelx_dimension); - put(ContentModel.PROP_PIXELY_DIMENSION, R.string.metadata_prop_pixely_dimension); - put(ContentModel.PROP_EXPOSURE_TIME, R.string.metadata_prop_exposure_time); - put(ContentModel.PROP_FNUMBER, R.string.metadata_prop_fnumber); - put(ContentModel.PROP_FLASH_ACTIVATED, R.string.metadata_prop_flash_activated); - put(ContentModel.PROP_FOCAL_LENGTH, R.string.metadata_prop_focal_length); - put(ContentModel.PROP_ISO_SPEED, R.string.metadata_prop_iso_speed); - put(ContentModel.PROP_MANUFACTURER, R.string.metadata_prop_manufacturer); - put(ContentModel.PROP_MODEL, R.string.metadata_prop_model); - put(ContentModel.PROP_SOFTWARE, R.string.metadata_prop_software); - put(ContentModel.PROP_ORIENTATION, R.string.metadata_prop_orientation); - put(ContentModel.PROP_XRESOLUTION, R.string.metadata_prop_xresolution); - put(ContentModel.PROP_YRESOLUTION, R.string.metadata_prop_yresolution); - put(ContentModel.PROP_RESOLUTION_UNIT, R.string.metadata_prop_resolution_unit); - } - }; - - @SuppressWarnings("serial") - private static final Map ASPECT_RESTRICTABLE = new LinkedHashMap(1) - { - { - put(ContentModel.PROP_OFFLINE_EXPIRES_AFTER, R.string.metadata_prop_offline_expires_after); - } - }; - - @SuppressWarnings("serial") - private static final Map> ASPECT_PROPS_LIST = new LinkedHashMap>( - 3) - { - { - put(ContentModel.ASPECT_GENERAL, ASPECT_GENERAL); - put(ContentModel.ASPECT_GEOGRAPHIC, ASPECT_GEOGRAPHIC); - put(ContentModel.ASPECT_AUDIO, ASPECT_AUDIO); - put(ContentModel.ASPECT_EXIF, ASPECT_EXIF); - put(ContentModel.ASPECT_RESTRICTABLE, ASPECT_RESTRICTABLE); - } - }; - - @SuppressWarnings("serial") - private static final Map ASPECTS = new LinkedHashMap(3) - { - { - put(ContentModel.ASPECT_GENERAL, R.string.metadata); - put(ContentModel.ASPECT_GEOGRAPHIC, R.string.metadata_aspect_geographic); - put(ContentModel.ASPECT_AUDIO, R.string.metadata_aspect_audio); - put(ContentModel.ASPECT_EXIF, R.string.metadata_aspect_exif); - put(ContentModel.ASPECT_RESTRICTABLE, R.string.metadata_aspect_restrictable); - } - }; - - public static Map getPropertyLabel(String aspect) - { - return ASPECT_PROPS_LIST.get(aspect); - } - - public static Integer getAspectLabel(String aspect) - { - return ASPECTS.get(aspect); - } - -} diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java index 61878e89..c4b91ead 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java @@ -616,7 +616,6 @@ public void onClick(View v) } hideActionIfNecessary(b, ConfigurableActionHelper.ACTION_NODE_FAVORITE); - // SYNC b = (ImageView) viewById(R.id.action_sync); @@ -667,7 +666,6 @@ public void onClick(View v) } hideActionIfNecessary(b, ConfigurableActionHelper.ACTION_NODE_SYNC); - b = (ImageView) viewById(R.id.action_share); if (node.isDocument() && !isRestrictable) { @@ -962,6 +960,11 @@ else if (path.startsWith("/Sites/")) } public void openin() + { + openin(false); + } + + public void openin(boolean withAlfresco) { if (isRestrictable) { return; } @@ -1004,16 +1007,26 @@ public void onActivityNotFoundException(ActivityNotFoundException e) // getActivity().getApplicationContext(), node, acc); // observer.startWatching(); // If sync file + sync activate - ActionUtils.openIn(this, syncFile, - MimeTypeManager.getInstance(getActivity()).getMIMEType(syncFile.getName()), - RequestCode.SAVE_BACK); + if (withAlfresco) + { + ActionUtils.openIn(this, syncFile, + MimeTypeManager.getInstance(getActivity()).getMIMEType(syncFile.getName()), + RequestCode.SAVE_BACK); + } + else + { + ActionUtils.openWithAlfrescoTextEditor(this, syncFile, + MimeTypeManager.getInstance(getActivity()).getMIMEType(syncFile.getName()), + RequestCode.SAVE_BACK); + } } } else { // Other case b.putParcelable(DownloadDialogFragment.ARGUMENT_DOCUMENT, node); - b.putInt(DownloadDialogFragment.ARGUMENT_ACTION, DownloadDialogFragment.ACTION_OPEN); + b.putInt(DownloadDialogFragment.ARGUMENT_ACTION, withAlfresco + ? DownloadDialogFragment.ACTION_OPEN_WITH_ALFRESCO : DownloadDialogFragment.ACTION_OPEN); DialogFragment frag = new DownloadDialogFragment(); frag.setArguments(b); frag.show(getActivity().getSupportFragmentManager(), DownloadDialogFragment.TAG); @@ -1184,6 +1197,21 @@ public void getMenu(Context context, AlfrescoSession session, Menu menu, Node no mi.setIcon(R.drawable.ic_start_review); mi.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); } + + try + { + String mimetype = ((Document) node).getContentStreamMimeType(); + if (!TextUtils.isEmpty(mimetype) && mimetype.startsWith(MimeType.TYPE_TEXT)) + { + mi = menu.add(Menu.NONE, R.id.menu_action_open_with_alfresco_editor, Menu.FIRST + 50, + R.string.open_in_alfresco_editor); + mi.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); + } + } + catch (Exception e) + { + + } } if (session == null) { return; } @@ -1259,6 +1287,9 @@ public boolean onOptionsItemSelected(MenuItem item) node.getProperty(ContentModel.PROP_LATITUDE).getValue().toString(), node.getProperty(ContentModel.PROP_LONGITUDE).getValue().toString()); return true; + case R.id.menu_action_open_with_alfresco_editor: + openin(true); + return true; case R.id.menu_workflow_add: Intent in = new Intent(PrivateIntent.ACTION_START_PROCESS, null, getActivity(), PrivateDialogActivity.class); @@ -1570,7 +1601,6 @@ protected Fragment getFragment(String tag) { return getActivity().getSupportFragmentManager().findFragmentByTag(tag); } - // /////////////////////////////////////////////////////////////////////////// // BUILDER // /////////////////////////////////////////////////////////////////////////// diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/download/DownloadDialogFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/download/DownloadDialogFragment.java index 90c42b42..766c949f 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/download/DownloadDialogFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/download/DownloadDialogFragment.java @@ -48,6 +48,8 @@ public class DownloadDialogFragment extends DialogFragment implements DownloadTa public static final int ACTION_OPEN = 1; + public static final int ACTION_OPEN_WITH_ALFRESCO = 4; + public static final int ACTION_EMAIL = 2; public static final int ACTION_EDIT = 3; @@ -167,6 +169,7 @@ private void executeAction() { switch (action) { + case ACTION_OPEN_WITH_ALFRESCO: case ACTION_OPEN: AlfrescoNotificationManager.getInstance(getActivity()).showToast( getActivity().getText(R.string.download_complete) + " " + contentFile.getFileName()); @@ -177,8 +180,16 @@ private void executeAction() { long datetime = contentFile.getFile().lastModified(); detailsFragment.setDownloadDateTime(new Date(datetime)); - ActionUtils.openIn(detailsFragment, contentFile.getFile(), doc.getContentStreamMimeType(), - RequestCode.SAVE_BACK); + if (action == ACTION_OPEN_WITH_ALFRESCO) + { + ActionUtils.openWithAlfrescoTextEditor(detailsFragment, contentFile.getFile(), + doc.getContentStreamMimeType(), RequestCode.SAVE_BACK); + } + else + { + ActionUtils.openIn(detailsFragment, contentFile.getFile(), doc.getContentStreamMimeType(), + RequestCode.SAVE_BACK); + } } break; diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/managers/ActionUtils.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/managers/ActionUtils.java index b0f49b8a..17b66da0 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/managers/ActionUtils.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/managers/ActionUtils.java @@ -26,6 +26,7 @@ import org.alfresco.mobile.android.application.R; import org.alfresco.mobile.android.application.activity.PublicDispatcherActivity; +import org.alfresco.mobile.android.application.editors.text.TextEditorActivity; import org.alfresco.mobile.android.platform.AlfrescoNotificationManager; import org.alfresco.mobile.android.platform.extensions.SamsungManager; import org.alfresco.mobile.android.platform.intent.BaseActionUtils; @@ -83,6 +84,31 @@ public static void actionOpenIn(Fragment fr, File myFile) } } + public static void openWithAlfrescoTextEditor(Fragment fr, File myFile, String mimeType, int requestCode) + { + Intent intent = new Intent(fr.getActivity(), TextEditorActivity.class); + intent.setAction(Intent.ACTION_VIEW); + Uri data = Uri.fromFile(myFile); + intent.setDataAndType(data, mimeType.toLowerCase()); + + try + { + if (fr.getParentFragment() != null) + { + fr.getParentFragment().startActivityForResult(intent, requestCode); + } + else + { + fr.startActivityForResult(intent, requestCode); + } + } + catch (ActivityNotFoundException e) + { + AlfrescoNotificationManager.getInstance(fr.getActivity()).showAlertCrouton(fr.getActivity(), + org.alfresco.mobile.android.foundation.R.string.error_unable_open_file); + } + } + // /////////////////////////////////////////////////////////////////////////// // ACTION VIEW // /////////////////////////////////////////////////////////////////////////// diff --git a/alfresco-mobile-android/src/main/res/values/ids.xml b/alfresco-mobile-android/src/main/res/values/ids.xml index 79b4f8be..6323a3e9 100644 --- a/alfresco-mobile-android/src/main/res/values/ids.xml +++ b/alfresco-mobile-android/src/main/res/values/ids.xml @@ -37,6 +37,7 @@ + diff --git a/alfresco-mobile-android/src/main/res/values/strings.xml b/alfresco-mobile-android/src/main/res/values/strings.xml index 8ed78993..47723603 100644 --- a/alfresco-mobile-android/src/main/res/values/strings.xml +++ b/alfresco-mobile-android/src/main/res/values/strings.xml @@ -905,4 +905,7 @@ This content is not from a supported source of content.

Please select another one.]]>
+ Open in Alfresco Text Editor + + \ No newline at end of file From 1e82456f95efa40386a370c2a1783885a2606dd0 Mon Sep 17 00:00:00 2001 From: jmpascal Date: Tue, 5 Apr 2016 11:21:22 +0200 Subject: [PATCH 07/25] ANDROID-284 --- .../fragments/help/HelpDialogFragment.java | 2 +- .../src/main/res/values-de/strings.xml | 45 +++++---- .../src/main/res/values-es/strings.xml | 21 ++-- .../src/main/res/values-fr/strings.xml | 51 +++++----- .../src/main/res/values-it/strings.xml | 97 +++++++++---------- .../src/main/res/values-ja/strings.xml | 29 +++--- .../src/main/res/values-zh-rCN/strings.xml | 5 +- .../src/main/res/values/strings.xml | 5 +- .../main/res/values-de/samsung_strings.xml | 2 +- .../main/res/values-fr/samsung_strings.xml | 2 +- .../main/res/values-it/samsung_strings.xml | 8 +- .../main/res/values-ja/samsung_strings.xml | 2 +- .../main/res/values-it/scansnap_strings.xml | 33 ++++--- .../main/res/values-de/alfresco_strings.xml | 22 ++--- .../main/res/values-es/alfresco_strings.xml | 32 +++--- .../main/res/values-fr/alfresco_strings.xml | 16 +-- .../main/res/values-it/alfresco_strings.xml | 62 ++++++------ .../main/res/values-ja/alfresco_strings.xml | 10 +- 18 files changed, 220 insertions(+), 224 deletions(-) diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/help/HelpDialogFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/help/HelpDialogFragment.java index b2f7e444..79b22228 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/help/HelpDialogFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/help/HelpDialogFragment.java @@ -208,7 +208,7 @@ public void onStop() // /////////////////////////////////////////////////////////////////////////// private String getUrl(FragmentActivity activity) { - String prefix = activity.getString(R.string.docs_prefix); + String prefix = activity.getString(R.string.asset_folder_prefix); String urlValue = null; if (TextUtils.isEmpty(prefix)) { diff --git a/alfresco-mobile-android/src/main/res/values-de/strings.xml b/alfresco-mobile-android/src/main/res/values-de/strings.xml index 6ce671aa..0abccd17 100644 --- a/alfresco-mobile-android/src/main/res/values-de/strings.xml +++ b/alfresco-mobile-android/src/main/res/values-de/strings.xml @@ -106,7 +106,7 @@ Sites Meine Dateien Freigegebene Dateien - Site-Suche + Site-Finder Alle Sites Meine Sites Favoriten-Sites @@ -165,7 +165,6 @@ de - Version @@ -245,19 +244,19 @@ Beitritt beantragen Abmelden Favorit - Markierung als Favorit aufheben + Aus Favoriten entfernen Sie sind nun Mitglied von \"%s\". Sie haben sich bei \"%s\" abgemeldet. \"%s\" ist jetzt ein Favorit. - Die Markierung von \"%s\" als Favorit wurde aufgehoben. + \"%s\" wurde aus Ihren Favoriten entfernt. Sie haben den Beitritt zu \"%s\" beantragt. Liste ausstehender Anfragen Anfrage, der Site %s beizutreten, verwerfen Ihre Anfrage, \"%s\" beizutreten, wurde verworfen. Aufgrund eines Problems konnten Sie der Site \"%s\" nicht beitreten. Aufgrund eines Problems konnten Sie sich nicht bei der Site \"%s\" abmelden. - Aufgrund eines Problems konnten Sie die Site \"%s\" nicht als Favorit festlegen. - Aufgrund eines Problems konnten Sie die Markierung der Site \"%s\" als Favorit nicht aufheben. + Aufgrund eines Problems konnte die Site \"%s\" nicht zu Ihren Favoriten hinzugefügt werden. + Aufgrund eines Problems konnte die Site \"%s\" nicht aus Ihren Favoriten entfernt werden. Mit Alfresco Mobile hochladen @@ -452,7 +451,7 @@ Synchronisierungswarnung Synchronisierungsfehler Sie sind im Begriff, %s über eine Carrier-Verbindung zu synchronisieren.

Möchten Sie fortfahren?]]>
- Sie versuchen, %1$s zu synchronisieren; nur %2$s sind verfügbar.

Sie müssen Speicherplatz auf Ihrem Gerät freigeben oder für einige Inhalte die Markierung als Favoriten aufheben.]]>
+ Sie versuchen, %1$s zu synchronisieren, es sind jedoch nur %2$s verfügbar.

Sie müssen Speicherplatz auf Ihrem Gerät freigeben oder Inhalte aus Ihren Favoriten entfernen.]]>
Sie sind im Begriff, %1$s zu synchronisieren; nur noch %2$s auf Ihrem Gerät.

Möchten Sie fortfahren?]]>
Das Dokument ist auf Ihrem Gerät nicht verfügbar. @@ -467,7 +466,7 @@ "Gefällt mir"-Vorgang abgeschlossen "Gefällt mir"-Vorgang abgeschlossen Favorit - Markierung als Favorit aufheben + Aus Favoriten entfernen Ausstehend @@ -541,7 +540,7 @@ Zusammenfassung Kontaktinformationen E-Mail - Festnetz + Telefon Handy Skype IM @@ -552,7 +551,7 @@ Name Adresse Postleitzahl - Festnetz + Telefon Fax E-Mail Anruf @@ -606,7 +605,7 @@ Aufgaben anzeigen Validieren - Geringe Priorität + Niedrige Priorität Mittlere Priorität Hohe Priorität hat den Inhalt genehmigt]]> @@ -619,8 +618,8 @@ Antwort Fertig Aufgabe wird abgeschlossen - Erneut zuweisen - Diese Aufgabe erneut zuweisen an… + Neu zuweisen + Diese Aufgabe neu zuweisen an… Anspruch An Pool freigeben Priorität @@ -631,7 +630,7 @@ Aktive Aufgaben - Von mir gestartete Aufgaben + Von mir begonnene Aufgaben Abgeschlossene Aufgaben Aufgaben mit hoher Priorität Heute fällige Aufgaben @@ -655,7 +654,7 @@ {0,choice,0#Keine zugewiesenen Personen|1#1 zugewiesene Person|1<{0} zugewiesene Personen} Zugewiesene Personen Zugewiesene Personen auswählen… - {0,choice,0#Keine genehmigende Personen|1#1 von 1 genehmigende Person|1<%s von {0} genehmigenden Personen} + {0,choice,0#Keine Genehmiger|1#1 von 1 Genehmiger|1<%s von {0} Genehmigern} {0,choice,0#Keine Anhänge|1#1 Anhang|1<{0} Anhänge} Anhänge auswählen… Anhänge @@ -665,16 +664,16 @@ Keinen Inhalt angehängt Priorität E-Mail-Benachrichtigung - Genehmigende Personen - Keine genehmigenden Personen + Genehmiger + Keine Genehmiger Prozess wird gestartet Aufgabe erstellen Zu erledigende Aufgaben Einer Person eine Aufgabe zuweisen Überprüfen und genehmigen Weisen Sie einer oder mehreren Personen eine Aufgabe zu, um Inhalt zu überprüfen und zu genehmigen. - Erneute Zuweisung wird durchgeführt… - Erneute Zuweisung abgeschlossen + Neuzuweisung wird durchgeführt… + Neuzuweisung abgeschlossen Zugewiesene Personen auswählen Fälligkeitsdatum auswählen Anhänge auswählen @@ -684,9 +683,9 @@ Ad-hoc-Workflow - Gleichzeitige Überprüfung und Genehmigung + Paralleles Überprüfen und Genehmigen Überprüfen und genehmigen - Zusammengefasste Überprüfung und Genehmigung + Gebündeltes Überprüfen und Genehmigen Suche @@ -811,7 +810,7 @@ Keine Favoriten gefunden Sie können Dateien und Ordner zu Ihren Favoriten hinzufügen, um schneller darauf zugreifen zu können. Sie haben noch keine Sites hinzugefügt - Über die Site-Suche können Sie nach Sites suchen und sie hinzufügen. + Über Site-Finder können Sie nach Sites suchen und sie hinzufügen. Keine Favoriten gefunden Sie können Sites zu Ihren Favoriten hinzufügen, um schneller darauf zugreifen zu können. Keine Sites gefunden @@ -827,7 +826,7 @@ Keine Sites verfügbar - Keine Versionshistorie verfügbar + Kein Versionsverlauf verfügbar Keine Sitzung verfügbar Keine Aktivitäten gefunden Kein Tag gefunden diff --git a/alfresco-mobile-android/src/main/res/values-es/strings.xml b/alfresco-mobile-android/src/main/res/values-es/strings.xml index ddd0e816..07d7a562 100644 --- a/alfresco-mobile-android/src/main/res/values-es/strings.xml +++ b/alfresco-mobile-android/src/main/res/values-es/strings.xml @@ -165,7 +165,6 @@ es - Versión @@ -344,7 +343,7 @@ Su administrador de Alfresco ha deshabilitado esta función. Comentarios Enviar diagnósticos - Para ayudarnos a mejorar Alfresco Mobile, recopilamos datos de diagnósticos técnicos anónimos. Puede desactivar esta opción si lo prefiere. + Para ayudarnos a mejorar Alfresco Mobile, recogemos datos de diagnóstico técnicos de forma anónima. Puede desactivar esta opción si lo prefiere. Enviar comentarios @@ -576,8 +575,8 @@ Perfil de %s - Sin tareas - Sin adjuntos + Ninguna tarea + Ningún adjunto Adjunto(s) Crear tarea Respuesta @@ -593,7 +592,7 @@ Mañana Próximos 7 días Vencido - Sin fecha + Ninguna fecha Prioridad Baja Media @@ -606,9 +605,9 @@ Ver tareas Validar - Prioridad baja + Baja prioridad Prioridad media - Prioridad alta + Alta prioridad aprobó el contenido]]> rechazó el contenido]]> y comentó: @@ -633,7 +632,7 @@ Tareas activas Tareas que he iniciado Tareas completadas - Tareas de prioridad alta + Tareas de alta prioridad Tareas que vencen hoy Tareas vencidas Tareas que se me han asignado @@ -683,14 +682,14 @@ - Flujo de trabajo adhoc - Revisión y aprobación paralelas + Flujo de trabajo ad hoc + Revisión y aprobación en paralelo Revisión y aprobación Revisión y aprobación en grupo Buscar - Gente + Personas Ficheros Carpetas Sitio diff --git a/alfresco-mobile-android/src/main/res/values-fr/strings.xml b/alfresco-mobile-android/src/main/res/values-fr/strings.xml index 7d213159..acab1730 100644 --- a/alfresco-mobile-android/src/main/res/values-fr/strings.xml +++ b/alfresco-mobile-android/src/main/res/values-fr/strings.xml @@ -165,7 +165,6 @@ fr - Version @@ -243,11 +242,11 @@ Aucun site trouvé Rejoindre Demander à rejoindre - Quitter + Se désabonner Favori - Retirer des favoris + Supprimer des favoris Vous êtes maintenant membre de \"%s\". - Vous avez quitté \"%s\". + Vous vous êtes désabonné de \"%s\". \"%s\" fait maintenant partie des favoris. \"%s\" ne figure plus dans les favoris. Vous avez demandé à rejoindre \"%s\" @@ -255,13 +254,13 @@ Annuler votre demande à rejoindre le site \"%s\" Votre demande à rejoindre \"%s\" a été annulée. Un problème vous a empêché de rejoindre le site \"%s\". - Un problème vous a empêché de quitter le site \"%s\". + Un problème vous a empêché de vous désabonner du site \"%s\". Un problème vous a empêché d\'inclure le site \"%s\" dans les favoris. Un problème vous a empêché de supprimer le site \"%s\" de vos favoris. Ajouter avec Alfresco Mobile - Nom du fichier + Nom de fichier Fichier Compte Dossier Ajout @@ -467,7 +466,7 @@ J\'aime effectué J\'aime terminé Favori - Retirer des favoris + Supprimer des favoris En attente @@ -522,7 +521,7 @@ Le fichier a été modifié. Toutes vos modifications non enregistrées seront perdues.]]> Enregistrer - Ignorer + Annuler Le fichier a été enregistré. Encodage Taille du texte @@ -539,7 +538,7 @@ Intitulé du poste Emplacement Récapitulatif - Informations du contact + Informations de contact E-mail Téléphone Mobile @@ -555,7 +554,7 @@ Téléphone Fax E-mail - Appeler + Appel Skype Démarrer un chat Démarrer un appel @@ -597,8 +596,8 @@ Priorité Basse Moyenne - Élevée - Acteur + Elevée + Personne assignée Moi Tout Non assignée @@ -622,7 +621,7 @@ Réassigner Réassigner cette tâche à… Récupérer - Remettre dans le pot commun + Replacer dans le pot commun Priorité Type de tâche Initiateur de la tâche @@ -631,7 +630,7 @@ Tâches actives - Tâches que j\'ai démarrées + Tâches que j\'ai initiées Tâches terminées Tâches de priorité élevée Tâches pour aujourd\'hui @@ -641,22 +640,22 @@ Envoyer pour révision - Choisir un type de tâche + Choisir le type de tâche Créer une tâche - Choisir les éléments attachés - Démarrer la tâche + Sélectionner les pièces jointes + Démarrer le processus Titre Nouveau titre de tâche (requis) - À échéance le - Acteurs + A échéance le + Personnes assignées Diagramme du processus Veuillez réviser %s Veuillez réviser ce contenu - {0,choice,0#Aucun acteur|1#1 acteur|1<{0} acteurs} - Acteurs - Sélectionner les acteurs… + {0,choice,0#Aucune personne assignée|1#1 personne assignée|1<{0} personnes assignées} + Personnes assignées + Sélectionner les personnes assignées… {0,choice,0#Aucun approbateur|1#1 sur 1 approbateur|1<%s sur {0} approbateurs} - {0,choice,0#Aucun pièce jointe|1#1 pièce jointe|1<{0} pièces jointes} + {0,choice,0#Aucune pièce jointe|1#1 pièce jointe|1<{0} pièces jointes} Sélectionner les pièces jointes… Pièces jointes (aucun message) @@ -675,7 +674,7 @@ Assigner une tâche à une ou plusieurs personnes pour revoir et approuver les contenus. Réaffectation en cours… Réaffectation terminée - Sélectionner les acteurs + Sélectionner les personnes assignées Sélectionner une date d\'échéance Sélectionner les pièces jointes Supprimer un approbateur @@ -780,7 +779,7 @@ Chargement de la configuration en cours... Connexion La configuration de votre application semble incorrecte.
Si le problème persiste, contactez votre administrateur.


Erreur : %s]]>
- Ignorer + Annuler Nom de fichier non valide Mes tâches Veuillez patienter @@ -827,7 +826,7 @@ Aucun site disponible - Aucun historique de version disponible + Aucun historique des versions disponible Aucune session disponible Aucune activité trouvée Aucun tag trouvé diff --git a/alfresco-mobile-android/src/main/res/values-it/strings.xml b/alfresco-mobile-android/src/main/res/values-it/strings.xml index 864e8f80..0ab88763 100644 --- a/alfresco-mobile-android/src/main/res/values-it/strings.xml +++ b/alfresco-mobile-android/src/main/res/values-it/strings.xml @@ -114,7 +114,7 @@ Cerca Download File locali - Informazioni su + Informazioni Impostazioni Account Viste @@ -157,15 +157,14 @@ Formato file non supportato. È necessario installare un\'applicazione in grado di leggere il formato. - Non mi piace più - Impossibile recuperare il tag Mi piace/Non mi piace più per questo contenuto. + Non mi piace + Impossibile recuperare il tag Mi piace/Non mi piace per questo contenuto. Continua Salva Condividi contenuto con… it - Versione @@ -173,9 +172,9 @@ SDK: Alfresco Mobile si connette ad Alfresco in the Cloud e on premise (v3.4 e successive) per garantire un accesso sicuro ai contenuti aziendali sempre e ovunque.

+

Alfresco Mobile si connette ad Alfresco in the Cloud e on premise (v. 3.4 e successive) per garantire un accesso sicuro ai contenuti aziendali sempre e ovunque.

-

Alfresco Mobile si connette al repository Alfresco con le credenziali di accesso ad Alfresco (su HTTP o HTTPS) e gestisce l\'accesso degli utenti in base ai permessi utente.

+

Alfresco Mobile si connette al repository Alfresco tramite le credenziali di accesso di Alfresco (su HTTP o HTTPS) e gestisce gli accessi in base ai permessi degli utenti.

]]>
@@ -209,14 +208,14 @@ Apri Google Play Store Crea… Crea… - Immetti qui il nome del file + Digita qui il nome del file Nome già utilizzato. Completa azione con Nessuna applicazione disponibile - Non si dispone di un\'applicazione per creare questo tipo di file. + Non hai un\'applicazione per creare questo tipo di file. Anteprima non disponibile. La scheda SD deve essere accessibile per l\'operazione - Accedere prima all\'account Alfresco + Accedi prima all\'account Alfresco Aggiungi qui un commento… @@ -235,28 +234,28 @@ Apri come… Immagine - File audio - File video + Audio + Video Documento di testo Nessun sito trovato Partecipa - Richiedi partecipazione + Posso partecipare? Abbandona Preferito Rimuovi dai preferiti Ora sei membro di \"%s\". Hai abbandonato \"%s\". - \"%s\" è ora un preferito. + \"%s\" è stato aggiunto ai preferiti. \"%s\" è stato rimosso dai preferiti. - Hai richiesto la partecipazione a \"%s\" + Hai richiesto di partecipare a \"%s\" Elenco di richieste in sospeso - Annulla la richiesta di partecipazione al sito %s - La richiesta di partecipazione a \"%s\" è stata annullata. + Annulla la richiesta di partecipare al sito %s + La richiesta di partecipare a \"%s\" è stata annullata. Impossibile partecipare al sito \"%s\" a causa di un problema. Impossibile abbandonare il sito \"%s\" a causa di un problema. - Impossibile inserire il sito \"%s\" tra i preferiti a causa di un problema. + Impossibile aggiungere il sito \"%s\" ai preferiti a causa di un problema. Impossibile rimuovere il sito \"%s\" dai preferiti a causa di un problema. @@ -285,9 +284,9 @@ Scadenza {0,choice,0#Dopo 0 minuti|1#Dopo 1 minuto|1<Dopo {0} minuti} Cancella dati - Cancella tutti i dati di Alfresco Mobile da questo dispositivo dopo 10 tentativi non riusciti di immissione del passcode. + Cancella tutti i dati di Alfresco Mobile dal dispositivo dopo 10 tentativi non riusciti di immissione del passcode. Immetti nuovo passcode - Immetti nuovamente il passcode + Immetti di nuovo il passcode I passcode non corrispondono. Passcode errato. Tutti i dati locali sono stati cancellati. @@ -319,7 +318,7 @@ Impostazioni Impostazioni Enterprise - La protezione dati rende l\'intero contenuto scaricato leggibile solo dall\'applicazione Alfresco. (solo clienti Enterprise) + La protezione dati rende l\'intero contenuto scaricato leggibile solo dall\'applicazione Alfresco (solo Enterprise) Protezione dati Link Alfresco @@ -344,7 +343,7 @@ Funzione disabilitata dall\'amministratore Alfresco. Commenti Invia diagnostica - Al fine di migliorare Alfresco Mobile, vengono raccolti dati tecnici anonimi relativi alla diagnostica. Disattiva l\'opzione, se lo preferisci. + Al fine di migliorare Alfresco Mobile, raccogliamo dati tecnici di diagnostica in modo anonimo. L\'opzione può essere disattivata. Invia commenti @@ -377,9 +376,9 @@ Disattiva sincronizzazione Disattivare la sincronizzazione?

Tutti i contenuti sincronizzati saranno rimossi dal dispositivo.]]>
Errori di sincronizzazione - Il contenuto è stato desincronizzato%s perché modificato.
Sincronizzare la versione modificata con il server o salvarla nella cartella \"Download\".

]]>
+ Il contenuto è stato desincronizzato%s perché modificato.
Sincronizza la versione modificata con il server o salvala nella cartella \"Download\".

]]>
%s è stato cancellato dal server, ma una copia è stata salvata nella cartella \"Download\".

]]>
- Non si dispone dei permessi necessari per caricare la versione modificata di %s. È possibile salvarla nella cartella \"Download\", oppure sovrascriverla con la versione presente sul server, che annullerà le modifiche.]]> + Non hai i permessi necessari per caricare la versione modificata di %s. Puoi salvarla nella cartella \"Download\" o sovrascriverla con la versione presente sul server, che annullerà le modifiche.]]> Errori di sincronizzazione Sincronizza Sovrascrivi @@ -396,20 +395,20 @@ Desincronizza Preferiti Mantieni file sincronizzati - Sarà possibile visualizzare e modificare i file sincronizzati anche offline. + Per visualizzare e modificare i file sincronizzati anche offline. La sincronizzazione è stata migliorata! - È ora possibile sincronizzare diversi file su diversi dispositivi. È sufficiente trovare un file e sincronizzarlo! - È possibile visualizzare e modificare i file sincronizzati anche offline. Quando si è di nuovo online, i file verranno sincronizzati automaticamente con Alfresco. - E per i file già contrassegnati come preferiti? + Ora puoi sincronizzare diversi file su diversi dispositivi. È sufficiente trovare un file e sincronizzarlo! + Puoi visualizzare e modificare i file sincronizzati anche offline. Quando sei di nuovo online, i file verranno sincronizzati automaticamente con Alfresco. + E per i file già aggiunti ai preferiti? Nessun problema, tutti i file continuano a essere sincronizzati! - Se d\'ora in poi si contrassegnano file come preferiti, verranno inseriti nella scheda Preferiti, ma sarà necessario sincronizzarli per aprirli offline. + Se d\'ora in poi aggiungi dei file ai preferiti, verranno inseriti nella scheda Preferiti, ma dovrai sincronizzarli per aprirli offline. Dove si trovano i file sincronizzati? Tutti i file sincronizzati si trovano nella nuova vista Contenuti sincronizzati. Contenuti sincronizzati OK, chiaro. Maggiori informazioni - Salta + Ignora Continua @@ -451,9 +450,9 @@ Avviso di sincronizzazione Errore di sincronizzazione - Si sta per eseguire la sincronizzazione di %s su una connessione portante.

Continuare?]]>
- Si sta tentando di sincronizzare %1$s, ma sono disponibili solo %2$s.

Liberare un po\' di spazio sul dispositivo o rimuovere alcuni contenuti dai preferiti.]]>
- Si sta per eseguire la sincronizzazione di %1$s, ma sul dispositivo rimane soltanto %2$s.

Continuare?]]>
+ Stai per sincronizzare %s su una connessione portante.

Continuare?]]>
+ Stai tentando di sincronizzare %1$s, ma sono disponibili solo %2$s.

Libera spazio sul dispositivo o rimuovi alcuni contenuti dai preferiti.]]>
+ Stai per sincronizzare %1$s, ma sul dispositivo rimangono solo %2$s.

Continuare?]]>
Questo documento non è disponibile sul dispositivo. @@ -539,7 +538,7 @@ Professione Luogo Riepilogo - Informazioni di contatto + Contatti E-mail Telefono Cellulare @@ -555,7 +554,7 @@ Telefono Fax E-mail - Chiama + Chiamata Skype Avvia chat Avvia telefonata @@ -647,7 +646,7 @@ Avvia processo Titolo Titolo del nuovo compito (obbligatorio) - Scade il + Scadenza Assegnatari Diagramma del processo Esaminare %s @@ -670,7 +669,7 @@ Avvio del processo Crea compito Da fare - Assegna compito a una persona + Assegna un compito a una persona Esamina e approva Assegna un compito a una o più persone per l\'esame e l\'approvazione di contenuti. Riassegnazione in corso… @@ -684,9 +683,9 @@ Workflow ad hoc - Esame e approvazione in parallelo - Esame e approvazione - Esame e approvazione in pool + Esamina e approva in parallelo + Esamina e approva + Esamina e approva in pool Cerca @@ -726,7 +725,7 @@ Video Musica Testo - Compilare almeno un campo + Compila almeno un campo Seleziona una persona Seleziona una data da Seleziona una data a @@ -779,13 +778,13 @@ Gestito dall\'amministratore Caricamento configurazione... Accedi - La configurazione dell\'applicazione è errata.
Se il problema persiste, contattare l\'amministratore.


Errore: %s]]>
+ La configurazione dell\'applicazione è errata.
Se il problema persiste, contatta l\'amministratore.


Errore: %s]]>
Elimina Nome file non valido I miei compiti Attendere Alfresco - Impossibile accedere alla sezione Aiuto di Alfresco Mobile perché si è offline.

Riprovare quando si è di nuovo online.]]>
+ Impossibile accedere alla sezione Aiuto di Alfresco Mobile perché sei offline.

Riprova quando sei di nuovo online.]]>
Questa funzione non è supportata o è stata disabilitata sul dispositivo. @@ -809,17 +808,17 @@ @string/nodebrowser_empty_ro_title Utilizza + per aggiungere file alla cartella. Nessun preferito trovato - È possibile inserire file e cartelle tra i preferiti per accedervi rapidamente. + È possibile aggiungere file e cartelle ai preferiti per accedervi rapidamente. Non hai ancora aderito a nessun sito - Apri Ricerca sito per trovare nuovi siti a cui è possibile aderire. + Apri Ricerca sito per trovare nuovi siti a cui puoi partecipare. Nessun preferito trovato - È possibile inserire i siti tra i preferiti per accedervi rapidamente. + È possibile aggiungere siti ai preferiti per accedervi rapidamente. Nessun sito trovato Prova a utilizzare un termine di ricerca diverso. In questo momento non hai alcun compito Crea un compito da assegnare a te stesso o a qualcun altro. Non ci sono attività da mostrare - È possibile aderire a nuovi siti Alfresco per consultare le attività dei colleghi. + È possibile aderire a nuovi siti Alfresco per visualizzare le attività dei colleghi. Nessun risultato trovato Prova a utilizzare un termine di ricerca diverso. Nessun utente trovato @@ -827,7 +826,7 @@ Nessun sito disponibile - Nessuna cronologia delle versioni disponibile + Nessuna cronologia versioni disponibile Nessuna sessione disponibile Nessuna attività trovata Nessun tag trovato @@ -902,9 +901,9 @@ Trasformazione non supportata Questo tipo di campo di input non è supportato sul dispositivo mobile Modulo non supportato - Questo modulo contiene uno o più campi obbligatori che non sono attualmente supportati sui dispositivi mobili.

Utilizzare l\'app web per questa operazione.]]>
+ Questo modulo contiene uno o più campi obbligatori che non sono attualmente supportati sui dispositivi mobili.

Utilizza l\'app web per questa operazione.]]>
Link non supportato - Questi contenuti non provengono da una fonte supportata.

Selezionare altri contenuti.]]>
+ Questi contenuti non provengono da una fonte supportata.

Seleziona altri contenuti.]]>
diff --git a/alfresco-mobile-android/src/main/res/values-ja/strings.xml b/alfresco-mobile-android/src/main/res/values-ja/strings.xml index 3da8c961..01b491be 100644 --- a/alfresco-mobile-android/src/main/res/values-ja/strings.xml +++ b/alfresco-mobile-android/src/main/res/values-ja/strings.xml @@ -157,15 +157,14 @@ このファイル形式は使用できません。 このファイルを読み取ることができるアプリをインストールしてください。 - [いいね !] の取り消し - このコンテンツの[いいね!]/[いいね!の取り消し] タグを取得できませんでした。 + [いいね!] の削除 + このコンテンツの[いいね!]/[[いいね!] の削除] タグを取得できませんでした。 次へ 保存 コンテンツの共有… ja - バージョン @@ -173,7 +172,7 @@ SDK: Alfresco Mobile は Alfresco in the Cloud とオンプレミスの Alfresco サーバー (3.4 以上) に接続して、外出先からでも社内のコンテンツに安全にアクセスできるようにします。

+

Alfresco Mobile は Alfresco in the Cloud とオンプレミスの Alfresco サーバー (3.4 以上) に接続して、社内のコンテンツに外出先から安全にアクセスできるようにします。

Alfresco Mobile は、Alfresco のログイン資格情報を使用して (HTTP または HTTPS 経由で) Alfresco のリポジトリに接続し、権限に基づいてユーザーのアクセスを管理します。

]]> @@ -242,7 +241,7 @@ サイトが見つかりません 参加 - 参加のリクエスト + 参加リクエストの送信 退会 お気に入り お気に入りの解除 @@ -542,7 +541,7 @@ 連絡先 E メール 電話 - 携帯 + 携帯電話 Skype IM インスタントメッセージング @@ -555,7 +554,7 @@ 電話 ファックス E メール - 通話 + 電話 Skype チャットの開始 通話の開始 @@ -641,8 +640,8 @@ レビューの開始 - タスクのタイプを選択 - タスクを作成 + タスクの種類の選択 + タスクの作成 添付ファイルの選択 プロセスの開始 タイトル @@ -668,8 +667,8 @@ 承認者 承認者なし プロセスの開始 - タスクを作成 - 作業リスト + タスクの作成 + タスクの割り当て タスクを担当者に割り当てます レビューと承認 タスクをコンテンツのレビューと承認を行う担当者に割り当てます。 @@ -684,9 +683,9 @@ アドホックワークフロー - 並列のレビューと承認 (Activiti) + 並列のレビューと承認 レビューと承認 - プールされたレビューと承認 (Activiti) + プールされたレビューと承認 検索 @@ -772,8 +771,8 @@ ショートカットの作成... アクションの定義... 関連付けられているアクション - 写真を撮影する - テキストを書く + 写真の撮影 + テキストの入力 音声入力 管理者によって管理されています diff --git a/alfresco-mobile-android/src/main/res/values-zh-rCN/strings.xml b/alfresco-mobile-android/src/main/res/values-zh-rCN/strings.xml index 07aa836a..e01a1dd5 100644 --- a/alfresco-mobile-android/src/main/res/values-zh-rCN/strings.xml +++ b/alfresco-mobile-android/src/main/res/values-zh-rCN/strings.xml @@ -164,8 +164,7 @@ 与…共享内容 - zh_cn - + 版本 @@ -542,7 +541,7 @@ 联系信息 电子邮件 电话 - 移动电话 + 手机 Skype IM 即时消息 diff --git a/alfresco-mobile-android/src/main/res/values/strings.xml b/alfresco-mobile-android/src/main/res/values/strings.xml index 47723603..b83d5448 100644 --- a/alfresco-mobile-android/src/main/res/values/strings.xml +++ b/alfresco-mobile-android/src/main/res/values/strings.xml @@ -164,8 +164,7 @@ Share Content with… - en - + Version @@ -464,6 +463,8 @@ View Properties Edit Properties "Like" in progress + Like completed + Like complete Favorite Unfavorite diff --git a/extensions/samsung/src/main/res/values-de/samsung_strings.xml b/extensions/samsung/src/main/res/values-de/samsung_strings.xml index 077ea6f8..e65e43cc 100644 --- a/extensions/samsung/src/main/res/values-de/samsung_strings.xml +++ b/extensions/samsung/src/main/res/values-de/samsung_strings.xml @@ -22,7 +22,7 @@ Abbrechen Suche Suchbegriff eingeben - Kommentar hier eingeben... + Kommentar hier eingeben… Hinzufügen diff --git a/extensions/samsung/src/main/res/values-fr/samsung_strings.xml b/extensions/samsung/src/main/res/values-fr/samsung_strings.xml index d1fca91c..b1a254c9 100644 --- a/extensions/samsung/src/main/res/values-fr/samsung_strings.xml +++ b/extensions/samsung/src/main/res/values-fr/samsung_strings.xml @@ -72,7 +72,7 @@ Le S Note a été modifié. Toutes vos modifications non enregistrées seront perdues.]]> Enregistrer - Ignorer + Annuler S Note a été enregistré. Page %1$s/%2$s diff --git a/extensions/samsung/src/main/res/values-it/samsung_strings.xml b/extensions/samsung/src/main/res/values-it/samsung_strings.xml index 4b2a83f2..775a9625 100644 --- a/extensions/samsung/src/main/res/values-it/samsung_strings.xml +++ b/extensions/samsung/src/main/res/values-it/samsung_strings.xml @@ -22,7 +22,7 @@ Annulla Cerca Immetti termine da cercare - Immetti qui un commento... + Digita qui il commento… Aggiungi @@ -82,8 +82,8 @@ Requisiti S Note Questo dispositivo non supporta l\'S Pen - Per utilizzare questa funzione, installare il software aggiuntivo dell\'S Pen.
La schermata di installazione verrà aperta.

Dopo l\'installazione del software, riavviare l\'applicazione.]]>
- Per utilizzare questa funzione, aggiornare il software dell\'S Pen.
La schermata di installazione verrà aperta.

Dopo l\'installazione del software, riavviare l\'applicazione.]]>
- Prima di utilizzare questa funzione, si consiglia di aggiornare il software dell\'S Pen.
La schermata di installazione verrà aperta.

Dopo l\'installazione del software, riavviare l\'applicazione.]]>
+ È necessario installare il software aggiuntivo dell\'S Pen per utilizzare questa funzione.
Verrà aperta la schermata di installazione.

Dopo l\'installazione, riavvia l\'applicazione.]]>
+ È necessario aggiornare il software dell\'S Pen per utilizzare questa funzione.
Verrà aperta la schermata di installazione.

Dopo l\'installazione, riavvia l\'applicazione.]]>
+ Si consiglia di aggiornare il software dell\'S Pen prima di utilizzare questa funzione.
Verrà aperta la schermata di installazione.

Dopo l\'installazione, riavvia l\'applicazione.]]>
\ No newline at end of file diff --git a/extensions/samsung/src/main/res/values-ja/samsung_strings.xml b/extensions/samsung/src/main/res/values-ja/samsung_strings.xml index 40a1bcca..8392e49c 100644 --- a/extensions/samsung/src/main/res/values-ja/samsung_strings.xml +++ b/extensions/samsung/src/main/res/values-ja/samsung_strings.xml @@ -22,7 +22,7 @@ キャンセル 検索 検索キーワードを入力してください - ここにコメントを入力してください... + ここにコメントを入力してください… 追加 diff --git a/extensions/scansnap/src/main/res/values-it/scansnap_strings.xml b/extensions/scansnap/src/main/res/values-it/scansnap_strings.xml index d9010057..bbb8315e 100644 --- a/extensions/scansnap/src/main/res/values-it/scansnap_strings.xml +++ b/extensions/scansnap/src/main/res/values-it/scansnap_strings.xml @@ -1,26 +1,27 @@ + ~ Copyright (C) 2005-2016 Alfresco Software Limited. + ~ + ~ This file is part of Alfresco Mobile for Android. + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> Impossibile avviare l\'applicazione ScanSnap Connect. - Impossibile analizzare l\'URL. Verificare che i parametri dell\'URL specificato siano corretti, quindi riprovare. + Impossibile analizzare l\'URL. Verifica che i parametri dell\'URL specificato siano corretti e riprova. Impostazioni predefinite scansione diff --git a/platform/foundation/src/main/res/values-de/alfresco_strings.xml b/platform/foundation/src/main/res/values-de/alfresco_strings.xml index 0391e3cb..663a8404 100644 --- a/platform/foundation/src/main/res/values-de/alfresco_strings.xml +++ b/platform/foundation/src/main/res/values-de/alfresco_strings.xml @@ -95,12 +95,12 @@ {0} Wiki-Seite aktualisiert von {1} {2} Wiki-Seite umbenannt in {0} von {1} {0} Wiki-Seite gelöscht von {1} - {1} Gruppe zur Site {4} mit Rolle {2} hinzugefügt - {1} Gruppe von Site {4} entfernt - {1} Rolle der Gruppe in {2} geändert + Gruppe {1} zur Site {4} mit Rolle {2} hinzugefügt + Gruppe {1} von Site {4} entfernt + Rolle der Gruppe von {1} zu {2} geändert {1} trat der Site {4} mit der Rolle {2} bei {1} hat Site {4} verlassen - {1} Rolle geändert in {2} + Rolle von {1} zu {2} geändert {0} Link erstellt von {1} {0} Link aktualisiert von {1} {0} Link gelöscht von {1} @@ -110,7 +110,7 @@ {1} folgt jetzt {5} {1} hat {2} abonniert {1}: {6} - {1} hat Dokument {0} zur Vorschau angezeigt + {1} hat eine Vorschau auf Dokument {0} angezeigt {1} hat Dokument {0} heruntergeladen Keine Berechtigungen Verbraucher @@ -208,7 +208,7 @@ Keine Benutzer gefunden Keine Dateien gefunden Keine Sites verfügbar - Keine Versionshistorie verfügbar + Kein Versionsverlauf verfügbar Keine Sitzung verfügbar Keine Aktivitäten gefunden Kein Tag gefunden @@ -234,7 +234,7 @@ Foto aufnehmen Video aufnehmen Audio aufnehmen - Versionshistorie + Versionsverlauf Tags Freigeben Aktualisieren @@ -318,8 +318,8 @@ Keine Aufgaben Nicht zugewiesen - Erneute Zuweisung wird durchgeführt… - Erneute Zuweisung abgeschlossen + Neuzuweisung wird durchgeführt… + Neuzuweisung abgeschlossen \"%s\" wurde erfolgreich aktualisiert. @@ -391,7 +391,7 @@ Synchronisierung deaktivieren Möchten Sie die Synchronisierung deaktivieren?

Alle synchronisierten Inhalte werden von Ihrem Gerät gelöscht.]]>
Synchronisierungsfehler - Sie haben die Auswahl von %s als Favorit aufgehoben, da Sie begonnen haben, dieses Element zu bearbeiten.
Synchronisieren Sie Ihre bearbeitete Version auf dem Server oder speichern Sie diese im Ordner \"Downloads\".

]]>
+ Sie haben %s aus Ihren Favoriten entfernt, seit Sie begonnen haben, dieses Element zu bearbeiten.
Synchronisieren Sie Ihre bearbeitete Version auf dem Server oder speichern Sie sie im Ordner \"Downloads\".

]]>
%s wurde auf dem Server gelöscht, jedoch wurde eine Kopie im Ordner \"Downloads\" gespeichert.

]]>
Sie besitzen nicht die erforderliche Berechtigung, um Ihre bearbeitete Version von %s hochzuladen. Sie können diese in Ihrem Ordner \"Downloads\" speichern oder mit der Serverversion überschreiben. Dadurch werden Ihre Bearbeitungen verworfen.]]> Synchronisierungsfehler @@ -444,7 +444,7 @@ Synchronisierungswarnung Synchronisierungsfehler Sie sind im Begriff, %s über eine Carrier-Verbindung zu synchronisieren.

Möchten Sie fortfahren?]]>
- Sie versuchen, %1$s zu synchronisieren; nur %2$s sind verfügbar.

Sie müssen Speicherplatz auf Ihrem Gerät freigeben oder für einige Inhalte die Markierung als Favoriten aufheben.]]>
+ Sie versuchen, %1$s zu synchronisieren, es sind jedoch nur %2$s verfügbar.

Sie müssen Speicherplatz auf Ihrem Gerät freigeben oder Inhalte aus Ihren Favoriten entfernen.]]>
Sie sind im Begriff, %1$s zu synchronisieren; nur noch %2$s auf Ihrem Gerät.

Möchten Sie fortfahren?]]>
Das Dokument ist auf Ihrem Gerät nicht verfügbar. diff --git a/platform/foundation/src/main/res/values-es/alfresco_strings.xml b/platform/foundation/src/main/res/values-es/alfresco_strings.xml index 50a04d68..71d66069 100644 --- a/platform/foundation/src/main/res/values-es/alfresco_strings.xml +++ b/platform/foundation/src/main/res/values-es/alfresco_strings.xml @@ -22,7 +22,7 @@ - hace un momento + en este momento hace menos de un minuto @@ -54,7 +54,7 @@ Cargar más… Carga en curso… - Sin datos. + Ningún dato. Aceptar Cancelar @@ -64,14 +64,14 @@ Entrada {0} del blog creada por {1} Entrada {0} del blog actualizada por {1} Entrada {0} del blog eliminada por {1} - {1} ha comentado sobre {0} - {1} ha actualizado el comentario sobre {0} - {1} ha eliminado el comentario de {0} + {1} comentó sobre {0} + {1} actualizó el comentario sobre {0} + {1} eliminó el comentario sobre {0} {0} foro iniciado por {1} {0} foro actualizado por {1} {0} foro eliminado por {1} - {1} ha respondido al foro {0} - {1} ha actualizado una respuesta a {0} + {1} respondió al foro {0} + {1} actualizó la respuesta a {0} Evento {0} del calendario creado por {1} Evento {0} del calendario actualizado por {1} Evento {0} del calendario eliminado por {1} @@ -86,8 +86,8 @@ {0} carpetas añadidas por {1} {0} fue eliminado por {1} {0} carpetas eliminadas por {1} - Fichero {0} descargado de Google Docs por {1} - Fichero {0} cargado a Google Docs por {1} + Fichero {0} bloqueado en Google Docs por {1} + Fichero {0} desbloqueado de Google Docs por {1} Fichero {0} editado por {1} A {1} le gusta el fichero {0} A {1} le gusta la carpeta {0} @@ -99,7 +99,7 @@ Grupo {1} eliminado del sitio {4} Rol del grupo {1} cambiado a {2} {1} se unió al sitio {4} con el rol {2} - {1} dejó el sitio {4} + {1} abandonó el sitio {4} Rol {1} cambiado a {2} Enlace {0} creado por {1} Enlace {0} actualizado por {1} @@ -107,11 +107,11 @@ Lista de datos {0} creada por {1} Detalles de la lista de datos {0} actualizados por {1} Lista de datos {0} eliminada por {1} - {1} ahora es seguidor de {5} + {1} está siguiendo a {5} {1} se ha suscrito a {2} {1}: {6} - {1} documento previsualizado {0} - {1} documento descargado {0} + {1} previsualizó el documento {0} + {1} descargó el documento {0} Ningún privilegio Consumidor Administrador @@ -167,7 +167,7 @@ Ingeniero Género Número de pista - Fecha de lanzamiento + Fecha de publicación Frecuencia de muestreo Tipo de muestreo Tipo de canal @@ -250,7 +250,7 @@ No se puede abrir el mapa - Intentar de nuevo + Reintentar Guardar cuenta Error de conexión No se puede autenticar. Compruebe la configuración de su cuenta de Alfresco. @@ -316,7 +316,7 @@ Crear carpeta completado - Sin tareas + Ninguna tarea No asignado Reasignación en curso… Reasignación completada diff --git a/platform/foundation/src/main/res/values-fr/alfresco_strings.xml b/platform/foundation/src/main/res/values-fr/alfresco_strings.xml index f0654235..0038a2a4 100644 --- a/platform/foundation/src/main/res/values-fr/alfresco_strings.xml +++ b/platform/foundation/src/main/res/values-fr/alfresco_strings.xml @@ -22,7 +22,7 @@ - à l\'instant + maintenant il y a moins d\'une minute @@ -64,8 +64,8 @@ Article de blog {0} créé par {1} Article de blog {0} mis à jour par {1} Article de blog {0} supprimé par {1} - {1} commenté {0} - {1} a mis à jour le commentaire sur {0} + {1} a commenté {0} + {1} a mis à jour son commentaire sur {0} {1} a supprimé un commentaire de {0} Discussion {0} démarrée par {1} Discussion {0} mise à jour par {1} @@ -97,10 +97,10 @@ Page wiki {0} supprimée par {1} Groupe {1} ajouté au site {4} avec le rôle {2} Groupe {1} supprimé du site {4} - Rôle du groupe {1} modifié pour {2} + Rôle du groupe {1} changé en {2} {1} a rejoint le site {4} avec le rôle {2} {1} a quitté le site {4} - Le rôle de {1} a changé pour {2} + Rôle {1} changé en {2} Lien {0} créé par {1} Lien {0} mis à jour par {1} Lien {0} supprimé par {1} @@ -108,7 +108,7 @@ Détails de la liste des données {0} mis à jour par {1} Liste des données {0} supprimée par {1} {1} suit maintenant {5} - {1} s\'est inscrit à {2} + {1} s\'est abonné à {2} {1} : {6} {1} a prévisualisé le document {0} {1} a téléchargé le document {0} @@ -208,7 +208,7 @@ Aucun utilisateur trouvé Aucun fichier trouvé Aucun site disponible - Aucun historique de version disponible + Aucun historique des versions disponible Aucune session disponible Aucune activité trouvée Aucun tag trouvé @@ -234,7 +234,7 @@ Prendre une photo Enregistrer vidéo Enregistrer audio - Historique de version + Historique des versions Tags Partager Actualiser diff --git a/platform/foundation/src/main/res/values-it/alfresco_strings.xml b/platform/foundation/src/main/res/values-it/alfresco_strings.xml index c6f590e2..abfe4da6 100644 --- a/platform/foundation/src/main/res/values-it/alfresco_strings.xml +++ b/platform/foundation/src/main/res/values-it/alfresco_strings.xml @@ -71,7 +71,7 @@ Discussione {0} aggiornata da {1} Discussione {0} eliminata da {1} {1} ha risposto alla discussione {0} - {1} ha aggiornato una risposta in {0} + {1} ha aggiornato la risposta a {0} Evento del calendario {0} creato da {1} Evento del calendario {0} aggiornato da {1} Evento del calendario {0} eliminato da {1} @@ -164,7 +164,7 @@ Album Artista Compositore - Ingegnere + Tecnico Genere Numero di traccia Data di pubblicazione @@ -175,7 +175,7 @@ Versione Data di modifica - Ultima modifica effettuata da + Ultima modifica di Commento Versione attuale @@ -194,7 +194,7 @@ Crea una nuova cartella Nome - Immetti qui il nome della cartella… + Digita qui il nome della cartella… Modifica Aggiorna @@ -225,7 +225,7 @@ Immetti termine da cercare Commenti - Immetti qui il commento… + Digita qui il commento… Crea Aggiungi @@ -234,7 +234,7 @@ Scatta foto Registra video Registra audio - Cronologia delle versioni + Cronologia versioni Tag Condividi Aggiorna @@ -242,7 +242,7 @@ Salva - Si è verificato un errore. Riprovare. + Si è verificato un errore. Riprova. Si è verificato un errore. Impossibile aprire il file Impossibile condividere il link @@ -253,41 +253,41 @@ Riprova Salva account Errore di connessione - Impossibile eseguire l\'autenticazione. Verificare le impostazioni dell\'account Alfresco. + Impossibile eseguire l\'autenticazione. Verifica le impostazioni dell\'account Alfresco. Il valore del nome host è probabilmente errato. - nome host è probabilmente errato o è necessario attivare il VPN.
Verificare i valori e le impostazioni.]]>
+ nome host è probabilmente errato o è necessario attivare il VPN.
Verifica i valori e le impostazioni.]]>
La connessione dati del dispositivo è assente. - La connessione dati del dispositivo è assente.

Controllare le impostazioni del dispositivo e abilitare la connessione dati.]]>
- Verificare le impostazioni dell\'account Alfresco (Nome utente/Password).]]> - URL servizio è errato.
Verificare le impostazioni dell\'account Alfresco.]]>
- Riprovare più tardi.]]> - Verificare le impostazioni dell\'account Alfresco.]]> - porta è errato.
Verificare le impostazioni dell\'account Alfresco.]]>
+ La connessione dati del dispositivo è assente.

Controlla le impostazioni del dispositivo e abilita la connessione dati.]]>
+ Verifica le impostazioni dell\'account Alfresco (Nome utente/Password).]]> + URL servizio è errato.
Verifica le impostazioni dell\'account Alfresco.]]>
+ Riprova più tardi.]]> + Verifica le impostazioni dell\'account Alfresco.]]> + porta è errato.
Verifica le impostazioni dell\'account Alfresco.]]>
Il certificato di sicurezza del server non è attendibile.

L\'organizzazione di terzi che ha emesso il certificato di destinazione del server non è riconosciuta dal dispositivo.
- Alfresco Mobile può verificare che si sta effettuando la connessione al server giusto solo se il certificato è emesso da un\'organizzazione attendibile.
- Se il server ha un certificato autofirmato, aggiungerlo al dispositivo per poter effettuare la connessione.
]]> + Alfresco Mobile può verificare che ti stai connettendo al server giusto solo se il certificato è emesso da un\'organizzazione attendibile.
+ Se il server ha un certificato autofirmato, aggiungilo al dispositivo per poterti connettere.
]]>
Il certificato di sicurezza del server è scaduto o non è più valido.

- Verificare la data e l\'ora del dispositivo.
Se il problema persiste, contattare l\'amministratore. ]]> + Verifica la data e l\'ora del dispositivo.
Se il problema persiste, contatta l\'amministratore. ]]>
Si è verificato un errore con il protocollo SSL.

- Verificare le impostazioni dell\'account Alfresco e riprovare.
Se il problema persiste, contattare l\'amministratore.]]> + Verifica le impostazioni dell\'account Alfresco e riprova.
Se il problema persiste, contatta l\'amministratore.]]>
Il carico di lavoro di Alfresco in the Cloud è al momento eccessivo.

- Riprovare tra qualche minuto.
]]> + Riprova tra qualche minuto.
]]>
- La sessione è scaduta. Ripetere l\'accesso. + La sessione è scaduta. Accedi di nuovo. Aggiornamento sessione. - Ricaricare l\'account.]]> + Ricarica l\'account.]]> - URL errato. Verificare le impostazioni dell\'account Alfresco. + URL errato. Verifica le impostazioni dell\'account Alfresco. Impossibile trovare la risorsa. - Impossibile rinominare il file. Potrebbe esistere un altro file con lo stesso nome. + Impossibile rinominare il file. Forse esiste già un altro file con lo stesso nome. Si è verificato un errore: %s Si è verificato un errore: %s @@ -301,8 +301,8 @@ Convalida certificato SSL disabilitata. - Verifica delle informazioni account in corso… - Account pronto per l\'utilizzo. + Verifica informazioni account in corso… + Account pronto per l\'uso. Server Alfresco Alfresco in the Cloud @@ -391,9 +391,9 @@ Disattiva sincronizzazione Disattivare la sincronizzazione?

Tutti i contenuti sincronizzati saranno rimossi dal dispositivo.]]>
Errori di sincronizzazione - %s è stato rimosso dai preferiti perché modificato.
Sincronizzare la versione modificata con il server o salvarla nella cartella \"Download\".

]]>
+ %s è stato rimosso dai preferiti perché modificato.
Sincronizza la versione modificata con il server o salvala nella cartella \"Download\".

]]>
%s è stato cancellato dal server, ma una copia è stata salvata nella cartella \"Download\".

]]>
- Non si dispone dei permessi necessari per caricare la versione modificata di %s. È possibile salvarla nella cartella \"Download\", oppure sovrascriverla con la versione presente sul server, che annullerà le modifiche.]]> + Non hai i permessi necessari per caricare la versione modificata di %s. Puoi salvarla nella cartella \"Download\" o sovrascriverla con la versione presente sul server, che annullerà le modifiche.]]> Errori di sincronizzazione Sincronizza Sovrascrivi @@ -443,9 +443,9 @@ Avviso di sincronizzazione Errore di sincronizzazione - Si sta per eseguire la sincronizzazione di %s su una connessione portante.

Continuare?]]>
- Si sta tentando di sincronizzare %1$s, ma sono disponibili solo %2$s.

Liberare un po\' di spazio sul dispositivo o rimuovere alcuni contenuti dai preferiti.]]>
- Si sta per eseguire la sincronizzazione di %1$s, ma sul dispositivo rimane soltanto %2$s.

Continuare?]]>
+ Stai per sincronizzare %s su una connessione portante.

Continuare?]]>
+ Stai tentando di sincronizzare %1$s, ma sono disponibili solo %2$s.

Libera spazio sul dispositivo o rimuovi alcuni contenuti dai preferiti.]]>
+ Stai per sincronizzare %1$s, ma sul dispositivo rimangono solo %2$s.

Continuare?]]>
Questo documento non è disponibile sul dispositivo. diff --git a/platform/foundation/src/main/res/values-ja/alfresco_strings.xml b/platform/foundation/src/main/res/values-ja/alfresco_strings.xml index e5fc2c81..495b0a37 100644 --- a/platform/foundation/src/main/res/values-ja/alfresco_strings.xml +++ b/platform/foundation/src/main/res/values-ja/alfresco_strings.xml @@ -86,7 +86,7 @@ {0} 個のフォルダが {1} によって追加されました {0} が {1} によって削除されました {0} 個のフォルダが {1} によって削除されました - {0} ファイルが {1} によってGoogle ドキュメント™ にチェックアウトされました + {0} ファイルが {1} によって Google ドキュメント™ にチェックアウトされました {0} ファイルが {1} によって Google ドキュメント™ からチェックインされました {0} ファイルが {1} によって編集されました {1} がファイル {0} に [いいね !] を付けました @@ -108,7 +108,7 @@ {0} データリストの詳細が {1} によって更新されました {0} データリストが {1} によって削除されました {1} は現在 {5} をフォローしています - {1} が {2} を購読しました + {1} は {2} を購読しています {1}: {6} {1} が文書 {0} をプレビューしました {1} が文書 {0} をダウンロードしました @@ -231,9 +231,9 @@ 追加 いいね! プログラムから開く - 写真を撮影する - ビデオを録画する - オーディオを録音する + 写真の撮影 + ビデオの録画 + オーディオの録音 バージョン履歴 タグ 共有 From f1ebb054d9d013ec7caeb39c5081d777b2b8ec67 Mon Sep 17 00:00:00 2001 From: jmpascal Date: Mon, 18 Apr 2016 10:20:52 +0200 Subject: [PATCH 08/25] ANDROID-284 --- .../fragments/help/HelpDialogFragment.java | 2 +- .../node/details/NodeDetailsActionMode.java | 2 +- .../node/details/NodeDetailsFragment.java | 5 +++-- .../src/main/res/drawable-xhdpi/ic_properties.png | Bin 0 -> 585 bytes .../src/main/res/values-de/strings.xml | 2 +- .../src/main/res/values-es/strings.xml | 2 +- .../src/main/res/values-fr/strings.xml | 2 +- .../src/main/res/values-it/strings.xml | 2 +- .../src/main/res/values-ja/strings.xml | 2 +- .../src/main/res/values-zh-rCN/strings.xml | 2 +- .../src/main/res/values/strings.xml | 2 +- 11 files changed, 12 insertions(+), 11 deletions(-) create mode 100644 alfresco-mobile-android/src/main/res/drawable-xhdpi/ic_properties.png diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/help/HelpDialogFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/help/HelpDialogFragment.java index 79b22228..b2f7e444 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/help/HelpDialogFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/help/HelpDialogFragment.java @@ -208,7 +208,7 @@ public void onStop() // /////////////////////////////////////////////////////////////////////////// private String getUrl(FragmentActivity activity) { - String prefix = activity.getString(R.string.asset_folder_prefix); + String prefix = activity.getString(R.string.docs_prefix); String urlValue = null; if (TextUtils.isEmpty(prefix)) { diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsActionMode.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsActionMode.java index cb216989..fe4eec4e 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsActionMode.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsActionMode.java @@ -114,7 +114,7 @@ protected void getMenu(FragmentActivity activity, Menu menu) ConfigurableActionHelper.ACTION_NODE_EDIT)) { mi = menu.add(Menu.NONE, R.id.menu_action_edit, Menu.FIRST + 50, R.string.edit); - mi.setIcon(R.drawable.ic_edit); + mi.setIcon(R.drawable.ic_properties); mi.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); } diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java index c4b91ead..a736d948 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java @@ -1205,7 +1205,8 @@ public void getMenu(Context context, AlfrescoSession session, Menu menu, Node no { mi = menu.add(Menu.NONE, R.id.menu_action_open_with_alfresco_editor, Menu.FIRST + 50, R.string.open_in_alfresco_editor); - mi.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); + mi.setIcon(R.drawable.ic_edit); + mi.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); } } catch (Exception e) @@ -1220,7 +1221,7 @@ public void getMenu(Context context, AlfrescoSession session, Menu menu, Node no ConfigurableActionHelper.ACTION_NODE_EDIT)) { mi = menu.add(Menu.NONE, R.id.menu_action_edit, Menu.FIRST + 10, R.string.edit); - mi.setIcon(R.drawable.ic_edit); + mi.setIcon(R.drawable.ic_properties); mi.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); } diff --git a/alfresco-mobile-android/src/main/res/drawable-xhdpi/ic_properties.png b/alfresco-mobile-android/src/main/res/drawable-xhdpi/ic_properties.png new file mode 100644 index 0000000000000000000000000000000000000000..1246a8114387ac649f2aa175015d5aa15b8beecc GIT binary patch literal 585 zcmV-P0=E5$P)O%yczqZ(d62mmpl;RK`w8ZLkgL1_VLfrb;17H}aznx?w| zaICdHK*UYvnvbnkYd9K>Cd_rL(%A;gi|;F?cC5Z}b(hkL02CrcK1~P_z&8Y6CWH#Wn+YKU@M1#f07^HZ3IIwqp(+6W zG+};ylAj?}0`RK|wE;jqLILpef+T-}X#r{lVt^PREfDq$;Pz;iWp~Tw19yEFL$K5h z3IH*n;w?bE-)-}Pp8>XoP~!wZ01u(1w*d8IZS#URfV)At2IU&8_%+!07O)*=)Hp8S z(tit33$x7=0P+s_=RZU`oz4{^ZrCd8GEOP=F&>WxoHf}qpxthtX{`@Ao1o?*;!B?A z_tg9%j}0J6lD#;N`-r&B*~q%Ni1-cw*Lj}5t(&_T&jwH|RzOfnokUTzUv@hb+RtXQ zR{$7ti+5rGhkgjTP7Da45b7QT0F_)_^2C6;oFuglF@Q?0E_q@=T~3l(hZsO5SC_mm XF?K~zd1c8D00000NkvXXu0mjfi2(2x literal 0 HcmV?d00001 diff --git a/alfresco-mobile-android/src/main/res/values-de/strings.xml b/alfresco-mobile-android/src/main/res/values-de/strings.xml index 0abccd17..67c9fdb3 100644 --- a/alfresco-mobile-android/src/main/res/values-de/strings.xml +++ b/alfresco-mobile-android/src/main/res/values-de/strings.xml @@ -164,7 +164,7 @@ Inhalt freigeben für… - de + de Version diff --git a/alfresco-mobile-android/src/main/res/values-es/strings.xml b/alfresco-mobile-android/src/main/res/values-es/strings.xml index 07d7a562..486f9991 100644 --- a/alfresco-mobile-android/src/main/res/values-es/strings.xml +++ b/alfresco-mobile-android/src/main/res/values-es/strings.xml @@ -164,7 +164,7 @@ Compartir contenido con… - es + es Versión diff --git a/alfresco-mobile-android/src/main/res/values-fr/strings.xml b/alfresco-mobile-android/src/main/res/values-fr/strings.xml index acab1730..57b2cf78 100644 --- a/alfresco-mobile-android/src/main/res/values-fr/strings.xml +++ b/alfresco-mobile-android/src/main/res/values-fr/strings.xml @@ -164,7 +164,7 @@ Partager le contenu avec… - fr + fr Version diff --git a/alfresco-mobile-android/src/main/res/values-it/strings.xml b/alfresco-mobile-android/src/main/res/values-it/strings.xml index 0ab88763..81561e86 100644 --- a/alfresco-mobile-android/src/main/res/values-it/strings.xml +++ b/alfresco-mobile-android/src/main/res/values-it/strings.xml @@ -164,7 +164,7 @@ Condividi contenuto con… - it + it Versione diff --git a/alfresco-mobile-android/src/main/res/values-ja/strings.xml b/alfresco-mobile-android/src/main/res/values-ja/strings.xml index 01b491be..f9eaa215 100644 --- a/alfresco-mobile-android/src/main/res/values-ja/strings.xml +++ b/alfresco-mobile-android/src/main/res/values-ja/strings.xml @@ -164,7 +164,7 @@ コンテンツの共有… - ja + ja バージョン diff --git a/alfresco-mobile-android/src/main/res/values-zh-rCN/strings.xml b/alfresco-mobile-android/src/main/res/values-zh-rCN/strings.xml index e01a1dd5..0d0da175 100644 --- a/alfresco-mobile-android/src/main/res/values-zh-rCN/strings.xml +++ b/alfresco-mobile-android/src/main/res/values-zh-rCN/strings.xml @@ -164,7 +164,7 @@ 与…共享内容 - + 版本 diff --git a/alfresco-mobile-android/src/main/res/values/strings.xml b/alfresco-mobile-android/src/main/res/values/strings.xml index b83d5448..f49c1ae5 100644 --- a/alfresco-mobile-android/src/main/res/values/strings.xml +++ b/alfresco-mobile-android/src/main/res/values/strings.xml @@ -164,7 +164,7 @@ Share Content with… - + Version From 7eec63d8c9cdd82dbe069d09c6b91a3992ce9069 Mon Sep 17 00:00:00 2001 From: jmpascal Date: Tue, 19 Apr 2016 10:49:09 +0200 Subject: [PATCH 09/25] ANDROID-301 --- .../fragments/node/browser/NodeAdapter.java | 8 ++--- .../workflow/task/TaskDetailsFragment.java | 4 +-- .../utils/NodeSyncPlaceHolderFormatter.java | 30 +++++++++---------- .../mobile/android/ui/utils/Formatter.java | 30 +++++++++---------- 4 files changed, 36 insertions(+), 36 deletions(-) diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/browser/NodeAdapter.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/browser/NodeAdapter.java index 02a5b973..fc464837 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/browser/NodeAdapter.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/browser/NodeAdapter.java @@ -352,9 +352,9 @@ private String createContentBottomText(Context context, Node node) { String s = ""; - if (node.getCreatedAt() != null) + if (node.getModifiedAt() != null) { - s = formatDate(context, node.getCreatedAt().getTime()); + s = formatDate(context, node.getModifiedAt().getTime()); if (node.isDocument()) { Document doc = (Document) node; @@ -368,10 +368,10 @@ private String createContentDescriptionBottomText(Context context, Node node) { StringBuilder s = new StringBuilder(); - if (node.getCreatedAt() != null) + if (node.getModifiedAt() != null) { s.append(context.getString(R.string.metadata_modified)); - s.append(formatDate(context, node.getCreatedAt().getTime())); + s.append(formatDate(context, node.getModifiedAt().getTime())); if (node.isDocument()) { Document doc = (Document) node; diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/workflow/task/TaskDetailsFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/workflow/task/TaskDetailsFragment.java index c2ebcba2..3a2840a5 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/workflow/task/TaskDetailsFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/workflow/task/TaskDetailsFragment.java @@ -429,9 +429,9 @@ private String createContentBottomText(Context context, Node node) { String s = ""; - if (node.getCreatedAt() != null) + if (node.getModifiedAt() != null) { - s = Formatter.formatToRelativeDate(context, node.getCreatedAt().getTime()); + s = Formatter.formatToRelativeDate(context, node.getModifiedAt().getTime()); if (node.isDocument()) { Document doc = (Document) node; diff --git a/platform/foundation/src/main/java/org/alfresco/mobile/android/sync/utils/NodeSyncPlaceHolderFormatter.java b/platform/foundation/src/main/java/org/alfresco/mobile/android/sync/utils/NodeSyncPlaceHolderFormatter.java index 05187650..44cad306 100644 --- a/platform/foundation/src/main/java/org/alfresco/mobile/android/sync/utils/NodeSyncPlaceHolderFormatter.java +++ b/platform/foundation/src/main/java/org/alfresco/mobile/android/sync/utils/NodeSyncPlaceHolderFormatter.java @@ -1,20 +1,20 @@ -/******************************************************************************* - * Copyright (C) 2005-2014 Alfresco Software Limited. +/* + * Copyright (C) 2005-2016 Alfresco Software Limited. * - * This file is part of Alfresco Mobile for Android. + * This file is part of Alfresco Mobile for Android. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *******************************************************************************/ + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.alfresco.mobile.android.sync.utils; import org.alfresco.mobile.android.ui.utils.Formatter; @@ -34,9 +34,9 @@ private NodeSyncPlaceHolderFormatter() public static String createContentBottomText(Context context, NodeSyncPlaceHolder node, boolean extended) { StringBuilder s = new StringBuilder(); - if (node.getCreatedAt() != null) + if (node.getModifiedAt() != null) { - s.append(Formatter.formatToRelativeDate(context, node.getCreatedAt().getTime())); + s.append(Formatter.formatToRelativeDate(context, node.getModifiedAt().getTime())); if (node.isDocument()) { s.append(" - "); diff --git a/platform/foundation/src/main/java/org/alfresco/mobile/android/ui/utils/Formatter.java b/platform/foundation/src/main/java/org/alfresco/mobile/android/ui/utils/Formatter.java index 1d818ce6..c2fe3d27 100644 --- a/platform/foundation/src/main/java/org/alfresco/mobile/android/ui/utils/Formatter.java +++ b/platform/foundation/src/main/java/org/alfresco/mobile/android/ui/utils/Formatter.java @@ -1,20 +1,20 @@ -/******************************************************************************* - * Copyright (C) 2005-2014 Alfresco Software Limited. +/* + * Copyright (C) 2005-2016 Alfresco Software Limited. * - * This file is part of Alfresco Mobile for Android. + * This file is part of Alfresco Mobile for Android. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *******************************************************************************/ + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.alfresco.mobile.android.ui.utils; import java.util.Date; @@ -120,9 +120,9 @@ public static String createContentBottomText(Context context, Node node) public static String createContentBottomText(Context context, Node node, boolean extended) { StringBuilder s = new StringBuilder(); - if (node.getCreatedAt() != null) + if (node.getModifiedAt() != null) { - s.append(formatToRelativeDate(context, node.getCreatedAt().getTime())); + s.append(formatToRelativeDate(context, node.getModifiedAt().getTime())); if (node.isDocument()) { Document doc = (Document) node; From 541188a55f9b0504ea6bd99ddfddea96b0696155 Mon Sep 17 00:00:00 2001 From: jmpascal Date: Tue, 19 Apr 2016 11:06:12 +0200 Subject: [PATCH 10/25] ANDROID-306 --- .../node/details/NodeDetailsFragment.java | 25 +++++++++++++++---- .../platform/extensions/AnalyticsManager.java | 2 ++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java index a736d948..3d52aeaa 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java @@ -1033,11 +1033,25 @@ public void onActivityNotFoundException(ActivityNotFoundException e) } // Analytics - AnalyticsHelper.reportOperationEvent(getActivity(), AnalyticsManager.CATEGORY_DOCUMENT_MANAGEMENT, - AnalyticsManager.ACTION_OPEN, - node.isDocument() ? ((Document) node).getContentStreamMimeType() : AnalyticsManager.TYPE_FOLDER, 1, - false, AnalyticsManager.INDEX_FILE_SIZE, - node.isDocument() ? ((Document) node).getContentStreamLength() : 0); + if (node instanceof Document) + { + AnalyticsHelper.reportOperationEvent(getActivity(), AnalyticsManager.CATEGORY_DOCUMENT_MANAGEMENT, + AnalyticsManager.ACTION_OPEN, + node.isDocument() ? ((Document) node).getContentStreamMimeType() : AnalyticsManager.TYPE_FOLDER, 1, + false, AnalyticsManager.INDEX_FILE_SIZE, + node.isDocument() ? ((Document) node).getContentStreamLength() : 0); + } + else if (node instanceof NodeSyncPlaceHolder) + { + AnalyticsHelper.reportOperationEvent(getActivity(), AnalyticsManager.CATEGORY_DOCUMENT_MANAGEMENT, + AnalyticsManager.ACTION_OPEN_OFFLINE, + node.getPropertyValue(PropertyIds.CONTENT_STREAM_MIME_TYPE) != null + ? node.getPropertyValue(PropertyIds.CONTENT_STREAM_MIME_TYPE).toString() + : AnalyticsManager.TYPE_FOLDER, + 1, false, AnalyticsManager.INDEX_FILE_SIZE, + node.getPropertyValue(PropertyIds.CONTENT_STREAM_LENGTH) != null + ? Long.parseLong(node.getPropertyValue(PropertyIds.CONTENT_STREAM_LENGTH).toString()) : 0); + } } public void setDownloadDateTime(Date downloadDateTime) @@ -1602,6 +1616,7 @@ protected Fragment getFragment(String tag) { return getActivity().getSupportFragmentManager().findFragmentByTag(tag); } + // /////////////////////////////////////////////////////////////////////////// // BUILDER // /////////////////////////////////////////////////////////////////////////// diff --git a/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/extensions/AnalyticsManager.java b/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/extensions/AnalyticsManager.java index 23426985..e817a2bc 100644 --- a/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/extensions/AnalyticsManager.java +++ b/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/extensions/AnalyticsManager.java @@ -75,6 +75,8 @@ public abstract class AnalyticsManager extends Manager public static final String ACTION_OPEN = "Open"; + public static final String ACTION_OPEN_OFFLINE = "Open Offline"; + public static final String ACTION_DOWNLOAD = "Download"; public static final String ACTION_EDIT = "Edit"; From 7e79051a282654f2eb34bd7977648c3af1b02950 Mon Sep 17 00:00:00 2001 From: jmpascal Date: Mon, 25 Apr 2016 17:21:24 +0200 Subject: [PATCH 11/25] ANDROID-271 ANDROID-309 ANDROID-310 ANDROID-296 --- .../assets/Configuration/embedded_config.json | 15 ++ .../application/activity/MainActivity.java | 27 ++- .../features/AbstractConfigFeature.java | 228 ++++++++++++++++++ .../features/ConfigFeatureHelper.java | 84 +++++++ .../features/DataProtectionConfigFeature.java | 76 ++++++ .../features/PasscodeConfigFeature.java | 81 +++++++ .../features/SyncCellularConfigFeature.java | 114 +++++++++ .../preferences/AccountSettingsFragment.java | 15 ++ .../preferences/GeneralPreferences.java | 53 ++-- .../preferences/PasscodePreferences.java | 36 +-- .../security/PassCodeActivity.java | 22 +- .../security/PassCodeDialogFragment.java | 54 ++++- .../main/res/layout/app_passcode_simple.xml | 27 +++ .../src/main/res/values/strings.xml | 1 + .../api/model/config/FeatureConfig.java | 20 ++ .../platform/extensions/AnalyticsHelper.java | 1 + .../platform/extensions/AnalyticsManager.java | 8 + .../android/ui/activity/AlfrescoActivity.java | 16 -- 18 files changed, 808 insertions(+), 70 deletions(-) create mode 100644 alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/features/AbstractConfigFeature.java create mode 100644 alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/features/ConfigFeatureHelper.java create mode 100644 alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/features/DataProtectionConfigFeature.java create mode 100644 alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/features/PasscodeConfigFeature.java create mode 100644 alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/features/SyncCellularConfigFeature.java diff --git a/alfresco-mobile-android/src/main/assets/Configuration/embedded_config.json b/alfresco-mobile-android/src/main/assets/Configuration/embedded_config.json index 9ab55261..68bce454 100644 --- a/alfresco-mobile-android/src/main/assets/Configuration/embedded_config.json +++ b/alfresco-mobile-android/src/main/assets/Configuration/embedded_config.json @@ -16,6 +16,21 @@ "id": "feature-analytics-default", "type": "org.alfresco.client.feature.analytics", "enable": false + }, + { + "id": "feature-sync-cellular-default", + "type": "org.alfresco.client.feature.sync.cellular", + "enable": true + }, + { + "id": "feature-data_protection-default", + "type": "org.alfresco.client.feature.data.protection", + "enable": false + }, + { + "id": "feature-passcode-default", + "type": "org.alfresco.client.feature.passcode", + "enable": false } ], "action-groups": [ diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/activity/MainActivity.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/activity/MainActivity.java index 24c2883f..7e182324 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/activity/MainActivity.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/activity/MainActivity.java @@ -30,6 +30,7 @@ import org.alfresco.mobile.android.application.R; import org.alfresco.mobile.android.application.capture.DeviceCapture; import org.alfresco.mobile.android.application.configuration.ConfigurationConstant; +import org.alfresco.mobile.android.application.configuration.features.ConfigFeatureHelper; import org.alfresco.mobile.android.application.fragments.DisplayUtils; import org.alfresco.mobile.android.application.fragments.FragmentDisplayer; import org.alfresco.mobile.android.application.fragments.about.AboutFragment; @@ -49,6 +50,7 @@ import org.alfresco.mobile.android.application.managers.RenditionManagerImpl; import org.alfresco.mobile.android.application.managers.extensions.AnalyticHelper; import org.alfresco.mobile.android.application.security.DataProtectionUserDialogFragment; +import org.alfresco.mobile.android.application.security.PassCodeActivity; import org.alfresco.mobile.android.async.Operator; import org.alfresco.mobile.android.async.account.CreateAccountEvent; import org.alfresco.mobile.android.async.configuration.ConfigurationEvent; @@ -367,6 +369,12 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) .post(new ConfigManager.ConfigurationMenuEvent(getCurrentAccount().getId())); } } + + if (requestCode == PassCodeActivity.REQUEST_CODE_PASSCODE && sessionState == SESSION_LOADING + && getCurrentSession() != null) + { + onAccountLoaded(new LoadAccountCompletedEvent("-1", getCurrentAccount())); + } } @Override @@ -854,6 +862,7 @@ public void onAccountLoaded(LoadAccountCompletedEvent event) { // Avoid collision with PublicDispatcherActivity when selecting an // account. + Log.i(TAG, "ON Account Loaded"); if (event.requestId == null || getCurrentSession() == null) { return; } if (event.requestId == LoadAccountCompletedEvent.SWAP) @@ -868,10 +877,10 @@ public void onAccountLoaded(LoadAccountCompletedEvent event) ServiceRegistry registry = getCurrentSession().getServiceRegistry(); - ConfigManager config = ConfigManager.getInstance(this); - if (!config.hasConfig(getCurrentAccount().getId())) + ConfigManager configManager = ConfigManager.getInstance(this); + if (!configManager.hasConfig(getCurrentAccount().getId())) { - config.init(getCurrentAccount()); + configManager.init(getCurrentAccount()); } if (registry instanceof AlfrescoServiceRegistry) { @@ -884,10 +893,14 @@ public void onAccountLoaded(LoadAccountCompletedEvent event) } else { - config.loadRemote(getCurrentAccount().getId(), ((AlfrescoServiceRegistry) registry).getConfigService()); + configManager.loadRemote(getCurrentAccount().getId(), + ((AlfrescoServiceRegistry) registry).getConfigService()); + + // Check feature config + ConfigFeatureHelper.check(this, getCurrentAccount(), getCurrentSession()); } } - config.setSession(getCurrentAccount().getId(), getCurrentSession()); + configManager.setSession(getCurrentAccount().getId(), getCurrentSession()); // Retrieve latest avatar Operator.with(this).load(new AvatarRequest.Builder(getCurrentAccount().getUsername())); @@ -996,7 +1009,6 @@ public void onAccountLoaded(LoadAccountCompletedEvent event) } invalidateOptionsMenu(); - } @Subscribe @@ -1082,7 +1094,8 @@ else if (sessionState == SESSION_ERROR && getCurrentSession() == null) } invalidateOptionsMenu(); - // If connectivity is better (or reopen) we can try to sync all pending request + // If connectivity is better (or reopen) we can try to sync + // all pending request if (getCurrentSession() != null && SyncContentManager.hasPendingSync(context, getCurrentAccount())) { if (!isSyncActive(AlfrescoAccountManager.getInstance(context) diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/features/AbstractConfigFeature.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/features/AbstractConfigFeature.java new file mode 100644 index 00000000..ac7957c3 --- /dev/null +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/features/AbstractConfigFeature.java @@ -0,0 +1,228 @@ +/* + * Copyright (C) 2005-2016 Alfresco Software Limited. + * + * This file is part of Alfresco Mobile for Android. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.alfresco.mobile.android.application.configuration.features; + +import java.util.List; + +import org.alfresco.mobile.android.api.model.config.FeatureConfig; +import org.alfresco.mobile.android.api.services.ConfigService; +import org.alfresco.mobile.android.api.services.impl.AlfrescoServiceRegistry; +import org.alfresco.mobile.android.api.session.AlfrescoSession; +import org.alfresco.mobile.android.api.session.RepositorySession; +import org.alfresco.mobile.android.platform.accounts.AlfrescoAccount; +import org.alfresco.mobile.android.platform.accounts.AlfrescoAccountManager; + +import android.app.Activity; +import android.content.Context; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; + +/** + * Created by jpascal on 25/04/2016. + */ +public abstract class AbstractConfigFeature +{ + + // //////////////////////////////////////////////////// + // SETTINGS + // //////////////////////////////////////////////////// + public static final int STATUS_BLOCKED = -1; + + public static final int STATUS_DISABLE = 0; + + public static final int STATUS_ENABLE = 1; + + protected SharedPreferences.Editor editor; + + protected Integer status = null; + + protected final Activity activity; + + // //////////////////////////////////////////////////// + // CONSTRUCTOR + // //////////////////////////////////////////////////// + public AbstractConfigFeature(Activity appContext) + { + this.activity = appContext; + } + + // /////////////////////////////////////////////////////////////////////////// + // O + // /////////////////////////////////////////////////////////////////////////// + public void userProtectedByConfig(AlfrescoAccount account) + { + editor = PreferenceManager.getDefaultSharedPreferences(activity).edit(); + editor.putInt(getFeaturePrefix() + account.getId(), STATUS_BLOCKED).apply(); + status = getStatus(); + } + + public void userVisibileByConfig(AlfrescoAccount account) + { + editor = PreferenceManager.getDefaultSharedPreferences(activity).edit(); + editor.putInt(getFeaturePrefix() + account.getId(), STATUS_ENABLE).apply(); + status = getStatus(); + } + + public void enable() + { + setStatus(STATUS_ENABLE); + status = getStatus(); + } + + public void disable() + { + setStatus(STATUS_DISABLE); + status = getStatus(); + } + + public void cleanUserVisibility(AlfrescoAccount account) + { + if (editor == null) + { + editor = PreferenceManager.getDefaultSharedPreferences(activity).edit(); + } + if (account != null) + { + editor.remove(getFeaturePrefix() + account.getId()); + editor.apply(); + } + status = getStatus(); + } + + private void changeUserVisibility(Context context, int value, AlfrescoAccount account) + { + if (editor == null) + { + editor = PreferenceManager.getDefaultSharedPreferences(context).edit(); + } + if (account != null) + { + editor.putInt(getFeaturePrefix() + account.getId(), value); + editor.apply(); + } + } + + public boolean isEnable() + { + if (status == null) + { + getStatus(); + } + return status == STATUS_ENABLE; + } + + public boolean isEnable(AlfrescoAccount account) + { + return PreferenceManager.getDefaultSharedPreferences(activity).getInt(getFeaturePrefix() + account.getId(), + STATUS_ENABLE) == STATUS_ENABLE; + } + + public boolean isProtected(AlfrescoAccount account) + { + return PreferenceManager.getDefaultSharedPreferences(activity).getInt(getFeaturePrefix() + account.getId(), + STATUS_ENABLE) == STATUS_BLOCKED; + } + + public boolean isProtected() + { + if (status == null) + { + getStatus(); + } + return status == STATUS_BLOCKED; + } + + private int getStatus() + { + SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(activity); + List accounts = AlfrescoAccountManager.retrieveAccounts(activity); + int tempStatus = STATUS_ENABLE; + Integer resultStatus = null; + for (AlfrescoAccount account : accounts) + { + tempStatus = sharedPref.getInt(getFeaturePrefix() + account.getId(), STATUS_ENABLE); + switch (tempStatus) + { + case STATUS_BLOCKED: + status = STATUS_BLOCKED; + return STATUS_BLOCKED; + case STATUS_DISABLE: + resultStatus = STATUS_DISABLE; + break; + default: + continue; + } + } + status = resultStatus != null ? resultStatus : STATUS_ENABLE; + return status; + } + + private void setStatus(int status) + { + List accounts = AlfrescoAccountManager.retrieveAccounts(activity); + for (AlfrescoAccount account : accounts) + { + changeUserVisibility(activity, status, account); + } + } + + public abstract String getFeatureType(); + + public abstract String getFeaturePrefix(); + + public void check(AlfrescoSession session, AlfrescoAccount acc, FeatureConfig feature) + { + try + { + // Analytics + if (session instanceof RepositorySession && session.getServiceRegistry() instanceof AlfrescoServiceRegistry) + { + ConfigService configService = ((AlfrescoServiceRegistry) session.getServiceRegistry()) + .getConfigService(); + if (configService != null) + { + if (feature == null && isProtected(acc)) + { + // When server config has been removed we revert + userVisibileByConfig(acc); + } + else if (feature != null) + { + checkFeatureState(feature, acc); + } + } + else if (isProtected(acc)) + { + // When server config has been removed we revert analytics + // to true + userVisibileByConfig(acc); + } + } + } + catch (Exception e) + { + // DO Nothing + } + } + + public void checkFeatureState(FeatureConfig feature, AlfrescoAccount acc) + { + } + +} diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/features/ConfigFeatureHelper.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/features/ConfigFeatureHelper.java new file mode 100644 index 00000000..f695a46f --- /dev/null +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/features/ConfigFeatureHelper.java @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2005-2016 Alfresco Software Limited. + * + * This file is part of Alfresco Mobile for Android. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.alfresco.mobile.android.application.configuration.features; + +import java.util.List; + +import org.alfresco.mobile.android.api.constants.OnPremiseConstant; +import org.alfresco.mobile.android.api.model.config.FeatureConfig; +import org.alfresco.mobile.android.api.services.ConfigService; +import org.alfresco.mobile.android.api.services.impl.AlfrescoServiceRegistry; +import org.alfresco.mobile.android.api.session.AlfrescoSession; +import org.alfresco.mobile.android.api.session.RepositorySession; +import org.alfresco.mobile.android.platform.accounts.AlfrescoAccount; + +import android.app.Activity; + +/** + * Created by jpascal on 21/04/2016. + */ +public class ConfigFeatureHelper +{ + public static void check(Activity activity, AlfrescoAccount acc, AlfrescoSession session) + { + try + { + FeatureConfig passcodeFeature = null, cellularFeature = null, dataProtectionFeature = null; + + if (session instanceof RepositorySession && session.getServiceRegistry() instanceof AlfrescoServiceRegistry) + { + ConfigService configService = ((AlfrescoServiceRegistry) session.getServiceRegistry()) + .getConfigService(); + if (configService != null) + { + List configs = configService.getFeatureConfig(); + + for (FeatureConfig feature : configs) + { + if (FeatureConfig.FEATURE_PASSCODE.equals(feature.getType())) + { + passcodeFeature = feature; + } + else if (FeatureConfig.FEATURE_CELLULAR_SYNC.equals(feature.getType())) + { + cellularFeature = feature; + } + else if (FeatureConfig.FEATURE_DATA_PROTECTION.equals(feature.getType())) + { + dataProtectionFeature = feature; + } + } + } + + new PasscodeConfigFeature(activity).check(session, acc, passcodeFeature); + new SyncCellularConfigFeature(activity).check(session, acc, cellularFeature); + + if (OnPremiseConstant.ALFRESCO_EDITION_ENTERPRISE.equals(session.getRepositoryInfo().getEdition())) + { + new DataProtectionConfigFeature(activity).check(session, acc, dataProtectionFeature); + } + } + } + catch (Exception e) + { + // DO Nothing + } + } + +} diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/features/DataProtectionConfigFeature.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/features/DataProtectionConfigFeature.java new file mode 100644 index 00000000..9afb4559 --- /dev/null +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/features/DataProtectionConfigFeature.java @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2005-2016 Alfresco Software Limited. + * + * This file is part of Alfresco Mobile for Android. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.alfresco.mobile.android.application.configuration.features; + +import org.alfresco.mobile.android.api.model.config.FeatureConfig; +import org.alfresco.mobile.android.platform.accounts.AlfrescoAccount; +import org.alfresco.mobile.android.platform.extensions.AnalyticsManager; +import org.alfresco.mobile.android.platform.security.DataProtectionManager; + +import android.app.Activity; + +/** + * Created by jpascal on 25/04/2016. + */ +public class DataProtectionConfigFeature extends AbstractConfigFeature +{ + public DataProtectionConfigFeature(Activity appContext) + { + super(appContext); + } + + @Override + public String getFeatureType() + { + return FeatureConfig.FEATURE_DATA_PROTECTION; + } + + @Override + public String getFeaturePrefix() + { + return FeatureConfig.FEATURE_DATA_PROTECTION; + } + + @Override + public void checkFeatureState(FeatureConfig feature, AlfrescoAccount acc) + { + // When analytics enable via server config + if (feature.isEnable() && !isProtected(acc)) + { + userProtectedByConfig(acc); + + // Request Data Protection + if (!DataProtectionManager.getInstance(activity).hasDataProtectionEnable()) + { + DataProtectionManager.getInstance(activity).encrypt(acc); + } + + AnalyticsManager.getInstance(activity).reportEvent(AnalyticsManager.CATEGORY_SETTINGS, + AnalyticsManager.ACTION_DATA_PROTECTION, AnalyticsManager.LABEL_ENABLE_BY_CONFIG, 1); + } + else if (!feature.isEnable() && isProtected(acc)) + { + userVisibileByConfig(acc); + + AnalyticsManager.getInstance(activity).reportEvent(AnalyticsManager.CATEGORY_SETTINGS, + AnalyticsManager.ACTION_DATA_PROTECTION, AnalyticsManager.LABEL_DISABLE_BY_CONFIG, 1); + } + } + +} diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/features/PasscodeConfigFeature.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/features/PasscodeConfigFeature.java new file mode 100644 index 00000000..e8d009d3 --- /dev/null +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/features/PasscodeConfigFeature.java @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2005-2016 Alfresco Software Limited. + * + * This file is part of Alfresco Mobile for Android. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.alfresco.mobile.android.application.configuration.features; + +import org.alfresco.mobile.android.api.model.config.FeatureConfig; +import org.alfresco.mobile.android.application.fragments.preferences.PasscodePreferences; +import org.alfresco.mobile.android.application.security.PassCodeActivity; +import org.alfresco.mobile.android.platform.accounts.AlfrescoAccount; +import org.alfresco.mobile.android.platform.extensions.AnalyticsManager; + +import android.app.Activity; +import android.content.Intent; + +/** + * Created by jpascal on 25/04/2016. + */ +public class PasscodeConfigFeature extends AbstractConfigFeature +{ + public PasscodeConfigFeature(Activity appContext) + { + super(appContext); + } + + @Override + public String getFeatureType() + { + return FeatureConfig.FEATURE_PASSCODE; + } + + @Override + public String getFeaturePrefix() + { + return FeatureConfig.FEATURE_PASSCODE; + } + + @Override + public void checkFeatureState(FeatureConfig feature, AlfrescoAccount acc) + { + // When analytics enable via server config + if (feature.isEnable() && !isProtected(acc)) + { + userProtectedByConfig(acc); + + // Request Passcode Definition + + AnalyticsManager.getInstance(activity).reportEvent(AnalyticsManager.CATEGORY_SETTINGS, + AnalyticsManager.ACTION_PASSCODE, AnalyticsManager.LABEL_ENABLE_BY_CONFIG, 1); + } + else if (!feature.isEnable() && isProtected(acc)) + { + userVisibileByConfig(acc); + + AnalyticsManager.getInstance(activity).reportEvent(AnalyticsManager.CATEGORY_SETTINGS, + AnalyticsManager.ACTION_PASSCODE, AnalyticsManager.LABEL_DISABLE_BY_CONFIG, 1); + } + + if (isProtected() && !PasscodePreferences.hasPasscode(activity)) + { + Intent i = new Intent(activity, PassCodeActivity.class); + i.setAction(PassCodeActivity.REQUEST_DEFINE_PASSCODE); + activity.startActivityForResult(i, PassCodeActivity.REQUEST_CODE_PASSCODE); + } + } + +} diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/features/SyncCellularConfigFeature.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/features/SyncCellularConfigFeature.java new file mode 100644 index 00000000..7ebecb36 --- /dev/null +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/features/SyncCellularConfigFeature.java @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2005-2016 Alfresco Software Limited. + * + * This file is part of Alfresco Mobile for Android. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.alfresco.mobile.android.application.configuration.features; + +import org.alfresco.mobile.android.api.model.config.FeatureConfig; +import org.alfresco.mobile.android.api.services.ConfigService; +import org.alfresco.mobile.android.api.services.impl.AlfrescoServiceRegistry; +import org.alfresco.mobile.android.api.session.AlfrescoSession; +import org.alfresco.mobile.android.api.session.RepositorySession; +import org.alfresco.mobile.android.platform.accounts.AlfrescoAccount; +import org.alfresco.mobile.android.platform.extensions.AnalyticsManager; +import org.alfresco.mobile.android.sync.SyncContentManager; + +import android.app.Activity; + +/** + * Created by jpascal on 25/04/2016. + */ +public class SyncCellularConfigFeature extends AbstractConfigFeature +{ + public SyncCellularConfigFeature(Activity appContext) + { + super(appContext); + } + + @Override + public String getFeatureType() + { + return FeatureConfig.FEATURE_CELLULAR_SYNC; + } + + @Override + public String getFeaturePrefix() + { + return FeatureConfig.FEATURE_CELLULAR_SYNC; + } + + @Override + public void check(AlfrescoSession session, AlfrescoAccount acc, FeatureConfig feature) + { + try + { + // Analytics + if (session instanceof RepositorySession && session.getServiceRegistry() instanceof AlfrescoServiceRegistry) + { + ConfigService configService = ((AlfrescoServiceRegistry) session.getServiceRegistry()) + .getConfigService(); + if (configService != null) + { + if (feature == null && isProtected(acc)) + { + // When server config has been removed we revert + userVisibileByConfig(acc); + } + else if (feature != null) + { + checkFeatureState(feature, acc); + } + } + else if (isProtected(acc)) + { + // When server config has been removed we revert user + // visibility + userVisibileByConfig(acc); + } + } + } + catch (Exception e) + { + // DO Nothing + } + } + + @Override + public void checkFeatureState(FeatureConfig feature, AlfrescoAccount acc) + { + // When analytics enable via server config + if (feature.isEnable() && !isEnable(acc)) + { + userVisibileByConfig(acc); + } + // When analytics disable via server config + else if (!feature.isEnable()) + { + if (isEnable()) + { + AnalyticsManager.getInstance(activity).reportEvent(AnalyticsManager.CATEGORY_SETTINGS, + AnalyticsManager.ACTION_SYNC_CELLULAR, AnalyticsManager.LABEL_DISABLE_BY_CONFIG, 1); + } + + if (!isProtected(acc)) + { + userProtectedByConfig(acc); + SyncContentManager.getInstance(activity).setWifiOnlySync(acc, true); + } + } + } +} diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/preferences/AccountSettingsFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/preferences/AccountSettingsFragment.java index d0d4dbdd..af821f0e 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/preferences/AccountSettingsFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/preferences/AccountSettingsFragment.java @@ -28,6 +28,7 @@ import org.alfresco.mobile.android.application.activity.BaseActivity; import org.alfresco.mobile.android.application.activity.BaseAppCompatActivity; import org.alfresco.mobile.android.application.activity.WelcomeActivity; +import org.alfresco.mobile.android.application.configuration.features.SyncCellularConfigFeature; import org.alfresco.mobile.android.application.fragments.DisplayUtils; import org.alfresco.mobile.android.application.fragments.FragmentDisplayer; import org.alfresco.mobile.android.application.fragments.account.AccountEditFragment; @@ -253,6 +254,13 @@ public void onClick(View v) } }); } + + SyncCellularConfigFeature feature = new SyncCellularConfigFeature(getActivity()); + if (feature.isProtected(account)) + { + syncFavoritesVH.bottomText.setText(R.string.mdm_managed); + syncFavoritesVH.choose.setEnabled(false); + } } // /////////////////////////////////////////////////////////////////////////// @@ -534,6 +542,13 @@ private void setCurrentAccount(AlfrescoAccount account) } } + // /////////////////////////////////////////////////////////////////////////// + // CONFIG + // /////////////////////////////////////////////////////////////////////////// + private void getSyncWifi() + { + } + // /////////////////////////////////////////////////////////////////////////// // BUILDER // /////////////////////////////////////////////////////////////////////////// diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/preferences/GeneralPreferences.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/preferences/GeneralPreferences.java index 88cefd6a..3b7cfb26 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/preferences/GeneralPreferences.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/preferences/GeneralPreferences.java @@ -25,6 +25,8 @@ import org.alfresco.mobile.android.application.activity.MainActivity; import org.alfresco.mobile.android.application.activity.PrivateDialogActivity; import org.alfresco.mobile.android.application.activity.WelcomeActivity; +import org.alfresco.mobile.android.application.configuration.features.DataProtectionConfigFeature; +import org.alfresco.mobile.android.application.configuration.features.PasscodeConfigFeature; import org.alfresco.mobile.android.application.fragments.about.AboutFragment; import org.alfresco.mobile.android.application.fragments.account.AccountsAdapter; import org.alfresco.mobile.android.application.fragments.builder.LeafFragmentBuilder; @@ -289,25 +291,36 @@ public void onClick(View v) ? R.string.data_protection_on : R.string.data_protection_off); } - viewById(R.id.settings_privatefolder_container).setOnClickListener(new View.OnClickListener() + DataProtectionConfigFeature feature = new DataProtectionConfigFeature(getActivity()); + if (feature.isProtected()) { - @Override - public void onClick(View v) + viewById(R.id.settings_privatefolder_container).setFocusable(false); + viewById(R.id.settings_privatefolder_container).setClickable(false); + viewById(R.id.settings_privatefolder_container).setEnabled(false); + dataProtectionVH.bottomText.setText(R.string.mdm_managed); + } + else if (sharedPref.getBoolean(HAS_ACCESSED_PAID_SERVICES, false)) + { + viewById(R.id.settings_privatefolder_container).setOnClickListener(new View.OnClickListener() { - final File folder = AlfrescoStorageManager.getInstance(getActivity()).getPrivateFolder("", null); - if (folder != null) - { - DataProtectionUserDialogFragment.newInstance(false).show(getActivity().getSupportFragmentManager(), - DataProtectionUserDialogFragment.TAG); - } - else + @Override + public void onClick(View v) { - AlfrescoNotificationManager.getInstance(getActivity()) - .showLongToast(getString(R.string.sdinaccessible)); - } + final File folder = AlfrescoStorageManager.getInstance(getActivity()).getPrivateFolder("", null); + if (folder != null) + { + DataProtectionUserDialogFragment.newInstance(false) + .show(getActivity().getSupportFragmentManager(), DataProtectionUserDialogFragment.TAG); + } + else + { + AlfrescoNotificationManager.getInstance(getActivity()) + .showLongToast(getString(R.string.sdinaccessible)); + } - } - }); + } + }); + } // PASSCODE passcodeVH = HolderUtils.configure(viewById(R.id.passcode_preference), getString(R.string.passcode_title), @@ -329,6 +342,12 @@ public void onClick(View v) } }); + PasscodeConfigFeature passcodeConfig = new PasscodeConfigFeature(getActivity()); + if (passcodeConfig.isProtected()) + { + passcodeVH.bottomText.setText(R.string.mdm_managed); + } + // In case of MDM we disable all enterprise feature if (mdmManager.hasConfig()) { @@ -379,9 +398,9 @@ public void onClick(View v) } } - private void startPlayStore() + private void retrieveServerConfigFeature() { - ActionUtils.startPlayStore(getActivity(), getString(R.string.settings_rating_packagename)); + } // /////////////////////////////////////////////////////////////////////////// diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/preferences/PasscodePreferences.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/preferences/PasscodePreferences.java index 09405dcf..403ea1b8 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/preferences/PasscodePreferences.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/preferences/PasscodePreferences.java @@ -26,6 +26,7 @@ import org.alfresco.mobile.android.application.R; import org.alfresco.mobile.android.application.activity.MainActivity; import org.alfresco.mobile.android.application.activity.WelcomeActivity; +import org.alfresco.mobile.android.application.configuration.features.PasscodeConfigFeature; import org.alfresco.mobile.android.application.fragments.builder.LeafFragmentBuilder; import org.alfresco.mobile.android.application.security.PassCodeActivity; import org.alfresco.mobile.android.application.security.PassCodeDialogFragment; @@ -174,8 +175,8 @@ public void onClick(View v) passcodeTimeoutVH = HolderUtils.configure(viewById(R.id.passcode_timeout), getString(R.string.passcode_timeout_title), getString(R.string.passcode_timeout_title), -1); int minutes = Math.round(timeout / ONE_MINUTE); - passcodeTimeoutVH.bottomText.setText(String.format( - MessageFormat.format(getString(R.string.passcode_timeout_summary), minutes), minutes)); + passcodeTimeoutVH.bottomText.setText( + String.format(MessageFormat.format(getString(R.string.passcode_timeout_summary), minutes), minutes)); HolderUtils.makeMultiLine(passcodeTimeoutVH.bottomText, 3); if (passcodeEnable) @@ -188,21 +189,20 @@ public void onClick(View v) MaterialDialog.Builder builder = new MaterialDialog.Builder(getActivity()).cancelable(false) .title(R.string.passcode_timeout_title).items(R.array.passcode_timeout_entries) .itemsCallbackSingleChoice(index, new MaterialDialog.ListCallbackSingleChoice() - { - @Override - public boolean onSelection(MaterialDialog dialog, View view, int which, - CharSequence text) - { - String newValue = getResources().getStringArray(R.array.passcode_timeout_values)[which]; - index = which; + { + @Override + public boolean onSelection(MaterialDialog dialog, View view, int which, CharSequence text) + { + String newValue = getResources().getStringArray(R.array.passcode_timeout_values)[which]; + index = which; sharedPref.edit().putString(KEY_PASSCODE_TIMEOUT, (String) newValue).apply(); - int minutes = Math.round(Long.parseLong((String) newValue) / ONE_MINUTE); - passcodeTimeoutVH.bottomText.setText(String.format( - MessageFormat.format(getString(R.string.passcode_timeout_summary), minutes), - minutes)); - return true; - } - }).negativeText(R.string.cancel); + int minutes = Math.round(Long.parseLong((String) newValue) / ONE_MINUTE); + passcodeTimeoutVH.bottomText.setText(String.format( + MessageFormat.format(getString(R.string.passcode_timeout_summary), minutes), + minutes)); + return true; + } + }).negativeText(R.string.cancel); builder.show(); } }); @@ -255,6 +255,10 @@ public void onClick(View v) // PASSCODE ENABLE passcodeEnableVH = HolderUtils.configure(viewById(R.id.passcode_enable_key), getString(R.string.passcode_enable_title), -1, passcodeEnable); + + PasscodeConfigFeature feature = new PasscodeConfigFeature(getActivity()); + passcodeEnableVH.switcher.setEnabled(!feature.isProtected()); + passcodeEnableVH.switcher.setOnClickListener(new View.OnClickListener() { @Override diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/security/PassCodeActivity.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/security/PassCodeActivity.java index 50be2b37..1e036acb 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/security/PassCodeActivity.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/security/PassCodeActivity.java @@ -18,6 +18,7 @@ package org.alfresco.mobile.android.application.security; import org.alfresco.mobile.android.application.R; +import org.alfresco.mobile.android.application.configuration.features.PasscodeConfigFeature; import org.alfresco.mobile.android.application.fragments.FragmentDisplayer; import org.alfresco.mobile.android.application.fragments.preferences.PasscodePreferences; @@ -30,6 +31,8 @@ public class PassCodeActivity extends FragmentActivity { public static final int REQUEST_CODE_PASSCODE = 48976; + public static final String REQUEST_DEFINE_PASSCODE = "definePasscode"; + // /////////////////////////////////////////// // LIFECYCLE // /////////////////////////////////////////// @@ -42,14 +45,29 @@ public void onCreate(Bundle savedInstanceState) if (getSupportFragmentManager().findFragmentByTag(PassCodeDialogFragment.TAG) == null) { - PassCodeDialogFragment f = PassCodeDialogFragment.requestPasscode(); + PassCodeDialogFragment f; + if (getIntent() != null && getIntent().getAction() != null) + { + f = PassCodeDialogFragment.define(); + } + else + { + f = PassCodeDialogFragment.requestPasscode(); + } FragmentDisplayer.with(this).load(f).back(false).animate(null).into(FragmentDisplayer.PANEL_LEFT); } } public static void requestUserPasscode(FragmentActivity activity) { - if (PasscodePreferences.hasPasscodeEnable(activity)) + PasscodeConfigFeature feature = new PasscodeConfigFeature(activity); + if (feature.isProtected() && !PasscodePreferences.hasPasscode(activity)) + { + Intent i = new Intent(activity, PassCodeActivity.class); + i.setAction(REQUEST_DEFINE_PASSCODE); + activity.startActivityForResult(i, REQUEST_CODE_PASSCODE); + } + else if (PasscodePreferences.hasPasscodeEnable(activity)) { activity.startActivityForResult(new Intent(activity, PassCodeActivity.class), REQUEST_CODE_PASSCODE); } diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/security/PassCodeDialogFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/security/PassCodeDialogFragment.java index 01e94c86..d2a97a76 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/security/PassCodeDialogFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/security/PassCodeDialogFragment.java @@ -58,6 +58,10 @@ public class PassCodeDialogFragment extends DialogFragment { public static final String ARGUMENT_MODE = "Mode"; + public static final String ARGUMENT_INFO = "info"; + + public static final int MODE_INFO = 1; + public static final int MODE_CREATE = 1; public static final int MODE_UPDATE = 2; @@ -110,6 +114,16 @@ public static PassCodeDialogFragment enable() return fragment; } + public static PassCodeDialogFragment define() + { + PassCodeDialogFragment fragment = new PassCodeDialogFragment(); + Bundle b = new Bundle(); + b.putInt(ARGUMENT_MODE, MODE_CREATE); + b.putInt(ARGUMENT_INFO, MODE_INFO); + fragment.setArguments(b); + return fragment; + } + public static PassCodeDialogFragment modify() { PassCodeDialogFragment fragment = new PassCodeDialogFragment(); @@ -144,6 +158,17 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa final View v = inflater.inflate(R.layout.app_passcode, (ViewGroup) this.getView()); title = (TextView) v.findViewById(R.id.passcode_hint); + + if (getArguments().containsKey(ARGUMENT_INFO)) + { + ((TextView) v.findViewById(R.id.passcode_admin)).setText(R.string.passcode_admin_title); + v.findViewById(R.id.passcode_admin).setVisibility(View.VISIBLE); + } + else + { + + } + errorMessage = (TextView) v.findViewById(R.id.passcode_error); passwordEditText = (EditText) v.findViewById(R.id.passcode); @@ -162,7 +187,8 @@ public void onClick(View v) }); int[] ids = new int[] { R.id.keyboard_0, R.id.keyboard_1, R.id.keyboard_2, R.id.keyboard_3, R.id.keyboard_4, - R.id.keyboard_5, R.id.keyboard_6, R.id.keyboard_7, R.id.keyboard_8, R.id.keyboard_9, R.id.keyboard_back }; + R.id.keyboard_5, R.id.keyboard_6, R.id.keyboard_7, R.id.keyboard_8, R.id.keyboard_9, + R.id.keyboard_back }; Button key = null; for (int i = 0; i < ids.length; i++) @@ -173,8 +199,7 @@ public void onClick(View v) return v; } - - + @Override public void onResume() { @@ -189,9 +214,8 @@ public void onResume() } if (getDialog() != null) { - getActivity().getWindow().setSoftInputMode( - WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE - | WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); + getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE + | WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); UIUtils.hideKeyboard(getActivity()); } } @@ -345,9 +369,16 @@ else if (needConfirmation && getUserPassCode(true) != null) errorMessage.setVisibility(View.INVISIBLE); if (getActivity().getSupportFragmentManager().findFragmentByTag(PasscodePreferences.TAG) != null) { - ((PasscodePreferences) getActivity().getSupportFragmentManager().findFragmentByTag( - PasscodePreferences.TAG)) - .refresh(); + ((PasscodePreferences) getActivity().getSupportFragmentManager() + .findFragmentByTag(PasscodePreferences.TAG)).refresh(); + } + else + { + editor.putLong(KEY_PASSCODE_ACTIVATED_AT, -1); + editor.remove(KEY_PASSCODE_ATTEMPT); + editor.apply(); + getActivity().setResult(FragmentActivity.RESULT_OK); + getActivity().finish(); } } else @@ -374,9 +405,8 @@ private void delete() errorMessage.setVisibility(View.INVISIBLE); if (getActivity().getSupportFragmentManager().findFragmentByTag(PasscodePreferences.TAG) != null) { - ((PasscodePreferences) getActivity().getSupportFragmentManager().findFragmentByTag( - PasscodePreferences.TAG)) - .refresh(); + ((PasscodePreferences) getActivity().getSupportFragmentManager() + .findFragmentByTag(PasscodePreferences.TAG)).refresh(); } } else diff --git a/alfresco-mobile-android/src/main/res/layout/app_passcode_simple.xml b/alfresco-mobile-android/src/main/res/layout/app_passcode_simple.xml index 0c96d35c..bc7d4fc1 100644 --- a/alfresco-mobile-android/src/main/res/layout/app_passcode_simple.xml +++ b/alfresco-mobile-android/src/main/res/layout/app_passcode_simple.xml @@ -1,4 +1,22 @@ + + + + Enter Passcode + Your Alfresco Administrator requires you to protect Alfresco Mobile with a Passcode. Enable Passcode Passcode Protection Enabled diff --git a/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/FeatureConfig.java b/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/FeatureConfig.java index 2429fd8a..1e599cbd 100644 --- a/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/FeatureConfig.java +++ b/platform/foundation/src/main/java/org/alfresco/mobile/android/api/model/config/FeatureConfig.java @@ -29,7 +29,27 @@ public interface FeatureConfig extends ItemConfig // /////////////////////////////////////////////////////////////////////////// String PREFIX_FEATURE = "org.alfresco.client.feature"; + // If ON ==> user can define the value + // If OFF ==> analytics is OFF String FEATURE_ANALYTICS = PREFIX_FEATURE.concat(".analytics"); + // If ON ==> data protection is activated and cant be changed + // If OFF ==> user can define the value + // If ON then OFF ==> protection is still active but can be deactivated by + // the user. + String FEATURE_DATA_PROTECTION = PREFIX_FEATURE.concat(".data.protection"); + + // If ON ==> passcode is activated by default and cant be changed + // If OFF ==> user can define the value + // If ON then OFF ==> passcode is still active but can be deactivated by the + // user. + String FEATURE_PASSCODE = PREFIX_FEATURE.concat(".passcode"); + + // If ON ==> user can define the value + // If OFF ==> cellular sync is OFF / Sync only on Wifi and cant be changed + // If OFF then ON ==> cellular sync is still OFF but can be reactivated by + // the user. + String FEATURE_CELLULAR_SYNC = PREFIX_FEATURE.concat(".sync.cellular"); + boolean isEnable(); } diff --git a/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/extensions/AnalyticsHelper.java b/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/extensions/AnalyticsHelper.java index e31f6df2..51e26777 100644 --- a/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/extensions/AnalyticsHelper.java +++ b/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/extensions/AnalyticsHelper.java @@ -280,6 +280,7 @@ else if (!feature.isEnable()) AnalyticsManager.getInstance(context).optOutByConfig(context, acc); } } + break; } } } diff --git a/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/extensions/AnalyticsManager.java b/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/extensions/AnalyticsManager.java index e817a2bc..44eb9ee1 100644 --- a/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/extensions/AnalyticsManager.java +++ b/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/extensions/AnalyticsManager.java @@ -95,6 +95,12 @@ public abstract class AnalyticsManager extends Manager public static final String ACTION_ANALYTICS = "Analytics"; + public static final String ACTION_SYNC_CELLULAR = "Sync Cellular"; + + public static final String ACTION_DATA_PROTECTION = "Data Protection"; + + public static final String ACTION_PASSCODE = "Passcode"; + public static final String ACTION_FAVORITE = "Favorite"; public static final String ACTION_UNFAVORITE = "UnFavorite"; @@ -176,6 +182,8 @@ public abstract class AnalyticsManager extends Manager public static final String LABEL_DISABLE = "Disable"; + public static final String LABEL_ENABLE_BY_CONFIG = "Enable By Config"; + public static final String LABEL_DISABLE_BY_CONFIG = "Disable By Config"; public static final String LABEL_JOIN = "Join"; diff --git a/platform/foundation/src/main/java/org/alfresco/mobile/android/ui/activity/AlfrescoActivity.java b/platform/foundation/src/main/java/org/alfresco/mobile/android/ui/activity/AlfrescoActivity.java index 30794f20..eb8c3276 100644 --- a/platform/foundation/src/main/java/org/alfresco/mobile/android/ui/activity/AlfrescoActivity.java +++ b/platform/foundation/src/main/java/org/alfresco/mobile/android/ui/activity/AlfrescoActivity.java @@ -290,22 +290,6 @@ public void cleanUp() // //////////////////////////////////////////////////////// // BROADCAST RECEIVER // /////////////////////////////////////////////////////// - /** - * Register a broadcast receiver to this specific activity. If used this - * methods is responsible to unregister the receiver during on stop(). - * - * @param receiver - * @param filter - */ - public void registerPrivateReceiver(BroadcastReceiver receiver, IntentFilter filter) - { - if (receiver != null && filter != null) - { - broadcastManager.registerReceiver(receiver, filter); - receivers.add(receiver); - } - } - public void registerPublicReceiver(BroadcastReceiver receiver, IntentFilter filter) { if (receiver != null && filter != null) From da9037192e075d78ee92fda973354bdb39014c0f Mon Sep 17 00:00:00 2001 From: jmpascal Date: Wed, 27 Apr 2016 11:18:28 +0200 Subject: [PATCH 12/25] Quick Fix --- .../ui/form/fields/BooleanField.java | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/ui/form/fields/BooleanField.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/ui/form/fields/BooleanField.java index f20709f0..d187dd04 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/ui/form/fields/BooleanField.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/ui/form/fields/BooleanField.java @@ -1,3 +1,21 @@ +/* + * Copyright (C) 2005-2016 Alfresco Software Limited. + * + * This file is part of Alfresco Mobile for Android. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.alfresco.mobile.android.application.ui.form.fields; import org.alfresco.mobile.android.api.model.Property; @@ -81,7 +99,7 @@ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) // /////////////////////////////////////////////////////////////////////////// public boolean isValid() { - if (isRequired && (getEditionValue() != null && getEditionValue() == true)) { return true; } + if (isRequired && (getEditionValue() != null && ((Boolean) getEditionValue()))) { return true; } return false; } From 77fb8d736aadddd0937f31e5a454e763ba24400a Mon Sep 17 00:00:00 2001 From: jmpascal Date: Tue, 3 May 2016 10:30:18 +0200 Subject: [PATCH 13/25] ANDROID-283 --- .../node/details/NodeDetailsFragment.java | 38 +++--- .../res/layout/fr_node_details_header.xml | 115 +++++++++++------- extensions/tools/build.gradle | 2 +- 3 files changed, 92 insertions(+), 63 deletions(-) diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java index 3d52aeaa..40d94919 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java @@ -683,6 +683,25 @@ public void onClick(View v) b.setVisibility(View.GONE); } hideActionIfNecessary(b, ConfigurableActionHelper.ACTION_NODE_SHARE); + + b = (ImageView) viewById(R.id.action_open_in_alfresco_editor); + String mimetype = ((Document) node).getContentStreamMimeType(); + if (node.isDocument() && !TextUtils.isEmpty(mimetype) && mimetype.startsWith(MimeType.TYPE_TEXT)) + { + b.setOnClickListener(new OnClickListener() + { + @Override + public void onClick(View v) + { + openin(true); + } + }); + } + else + { + b.setVisibility(View.GONE); + } + hideActionIfNecessary(b, ConfigurableActionHelper.ACTION_NODE_EDIT); } protected void displayTabs() @@ -1211,22 +1230,6 @@ public void getMenu(Context context, AlfrescoSession session, Menu menu, Node no mi.setIcon(R.drawable.ic_start_review); mi.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); } - - try - { - String mimetype = ((Document) node).getContentStreamMimeType(); - if (!TextUtils.isEmpty(mimetype) && mimetype.startsWith(MimeType.TYPE_TEXT)) - { - mi = menu.add(Menu.NONE, R.id.menu_action_open_with_alfresco_editor, Menu.FIRST + 50, - R.string.open_in_alfresco_editor); - mi.setIcon(R.drawable.ic_edit); - mi.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); - } - } - catch (Exception e) - { - - } } if (session == null) { return; } @@ -1302,9 +1305,6 @@ public boolean onOptionsItemSelected(MenuItem item) node.getProperty(ContentModel.PROP_LATITUDE).getValue().toString(), node.getProperty(ContentModel.PROP_LONGITUDE).getValue().toString()); return true; - case R.id.menu_action_open_with_alfresco_editor: - openin(true); - return true; case R.id.menu_workflow_add: Intent in = new Intent(PrivateIntent.ACTION_START_PROCESS, null, getActivity(), PrivateDialogActivity.class); diff --git a/alfresco-mobile-android/src/main/res/layout/fr_node_details_header.xml b/alfresco-mobile-android/src/main/res/layout/fr_node_details_header.xml index f743b6f3..12533f4b 100644 --- a/alfresco-mobile-android/src/main/res/layout/fr_node_details_header.xml +++ b/alfresco-mobile-android/src/main/res/layout/fr_node_details_header.xml @@ -1,4 +1,22 @@ + + - - + - + - + + android:contentDescription="@string/sync_mark" + android:src="@drawable/ic_sync_light" /> - - + android:layout_height="wrap_content" + android:gravity="center"> - + - + + + android:contentDescription="@string/share" + android:src="@drawable/ic_share" /> - - - + android:layout_height="wrap_content" + android:gravity="center"> + + + + + + + diff --git a/extensions/tools/build.gradle b/extensions/tools/build.gradle index 67b52eb8..1144b4b3 100644 --- a/extensions/tools/build.gradle +++ b/extensions/tools/build.gradle @@ -20,7 +20,7 @@ apply plugin: 'com.android.library' android { compileSdkVersion 23 - buildToolsVersion "23.0.1" + buildToolsVersion "23.0.2" defaultConfig { minSdkVersion 15 From 9826e8019712fe72cd5c12c00d00652a6afcbdab Mon Sep 17 00:00:00 2001 From: jmpascal Date: Tue, 3 May 2016 11:06:17 +0200 Subject: [PATCH 14/25] ANDROID-307 --- .../managers/extensions/AnalyticHelper.java | 51 ++++++++++++++----- .../platform/extensions/AnalyticsManager.java | 14 +++++ 2 files changed, 53 insertions(+), 12 deletions(-) diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/managers/extensions/AnalyticHelper.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/managers/extensions/AnalyticHelper.java index fdebabfe..e4fb9029 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/managers/extensions/AnalyticHelper.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/managers/extensions/AnalyticHelper.java @@ -21,6 +21,7 @@ import java.util.List; import org.alfresco.mobile.android.api.model.config.ProfileConfig; +import org.alfresco.mobile.android.api.services.ConfigService; import org.alfresco.mobile.android.api.session.AlfrescoSession; import org.alfresco.mobile.android.application.fragments.preferences.PasscodePreferences; import org.alfresco.mobile.android.application.managers.ConfigManager; @@ -110,11 +111,6 @@ public static void analyzeSession(Context context, AlfrescoAccount account, Alfr for (int i = 0; i < syncInfo.size(); i++) { int key = syncInfo.keyAt(i); - if (key == AnalyticsManager.INDEX_SYNCED_FILES) - { - customDimensions.append(AnalyticsManager.INDEX_SYNC_FILE_COUNT, - getSyncFileLabel(syncInfo.get(key))); - } customMetrics.append(key, syncInfo.get(key)); } @@ -122,7 +118,9 @@ public static void analyzeSession(Context context, AlfrescoAccount account, Alfr customMetrics.append(AnalyticsManager.INDEX_LOCAL_FILES, getDownloadedFilesCount(context, account)); // Profiles - customMetrics.append(AnalyticsManager.INDEX_PROFILES, getProfilesCount(context, account)); + Long profileCount = getProfilesCount(context, account); + customMetrics.append(AnalyticsManager.INDEX_PROFILES, profileCount); + customDimensions.append(AnalyticsManager.INDEX_PROFILE_COUNT, getProfileLabel(profileCount)); AnalyticsManager.getInstance(context).reportInfo(AnalyticsManager.ACTION_INFO, customDimensions, customMetrics); @@ -141,11 +139,18 @@ protected static Long getProfilesCount(Context context, AlfrescoAccount account) if (ConfigManager.getInstance(context) != null && ConfigManager.getInstance(context).hasConfig(account.getId())) { - List profileListing = ConfigManager.getInstance(context).getConfig(account.getId()) - .getProfiles(); - size = profileListing.size(); - } + ConfigService remoteConfig = ConfigManager.getInstance(context).getRemoteConfig(account.getId()); + if (remoteConfig != null) + { + // Number of profiles + List profileListing = ConfigManager.getInstance(context).getConfig(account.getId()) + .getProfiles(); + size = profileListing.size(); + + // Profile Usage TBD + } + } } catch (Exception e) { @@ -154,9 +159,30 @@ protected static Long getProfilesCount(Context context, AlfrescoAccount account) return (long) size; } + protected static String getProfileLabel(Long valueLong) + { + if (valueLong == null) { return AnalyticsManager.INDEX_PROFILE_COUNT_0; } + switch (valueLong.intValue()) + { + case 0: + return AnalyticsManager.INDEX_PROFILE_COUNT_0; + case 1: + return AnalyticsManager.INDEX_PROFILE_COUNT_1; + case 2: + return AnalyticsManager.INDEX_PROFILE_COUNT_2; + case 3: + return AnalyticsManager.INDEX_PROFILE_COUNT_3; + case 4: + return AnalyticsManager.INDEX_PROFILE_COUNT_4; + case 5: + return AnalyticsManager.INDEX_PROFILE_COUNT_5; + default: + return AnalyticsManager.INDEX_PROFILE_COUNT_5; + } + } + protected static String getAccountLabel(int value) { - String label = AnalyticsManager.INDEX_ACCOUNT_COUNT_1; switch (value) { case 1: @@ -169,8 +195,9 @@ protected static String getAccountLabel(int value) return AnalyticsManager.INDEX_ACCOUNT_COUNT_4; case 5: return AnalyticsManager.INDEX_ACCOUNT_COUNT_5; + default: + return AnalyticsManager.INDEX_ACCOUNT_COUNT_5; } - return label; } protected static String getSyncFileLabel(long value) diff --git a/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/extensions/AnalyticsManager.java b/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/extensions/AnalyticsManager.java index 44eb9ee1..6a6edb2d 100644 --- a/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/extensions/AnalyticsManager.java +++ b/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/extensions/AnalyticsManager.java @@ -256,6 +256,20 @@ public abstract class AnalyticsManager extends Manager public static final String INDEX_ACCOUNT_COUNT_5 = "5+"; + public static final int INDEX_PROFILE_COUNT = 4; + + public static final String INDEX_PROFILE_COUNT_0 = "0"; + + public static final String INDEX_PROFILE_COUNT_1 = "1"; + + public static final String INDEX_PROFILE_COUNT_2 = "2"; + + public static final String INDEX_PROFILE_COUNT_3 = "3"; + + public static final String INDEX_PROFILE_COUNT_4 = "4"; + + public static final String INDEX_PROFILE_COUNT_5 = "5+"; + /////////////////////////////////////////////////////////// // CUSTOM METRICS /////////////////////////////////////////////////////////// From f42763924d04e4d17a9b715a2e1dca9e5893c9d9 Mon Sep 17 00:00:00 2001 From: jmpascal Date: Mon, 9 May 2016 14:37:44 +0200 Subject: [PATCH 15/25] ANDROID-303 --- .../fileexplorer/FileExplorerFragment.java | 12 +++++++++- .../DocumentFolderBrowserFragment.java | 13 +++++++++- .../node/details/NodeDetailsFragment.java | 24 ++++++++++++------- 3 files changed, 39 insertions(+), 10 deletions(-) diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/fileexplorer/FileExplorerFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/fileexplorer/FileExplorerFragment.java index f43a5a9f..aead4633 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/fileexplorer/FileExplorerFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/fileexplorer/FileExplorerFragment.java @@ -55,6 +55,7 @@ import android.content.Intent; import android.net.Uri; import android.os.Bundle; +import android.provider.MediaStore; import android.support.v4.app.DialogFragment; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; @@ -87,6 +88,8 @@ public class FileExplorerFragment extends FileExplorerFoundationFragment private int menuId; + private boolean hasAudioRecorder = false; + // /////////////////////////////////////////////////////////////////////////// // CONSTRUCTORS & HELPERS // /////////////////////////////////////////////////////////////////////////// @@ -168,6 +171,10 @@ public void onActivityCreated(Bundle savedInstanceState) privateFolder = AlfrescoStorageManager.getInstance(getActivity()).getRootPrivateFolder().getParentFile(); } displayTitle(); + + // Test Audio Recording + Intent intent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION); + hasAudioRecorder = intent.resolveActivity(getActivity().getPackageManager()) != null; } @Override @@ -370,7 +377,10 @@ public void onClick(View v) builder.sheet(R.id.menu_create_document, R.drawable.ic_doc_light, R.string.create_document); builder.sheet(R.id.menu_device_capture_camera_photo, R.drawable.ic_camera, R.string.take_photo); builder.sheet(R.id.menu_device_capture_camera_video, R.drawable.ic_videos, R.string.make_video); - builder.sheet(R.id.menu_device_capture_mic_audio, R.drawable.ic_microphone, R.string.record_audio); + if (hasAudioRecorder) + { + builder.sheet(R.id.menu_device_capture_mic_audio, R.drawable.ic_microphone, R.string.record_audio); + } if (ScanSnapManager.getInstance(getActivity()) != null && ScanSnapManager.getInstance(getActivity()).hasScanSnapApplication()) { diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/browser/DocumentFolderBrowserFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/browser/DocumentFolderBrowserFragment.java index 5f50afbb..38bb33a7 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/browser/DocumentFolderBrowserFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/browser/DocumentFolderBrowserFragment.java @@ -103,6 +103,7 @@ import android.content.Intent; import android.net.Uri; import android.os.Bundle; +import android.provider.MediaStore; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v7.app.ActionBar; @@ -166,6 +167,8 @@ public class DocumentFolderBrowserFragment extends NodeBrowserFragment implement private Permissions permission; + private boolean hasAudioRecorder = false; + // ////////////////////////////////////////////////////////////////////// // CONSTRUCTORS // ////////////////////////////////////////////////////////////////////// @@ -247,6 +250,10 @@ else if (getActivity() instanceof BaseShortcutActivity) { setActivateThumbnail(true); } + + // Test Audio Recording + Intent intent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION); + hasAudioRecorder = intent.resolveActivity(getActivity().getPackageManager()) != null; } @Override @@ -986,7 +993,11 @@ public void onClick(View v) builder.sheet(R.id.menu_create_document, R.drawable.ic_doc_light, R.string.create_document); builder.sheet(R.id.menu_device_capture_camera_photo, R.drawable.ic_camera, R.string.take_photo); builder.sheet(R.id.menu_device_capture_camera_video, R.drawable.ic_videos, R.string.make_video); - builder.sheet(R.id.menu_device_capture_mic_audio, R.drawable.ic_microphone, R.string.record_audio); + if (hasAudioRecorder) + { + builder.sheet(R.id.menu_device_capture_mic_audio, R.drawable.ic_microphone, + R.string.record_audio); + } if (ScanSnapManager.getInstance(getActivity()) != null && ScanSnapManager.getInstance(getActivity()).hasScanSnapApplication()) { diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java index 40d94919..ce04ca86 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java @@ -685,17 +685,25 @@ public void onClick(View v) hideActionIfNecessary(b, ConfigurableActionHelper.ACTION_NODE_SHARE); b = (ImageView) viewById(R.id.action_open_in_alfresco_editor); - String mimetype = ((Document) node).getContentStreamMimeType(); - if (node.isDocument() && !TextUtils.isEmpty(mimetype) && mimetype.startsWith(MimeType.TYPE_TEXT)) + + if (node.isDocument()) { - b.setOnClickListener(new OnClickListener() + String mimetype = ((Document) node).getContentStreamMimeType(); + if (!TextUtils.isEmpty(mimetype) && mimetype.startsWith(MimeType.TYPE_TEXT)) { - @Override - public void onClick(View v) + b.setOnClickListener(new OnClickListener() { - openin(true); - } - }); + @Override + public void onClick(View v) + { + openin(true); + } + }); + } + else + { + b.setVisibility(View.GONE); + } } else { From 82d1c67aa89c2be31f61e29e72eb877a8c5062ab Mon Sep 17 00:00:00 2001 From: jmpascal Date: Wed, 11 May 2016 10:14:33 +0200 Subject: [PATCH 16/25] ANDROID-321 --- .../ConfigurableActionHelper.java | 25 +++++++++++++------ .../configuration/ConfigurationConstant.java | 2 ++ .../node/details/NodeDetailsFragment.java | 2 +- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/ConfigurableActionHelper.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/ConfigurableActionHelper.java index 5c8a7bf1..f0c9a240 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/ConfigurableActionHelper.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/ConfigurableActionHelper.java @@ -39,12 +39,6 @@ public final class ConfigurableActionHelper // public static final int ACTION_NODE_CREATE = 0; - public static final int ACTION_CREATE_FOLDER = 13; - - public static final int ACTION_CREATE_DOC = 14; - - public static final int ACTION_NODE_UPLOAD = 15; - public static final int ACTION_NODE_DELETE = 1; public static final int ACTION_NODE_FAVORITE = 2; @@ -69,6 +63,14 @@ public final class ConfigurableActionHelper public static final int ACTION_NODE_SHARE = 12; + public static final int ACTION_CREATE_FOLDER = 13; + + public static final int ACTION_CREATE_DOC = 14; + + public static final int ACTION_NODE_UPLOAD = 15; + + public static final int ACTION_NODE_EDIT_WITH_ALFRESCO = 16; + public static final boolean isVisible(Context context, AlfrescoAccount account, int actionId) { return isVisible(context, account, null, null, actionId); @@ -88,9 +90,13 @@ public static final boolean isVisible(Context context, AlfrescoAccount account, && configManager.getConfig(account.getId()).hasActionConfig()) { ConfigService service = configManager.getConfig(account.getId()); + if (service == null) { return true; } String profileId = configManager.getCurrentProfileId(); - if (profileId == null) { return true; } + if (profileId == null) + { + profileId = service.getDefaultProfile().getIdentifier(); + } String rootActionId = service.getProfile(profileId).getRootActionId(); if (rootActionId == null || service.getActionConfig(rootActionId) == null) { return true; } @@ -148,6 +154,10 @@ public static final boolean isVisible(Context context, AlfrescoAccount account, case ACTION_NODE_SHARE: actionNameId = ConfigurationConstant.KEY_ACTION_NODE_SHARE; break; + case ACTION_NODE_EDIT_WITH_ALFRESCO: + actionNameId = ConfigurationConstant.KEY_ACTION_NODE_EDIT_WITH_ALFRESCO; + permissionRequired = true; + break; } ActionConfig config = ((ActionGroupConfig) service.getActionConfig(rootActionId)) .getChildById(actionNameId); @@ -172,6 +182,7 @@ public static final boolean isVisible(Context context, AlfrescoAccount account, hasPermission = permission.canAddChildren(); break; case ACTION_NODE_EDIT: + case ACTION_NODE_EDIT_WITH_ALFRESCO: hasPermission = permission.canEdit(); break; case ACTION_NODE_UPDATE: diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/ConfigurationConstant.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/ConfigurationConstant.java index 52242ef5..5d6788c7 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/ConfigurationConstant.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/ConfigurationConstant.java @@ -115,6 +115,8 @@ public interface ConfigurationConstant String KEY_ACTION_NODE_EDIT = PREFIX_ACTION.concat(".node.edit"); + String KEY_ACTION_NODE_EDIT_WITH_ALFRESCO = PREFIX_ACTION.concat(".node.edit-with-alfresco"); + String KEY_ACTION_NODE_DOWNLOAD = PREFIX_ACTION.concat(".document.download"); String KEY_ACTION_NODE_SYNC = PREFIX_ACTION.concat(".node.sync"); diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java index ce04ca86..803f5a59 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java @@ -709,7 +709,7 @@ public void onClick(View v) { b.setVisibility(View.GONE); } - hideActionIfNecessary(b, ConfigurableActionHelper.ACTION_NODE_EDIT); + hideActionIfNecessary(b, ConfigurableActionHelper.ACTION_NODE_EDIT_WITH_ALFRESCO); } protected void displayTabs() From 7506425a7ab6246a98c689938da0ea150b2c342f Mon Sep 17 00:00:00 2001 From: jmpascal Date: Wed, 11 May 2016 10:21:59 +0200 Subject: [PATCH 17/25] ANDROID-321 --- .../src/main/res/layout/app_passcode_tab.xml | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/alfresco-mobile-android/src/main/res/layout/app_passcode_tab.xml b/alfresco-mobile-android/src/main/res/layout/app_passcode_tab.xml index de07cead..a8ce46d2 100644 --- a/alfresco-mobile-android/src/main/res/layout/app_passcode_tab.xml +++ b/alfresco-mobile-android/src/main/res/layout/app_passcode_tab.xml @@ -1,4 +1,22 @@ + + + + Date: Wed, 11 May 2016 12:40:52 +0200 Subject: [PATCH 18/25] ANDROID-294 --- .../application/activity/MainActivity.java | 6 ++- .../editors/text/TextEditorActivity.java | 2 + .../node/details/NodeDetailsFragment.java | 3 +- .../fragments/sync/SyncFragment.java | 4 +- .../intent/IntentAPIDispatcherActivity.java | 53 +++++++++++++------ .../StorageAccessDocumentsProvider.java | 3 +- .../widgets/ToolbarWidgetProvider.java | 16 ++---- .../node/create/CreateDocumentOperation.java | 2 +- .../async/node/sync/SyncNodeOperation.java | 2 +- .../platform/extensions/AnalyticsHelper.java | 8 +-- .../platform/extensions/AnalyticsManager.java | 28 +++++++++- .../android/sync/SyncContentManager.java | 14 ++++- .../android/sync/SyncContentSyncAdapter.java | 14 ++++- 13 files changed, 111 insertions(+), 44 deletions(-) diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/activity/MainActivity.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/activity/MainActivity.java index 7e182324..f9eac51d 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/activity/MainActivity.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/activity/MainActivity.java @@ -999,7 +999,8 @@ public void onAccountLoaded(LoadAccountCompletedEvent event) SyncContentManager.getInstance(this).setActivateSync(getCurrentAccount(), true); if (SyncContentManager.getInstance(this).canSync(getCurrentAccount())) { - SyncContentManager.getInstance(this).sync(getCurrentAccount()); + SyncContentManager.getInstance(this).sync(AnalyticsManager.LABEL_SYNC_SESSION_LOADED, getCurrentAccount()); + } FavoritesManager.getInstance(this).setActivateSync(getCurrentAccount(), true); @@ -1101,7 +1102,8 @@ else if (sessionState == SESSION_ERROR && getCurrentSession() == null) if (!isSyncActive(AlfrescoAccountManager.getInstance(context) .getAndroidAccount(getCurrentAccount().getId()), SyncContentProvider.AUTHORITY)) { - SyncContentManager.getInstance(context).sync(getCurrentAccount()); + SyncContentManager.getInstance(context).sync(AnalyticsManager.LABEL_SYNC_NETWORK, + getCurrentAccount()); } } diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/editors/text/TextEditorActivity.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/editors/text/TextEditorActivity.java index 5bd4a827..6fec1393 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/editors/text/TextEditorActivity.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/editors/text/TextEditorActivity.java @@ -149,6 +149,8 @@ public void onCreate(Bundle savedInstanceState) setTextShown(false); retrieveTitle(); + // Analytics + return; } diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java index 803f5a59..5c364995 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java @@ -1498,7 +1498,8 @@ else if (event.data) } else { - SyncContentManager.getInstance(getActivity()).sync(SessionUtils.getAccount(getActivity())); + SyncContentManager.getInstance(getActivity()).sync(AnalyticsManager.LABEL_SYNC_ACTION, + SessionUtils.getAccount(getActivity())); } } } diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/sync/SyncFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/sync/SyncFragment.java index adef81b9..a183de2c 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/sync/SyncFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/sync/SyncFragment.java @@ -248,7 +248,7 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) // Start sync if possible if (SyncContentManager.getInstance(getActivity()).canSync(acc)) { - SyncContentManager.getInstance(getActivity()).sync(acc); + SyncContentManager.getInstance(getActivity()).sync(AnalyticsManager.LABEL_SYNC_SAVE_BACK, acc); } } break; @@ -709,7 +709,7 @@ public void refresh() return; } - SyncContentManager.getInstance(getActivity()).sync(acc); + SyncContentManager.getInstance(getActivity()).sync(AnalyticsManager.LABEL_SYNC_REFRESH, acc); if (mi != null) { // Display spinning wheel instead of refresh diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/intent/IntentAPIDispatcherActivity.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/intent/IntentAPIDispatcherActivity.java index 608f0cf8..0a3f9573 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/intent/IntentAPIDispatcherActivity.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/intent/IntentAPIDispatcherActivity.java @@ -1,20 +1,20 @@ -/******************************************************************************* - * Copyright (C) 2005-2014 Alfresco Software Limited. - * - * This file is part of Alfresco Mobile for Android. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ******************************************************************************/ +/* + * Copyright (C) 2005-2016 Alfresco Software Limited. + * + * This file is part of Alfresco Mobile for Android. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.alfresco.mobile.android.application.intent; import java.io.File; @@ -37,6 +37,8 @@ import org.alfresco.mobile.android.platform.AlfrescoNotificationManager; import org.alfresco.mobile.android.platform.accounts.AlfrescoAccount; import org.alfresco.mobile.android.platform.accounts.AlfrescoAccountManager; +import org.alfresco.mobile.android.platform.extensions.AnalyticsHelper; +import org.alfresco.mobile.android.platform.extensions.AnalyticsManager; import org.alfresco.mobile.android.platform.intent.AlfrescoIntentAPI; import org.alfresco.mobile.android.platform.intent.PrivateIntent; import org.alfresco.mobile.android.platform.io.AlfrescoStorageManager; @@ -144,6 +146,10 @@ public void onCreate(Bundle savedInstanceState) mOutputFileUri = Uri.fromFile(payload); startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); + // Analytics + AnalyticsHelper.reportOperationEvent(this, AnalyticsManager.CATEGORY_WIDGET, + AnalyticsManager.ACTION_TOOLBAR, AnalyticsManager.LABEL_TAKE_PHOTO, 1, false); + return; } @@ -175,6 +181,19 @@ public void onCreate(Bundle savedInstanceState) intent.setType("text/plain"); startActivity(intent); finish(); + + // Analytics + if (isSpeechToText) + { + AnalyticsHelper.reportOperationEvent(this, AnalyticsManager.CATEGORY_WIDGET, + AnalyticsManager.ACTION_TOOLBAR, AnalyticsManager.LABEL_SPEECH_2_TEXT, 1, false); + } + else + { + AnalyticsHelper.reportOperationEvent(this, AnalyticsManager.CATEGORY_WIDGET, + AnalyticsManager.ACTION_TOOLBAR, AnalyticsManager.LABEL_CREATE_TEXT, 1, false); + } + return; } } diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/providers/storage/StorageAccessDocumentsProvider.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/providers/storage/StorageAccessDocumentsProvider.java index f60e8d2e..477048b1 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/providers/storage/StorageAccessDocumentsProvider.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/providers/storage/StorageAccessDocumentsProvider.java @@ -1781,7 +1781,8 @@ private void onCloseEvent() } else { - SyncContentManager.getInstance(getContext()).sync(SessionUtils.getAccount(getContext())); + SyncContentManager.getInstance(getContext()).sync(AnalyticsManager.LABEL_SYNC_DOC_PROVIDER, + SessionUtils.getAccount(getContext())); } return; } diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/widgets/ToolbarWidgetProvider.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/widgets/ToolbarWidgetProvider.java index 3333145c..cbd5d732 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/widgets/ToolbarWidgetProvider.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/widgets/ToolbarWidgetProvider.java @@ -92,36 +92,28 @@ public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] a private PendingIntent createAlfrescoIntent(Context context) { + // Analytics + AnalyticsHelper.reportOperationEvent(context, AnalyticsManager.CATEGORY_WIDGET, AnalyticsManager.ACTION_TOOLBAR, + AnalyticsManager.LABEL_ADD, 1, false); + Intent intent = new Intent(context, MainActivity.class); return PendingIntent.getActivity(context, 0, intent, 0); } private PendingIntent createSpeechTextEditorIntent(Context context) { - // Analytics - AnalyticsHelper.reportOperationEvent(context, AnalyticsManager.CATEGORY_WIDGET, AnalyticsManager.ACTION_TOOLBAR, - AnalyticsManager.LABEL_SPEECH_2_TEXT, 1, false); - return PendingIntent.getActivity(context, 1, PublicIntentAPIUtils.speechToTextIntent(), PendingIntent.FLAG_UPDATE_CURRENT); } private PendingIntent createTextEditorIntent(Context context) { - // Analytics - AnalyticsHelper.reportOperationEvent(context, AnalyticsManager.CATEGORY_WIDGET, AnalyticsManager.ACTION_TOOLBAR, - AnalyticsManager.LABEL_CREATE_TEXT, 1, false); - return PendingIntent.getActivity(context, 0, PublicIntentAPIUtils.createTextIntent(), PendingIntent.FLAG_UPDATE_CURRENT); } private PendingIntent createPhotoCaptureIntent(Context context) { - // Analytics - AnalyticsHelper.reportOperationEvent(context, AnalyticsManager.CATEGORY_WIDGET, AnalyticsManager.ACTION_TOOLBAR, - AnalyticsManager.LABEL_TAKE_PHOTO, 1, false); - return PendingIntent.getActivity(context, 2, PublicIntentAPIUtils.captureImageIntent(), PendingIntent.FLAG_UPDATE_CURRENT); } diff --git a/platform/foundation/src/main/java/org/alfresco/mobile/android/async/node/create/CreateDocumentOperation.java b/platform/foundation/src/main/java/org/alfresco/mobile/android/async/node/create/CreateDocumentOperation.java index 536b7630..2426794b 100644 --- a/platform/foundation/src/main/java/org/alfresco/mobile/android/async/node/create/CreateDocumentOperation.java +++ b/platform/foundation/src/main/java/org/alfresco/mobile/android/async/node/create/CreateDocumentOperation.java @@ -133,7 +133,7 @@ protected LoaderResult doInBackground() // Sync if necessary if (SyncContentManager.getInstance(context).isRootSynced(getAccount(), parentFolder)) { - SyncContentManager.getInstance(context).sync(getAccount()); + SyncContentManager.getInstance(context).sync(AnalyticsManager.LABEL_SYNC_ACTION, getAccount()); } } catch (Exception e) diff --git a/platform/foundation/src/main/java/org/alfresco/mobile/android/async/node/sync/SyncNodeOperation.java b/platform/foundation/src/main/java/org/alfresco/mobile/android/async/node/sync/SyncNodeOperation.java index c06c5c75..f14e58cb 100644 --- a/platform/foundation/src/main/java/org/alfresco/mobile/android/async/node/sync/SyncNodeOperation.java +++ b/platform/foundation/src/main/java/org/alfresco/mobile/android/async/node/sync/SyncNodeOperation.java @@ -339,7 +339,7 @@ protected void onPostExecute(LoaderResult result) { // Analytics AnalyticsHelper.reportOperationEvent(context, AnalyticsManager.CATEGORY_DOCUMENT_MANAGEMENT, - !markSync ? AnalyticsManager.ACTION_SYNC : AnalyticsManager.ACTION_UNSYNC, + markSync ? AnalyticsManager.ACTION_SYNC : AnalyticsManager.ACTION_UNSYNC, node.isDocument() ? ((Document) node).getContentStreamMimeType() : AnalyticsManager.TYPE_FOLDER, 1, result.hasException()); } diff --git a/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/extensions/AnalyticsHelper.java b/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/extensions/AnalyticsHelper.java index 51e26777..701b4c78 100644 --- a/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/extensions/AnalyticsHelper.java +++ b/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/extensions/AnalyticsHelper.java @@ -87,7 +87,7 @@ protected static SparseArray retrieveSyncInfo(Context context, AlfrescoAcc return customMetrics; } - public static void analyzeSync(Context context, AlfrescoAccount account) + public static void analyzeSync(Context context, AlfrescoAccount account, String analyticInfo) { if (AnalyticsManager.getInstance(context) == null || !AnalyticsManager.getInstance(context).isEnable()) { return; } @@ -109,10 +109,12 @@ public static void analyzeSync(Context context, AlfrescoAccount account) // Via EVENT AnalyticsManager.getInstance(context).reportEvent(AnalyticsManager.CATEGORY_SYNC, - AnalyticsManager.ACTION_RUN, AnalyticsManager.SYNCED_FILES, syncedFile, customDimensions, + analyticInfo, + AnalyticsManager.SYNCED_FILES, syncedFile, customDimensions, customMetrics); AnalyticsManager.getInstance(context).reportEvent(AnalyticsManager.CATEGORY_SYNC, - AnalyticsManager.ACTION_RUN, AnalyticsManager.SYNCED_FOLDERS, syncedFolder, customDimensions, null); + analyticInfo, + AnalyticsManager.SYNCED_FOLDERS, syncedFolder, customDimensions, null); } catch (Exception e) diff --git a/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/extensions/AnalyticsManager.java b/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/extensions/AnalyticsManager.java index 6a6edb2d..a98dde54 100644 --- a/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/extensions/AnalyticsManager.java +++ b/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/extensions/AnalyticsManager.java @@ -115,7 +115,7 @@ public abstract class AnalyticsManager extends Manager public static final String ACTION_SHARE = "Share"; - public static final String ACTION_SHARE_AS_LINK = "Share"; + public static final String ACTION_SHARE_AS_LINK = "Share Link"; public static final String ACTION_MEMBERSHIP = "Membership"; @@ -206,6 +206,32 @@ public abstract class AnalyticsManager extends Manager public static final String LABEL_STORAGE = "Storage"; + public static final String LABEL_ADD = "Add"; + + // Default + public static final String LABEL_SYNC_SYSTEM = "System"; + + // After network reconnection if there's pending sync + public static final String LABEL_SYNC_NETWORK = "Network"; + + // After session creation (start of the app) + public static final String LABEL_SYNC_SESSION_LOADED = "Session"; + + // After 60 min if the session is still active + public static final String LABEL_SYNC_CRON = "Cron"; + + // After a node has been synced + public static final String LABEL_SYNC_ACTION = "Sync Action"; + + // After a sync node has been edited + public static final String LABEL_SYNC_SAVE_BACK = "Save Back"; + + // Pull to refresh on sync screen + public static final String LABEL_SYNC_REFRESH = "Refresh"; + + // From the SAF + public static final String LABEL_SYNC_DOC_PROVIDER = "Doc Provider"; + /////////////////////////////////////////////////////////// // CUSTOM DIMENSIONS /////////////////////////////////////////////////////////// diff --git a/platform/foundation/src/main/java/org/alfresco/mobile/android/sync/SyncContentManager.java b/platform/foundation/src/main/java/org/alfresco/mobile/android/sync/SyncContentManager.java index 5eb40b7f..a37a742c 100644 --- a/platform/foundation/src/main/java/org/alfresco/mobile/android/sync/SyncContentManager.java +++ b/platform/foundation/src/main/java/org/alfresco/mobile/android/sync/SyncContentManager.java @@ -38,6 +38,7 @@ import org.alfresco.mobile.android.platform.Manager; import org.alfresco.mobile.android.platform.accounts.AlfrescoAccount; import org.alfresco.mobile.android.platform.accounts.AlfrescoAccountManager; +import org.alfresco.mobile.android.platform.extensions.AnalyticsManager; import org.alfresco.mobile.android.platform.io.AlfrescoStorageManager; import org.alfresco.mobile.android.platform.provider.CursorUtils; import org.alfresco.mobile.android.platform.provider.MapUtil; @@ -92,6 +93,8 @@ public class SyncContentManager extends Manager public static final String ARGUMENT_IGNORE_WARNING = "ignoreWarning"; + public static final String ARGUMENT_ANALYTIC = "analytic"; + public static final String ARGUMENT_NODE = "node"; public static final String ARGUMENT_NODE_ID = "nodeId"; @@ -269,11 +272,12 @@ public static Uri getUri(long id) return Uri.parse(SyncContentProvider.CONTENT_URI + "/" + id); } - public void sync(AlfrescoAccount account) + public void sync(String analyticInfo, AlfrescoAccount account) { if (account == null) { return; } Bundle settingsBundle = new Bundle(); settingsBundle.putInt(ARGUMENT_MODE, SyncContentManager.MODE_BOTH); + settingsBundle.putString(ARGUMENT_ANALYTIC, analyticInfo); settingsBundle.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true); settingsBundle.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true); settingsBundle.putBoolean(ARGUMENT_IGNORE_WARNING, false); @@ -281,10 +285,16 @@ public void sync(AlfrescoAccount account) SyncContentProvider.AUTHORITY, settingsBundle); } + public void sync(AlfrescoAccount account) + { + sync(AnalyticsManager.LABEL_SYNC_SYSTEM, account); + } + public void sync(AlfrescoAccount account, String nodeIdentifier) { if (account == null) { return; } Bundle settingsBundle = new Bundle(); + settingsBundle.putString(ARGUMENT_ANALYTIC, AnalyticsManager.LABEL_SYNC_ACTION); settingsBundle.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true); settingsBundle.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true); settingsBundle.putInt(ARGUMENT_MODE, SyncContentManager.MODE_NODE); @@ -493,7 +503,7 @@ public void cronSync(AlfrescoAccount account) long lastTime = sharedPref.getLong(LAST_SYNC_ACTIVATED_AT + account.getId(), now); if ((lastTime + 3600000) < now && canSync(account)) { - sync(account); + sync(AnalyticsManager.LABEL_SYNC_CRON, account); } } diff --git a/platform/foundation/src/main/java/org/alfresco/mobile/android/sync/SyncContentSyncAdapter.java b/platform/foundation/src/main/java/org/alfresco/mobile/android/sync/SyncContentSyncAdapter.java index 93b3a410..cd0bc19c 100644 --- a/platform/foundation/src/main/java/org/alfresco/mobile/android/sync/SyncContentSyncAdapter.java +++ b/platform/foundation/src/main/java/org/alfresco/mobile/android/sync/SyncContentSyncAdapter.java @@ -28,6 +28,7 @@ import org.alfresco.mobile.android.platform.SessionManager; import org.alfresco.mobile.android.platform.accounts.AlfrescoAccount; import org.alfresco.mobile.android.platform.extensions.AnalyticsHelper; +import org.alfresco.mobile.android.platform.extensions.AnalyticsManager; import org.alfresco.mobile.android.sync.operations.SyncContent; import org.alfresco.mobile.android.sync.prepare.PrepareSyncHelper; @@ -61,6 +62,8 @@ public class SyncContentSyncAdapter extends AbstractThreadedSyncAdapter private String nodeIdentifier; + private String analyticInfo; + // /////////////////////////////////////////////////////////////////////////// // CONSTRUCTOR // /////////////////////////////////////////////////////////////////////////// @@ -122,6 +125,15 @@ public void onPerformSync(Account account, Bundle extras, String authority, Cont { nodeIdentifier = null; } + + if (extras.containsKey(SyncContentManager.ARGUMENT_ANALYTIC)) + { + analyticInfo = extras.getString(SyncContentManager.ARGUMENT_ANALYTIC); + } + else + { + analyticInfo = AnalyticsManager.LABEL_SYNC_SYSTEM; + } } try @@ -237,7 +249,7 @@ protected void sync(SyncResult syncResult) if (node == null && nodeIdentifier == null) { - AnalyticsHelper.analyzeSync(getContext(), acc); + AnalyticsHelper.analyzeSync(getContext(), acc, analyticInfo); } Log.d("SYNC", "Total:" + syncResult.stats.numEntries); From a4664d17c117e3d279028285be14d919e56db91b Mon Sep 17 00:00:00 2001 From: jmpascal Date: Tue, 17 May 2016 16:28:49 +0200 Subject: [PATCH 19/25] ANDROID-306 --- .../fragments/node/details/NodeDetailsFragment.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java index 5c364995..3952d79e 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/NodeDetailsFragment.java @@ -688,7 +688,7 @@ public void onClick(View v) if (node.isDocument()) { - String mimetype = ((Document) node).getContentStreamMimeType(); + String mimetype = node.getPropertyValue(PropertyIds.CONTENT_STREAM_MIME_TYPE); if (!TextUtils.isEmpty(mimetype) && mimetype.startsWith(MimeType.TYPE_TEXT)) { b.setOnClickListener(new OnClickListener() @@ -1029,20 +1029,16 @@ public void onActivityNotFoundException(ActivityNotFoundException e) } else { - // Log.e(TAG, "[OBSERVER] CREATE"); - // observer = new SyncedFileObserver(syncFile.getPath(), - // getActivity().getApplicationContext(), node, acc); - // observer.startWatching(); - // If sync file + sync activate if (withAlfresco) { - ActionUtils.openIn(this, syncFile, + ActionUtils.openWithAlfrescoTextEditor(this, syncFile, MimeTypeManager.getInstance(getActivity()).getMIMEType(syncFile.getName()), RequestCode.SAVE_BACK); + } else { - ActionUtils.openWithAlfrescoTextEditor(this, syncFile, + ActionUtils.openIn(this, syncFile, MimeTypeManager.getInstance(getActivity()).getMIMEType(syncFile.getName()), RequestCode.SAVE_BACK); } From 7481fbd12ee7ee79a99d12bd52e0760af3d5ab36 Mon Sep 17 00:00:00 2001 From: jmpascal Date: Tue, 17 May 2016 17:13:56 +0200 Subject: [PATCH 20/25] ANDROID-324 --- .../fragments/preferences/AccountSettingsFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/preferences/AccountSettingsFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/preferences/AccountSettingsFragment.java index af821f0e..9fe24da0 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/preferences/AccountSettingsFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/preferences/AccountSettingsFragment.java @@ -242,7 +242,7 @@ else if (syncEnable) viewById(R.id.settings_sync_container).setVisibility(View.VISIBLE); syncFavoritesVH = HolderUtils.configure(viewById(R.id.favorite_sync_wifi), getString(R.string.settings_favorite_sync_data), - getString(R.string.settings_favorite_sync_data_all), !syncWifiEnable); + getString(R.string.settings_favorite_sync_data_all), syncWifiEnable); syncFavoritesVH.choose.setOnClickListener(new View.OnClickListener() { From b62aa9b877e110d0066520522a1c997aad953d9d Mon Sep 17 00:00:00 2001 From: jmpascal Date: Thu, 19 May 2016 11:44:17 +0200 Subject: [PATCH 21/25] ANDROID-328 --- .../application/configuration/features/ConfigFeatureHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/features/ConfigFeatureHelper.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/features/ConfigFeatureHelper.java index f695a46f..aac891d2 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/features/ConfigFeatureHelper.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/configuration/features/ConfigFeatureHelper.java @@ -66,11 +66,11 @@ else if (FeatureConfig.FEATURE_DATA_PROTECTION.equals(feature.getType())) } } - new PasscodeConfigFeature(activity).check(session, acc, passcodeFeature); new SyncCellularConfigFeature(activity).check(session, acc, cellularFeature); if (OnPremiseConstant.ALFRESCO_EDITION_ENTERPRISE.equals(session.getRepositoryInfo().getEdition())) { + new PasscodeConfigFeature(activity).check(session, acc, passcodeFeature); new DataProtectionConfigFeature(activity).check(session, acc, dataProtectionFeature); } } From 207add2e0ab963f1b1d2be15e7d2d8a1bf358c32 Mon Sep 17 00:00:00 2001 From: jmpascal Date: Fri, 20 May 2016 15:20:01 +0200 Subject: [PATCH 22/25] ANDROID-312 --- .../src/main/AndroidManifest.xml | 19 ++ .../application/activity/MainActivity.java | 34 +--- .../activity/PublicDispatcherActivity.java | 167 +++++++++++++++++- .../fragments/account/AccountsFragment.java | 146 +++++++++++++++ .../DocumentFolderBrowserFragment.java | 21 ++- .../details/PagerNodeDetailsFragment.java | 17 +- .../fragments/user/UserProfileFragment.java | 16 +- .../workflow/task/TasksFragment.java | 10 +- .../intent/PublicIntentAPIUtils.java | 100 ++++++++++- .../src/main/res/layout/fr_accounts.xml | 61 +++++++ .../src/main/res/values/strings.xml | 12 ++ .../node/browse/NodeChildrenOperation.java | 3 + .../android/async/person/PersonOperation.java | 26 +-- .../platform/extensions/AnalyticsManager.java | 4 + .../platform/intent/AlfrescoIntentAPI.java | 28 +++ .../ui/fragments/CommonGridFragment.java | 5 +- .../task/TasksFoundationFragment.java | 41 +++-- 17 files changed, 626 insertions(+), 84 deletions(-) create mode 100644 alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/account/AccountsFragment.java create mode 100644 alfresco-mobile-android/src/main/res/layout/fr_accounts.xml diff --git a/alfresco-mobile-android/src/main/AndroidManifest.xml b/alfresco-mobile-android/src/main/AndroidManifest.xml index fe7737fd..08f75b64 100644 --- a/alfresco-mobile-android/src/main/AndroidManifest.xml +++ b/alfresco-mobile-android/src/main/AndroidManifest.xml @@ -119,6 +119,15 @@ + + + @@ -214,6 +223,16 @@ + + + + + + + + + + diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/activity/MainActivity.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/activity/MainActivity.java index f9eac51d..314fe3f0 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/activity/MainActivity.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/activity/MainActivity.java @@ -36,15 +36,14 @@ import org.alfresco.mobile.android.application.fragments.about.AboutFragment; import org.alfresco.mobile.android.application.fragments.builder.AlfrescoFragmentBuilder; import org.alfresco.mobile.android.application.fragments.builder.FragmentBuilderFactory; -import org.alfresco.mobile.android.application.fragments.fileexplorer.FileExplorerFragment; import org.alfresco.mobile.android.application.fragments.help.HelpDialogFragment; import org.alfresco.mobile.android.application.fragments.menu.MainMenuFragment; import org.alfresco.mobile.android.application.fragments.node.browser.DocumentFolderBrowserFragment; -import org.alfresco.mobile.android.application.fragments.node.details.NodeDetailsFragment; import org.alfresco.mobile.android.application.fragments.preferences.GeneralPreferences; import org.alfresco.mobile.android.application.fragments.signin.AccountOAuthFragment; import org.alfresco.mobile.android.application.fragments.sync.SyncFragment; import org.alfresco.mobile.android.application.fragments.sync.SyncMigrationFragment; +import org.alfresco.mobile.android.application.intent.PublicIntentAPIUtils; import org.alfresco.mobile.android.application.intent.RequestCode; import org.alfresco.mobile.android.application.managers.ConfigManager; import org.alfresco.mobile.android.application.managers.RenditionManagerImpl; @@ -72,7 +71,6 @@ import org.alfresco.mobile.android.platform.accounts.AlfrescoAccountManager; import org.alfresco.mobile.android.platform.extensions.AnalyticsManager; import org.alfresco.mobile.android.platform.favorite.FavoritesManager; -import org.alfresco.mobile.android.platform.intent.AlfrescoIntentAPI; import org.alfresco.mobile.android.platform.intent.PrivateIntent; import org.alfresco.mobile.android.platform.mdm.MDMManager; import org.alfresco.mobile.android.platform.security.DataProtectionManager; @@ -84,6 +82,9 @@ import org.alfresco.mobile.android.ui.node.browse.NodeBrowserTemplate; import org.alfresco.mobile.android.ui.utils.UIUtils; +import com.afollestad.materialdialogs.MaterialDialog; +import com.squareup.otto.Subscribe; + import android.accounts.Account; import android.annotation.TargetApi; import android.content.BroadcastReceiver; @@ -111,9 +112,6 @@ import android.view.View; import android.view.ViewGroup; -import com.afollestad.materialdialogs.MaterialDialog; -import com.squareup.otto.Subscribe; - /** * Main activity of the application. * @@ -310,7 +308,7 @@ public void onResume() } // Is it from an alfresco shortcut ? - openShortcut(getIntent()); + PublicIntentAPIUtils.openShortcut(this, getIntent()); } @Override @@ -427,7 +425,7 @@ protected void onNewIntent(Intent intent) } // Is it from an alfresco shortcut ? - openShortcut(intent); + PublicIntentAPIUtils.openShortcut(this, intent); } catch (Exception e) { @@ -443,26 +441,6 @@ protected void onSaveInstanceState(Bundle outState) MainActivityHelper.createBundle(outState, getCurrentAccount(), capture, fragmentQueue, importParent)); } - public void openShortcut(Intent intent) - { - if (AlfrescoIntentAPI.ACTION_VIEW.equals(intent.getAction()) && intent.getData() != null) - { - if (AlfrescoIntentAPI.AUTHORITY_FOLDER.equals(intent.getData().getAuthority())) - { - DocumentFolderBrowserFragment.with(this).folderIdentifier(intent.getData().getPathSegments().get(0)) - .shortcut(true).display(); - } - else if (AlfrescoIntentAPI.AUTHORITY_FILE.equals(intent.getData().getAuthority())) - { - FileExplorerFragment.with(this).file(new File(intent.getData().getPathSegments().get(0))).display(); - } - else if (AlfrescoIntentAPI.AUTHORITY_DOCUMENT.equals(intent.getData().getAuthority())) - { - NodeDetailsFragment.with(this).nodeId(intent.getData().getPathSegments().get(0)).back(false).display(); - } - } - } - // /////////////////////////////////////////////////////////////////////////// // SLIDE MENU // /////////////////////////////////////////////////////////////////////////// diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/activity/PublicDispatcherActivity.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/activity/PublicDispatcherActivity.java index 8793b9f5..c2957a8a 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/activity/PublicDispatcherActivity.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/activity/PublicDispatcherActivity.java @@ -20,9 +20,11 @@ import java.io.File; import java.util.List; +import org.alfresco.mobile.android.api.utils.NodeRefUtils; import org.alfresco.mobile.android.application.R; import org.alfresco.mobile.android.application.configuration.ConfigurationConstant; import org.alfresco.mobile.android.application.fragments.FragmentDisplayer; +import org.alfresco.mobile.android.application.fragments.account.AccountsFragment; import org.alfresco.mobile.android.application.fragments.builder.AlfrescoFragmentBuilder; import org.alfresco.mobile.android.application.fragments.builder.FragmentBuilderFactory; import org.alfresco.mobile.android.application.fragments.fileexplorer.FileExplorerFragment; @@ -32,23 +34,29 @@ import org.alfresco.mobile.android.application.fragments.preferences.PasscodePreferences; import org.alfresco.mobile.android.application.fragments.signin.AccountOAuthFragment; import org.alfresco.mobile.android.application.fragments.sync.SyncFragment; +import org.alfresco.mobile.android.application.intent.PublicIntentAPIUtils; +import org.alfresco.mobile.android.application.managers.NotificationManager; import org.alfresco.mobile.android.application.security.PassCodeActivity; import org.alfresco.mobile.android.async.node.favorite.FavoriteNodesRequest; import org.alfresco.mobile.android.async.session.LoadSessionCallBack.LoadAccountCompletedEvent; import org.alfresco.mobile.android.async.session.RequestSessionEvent; +import org.alfresco.mobile.android.platform.accounts.AlfrescoAccount; +import org.alfresco.mobile.android.platform.accounts.AlfrescoAccountManager; +import org.alfresco.mobile.android.platform.intent.AlfrescoIntentAPI; import org.alfresco.mobile.android.platform.intent.PrivateIntent; import org.alfresco.mobile.android.ui.ListingModeFragment; +import com.squareup.otto.Subscribe; + import android.content.Intent; import android.os.Bundle; import android.support.v4.app.FragmentManager; import android.support.v7.widget.Toolbar; +import android.text.TextUtils; import android.view.Menu; import android.view.MenuItem; import android.view.View; -import com.squareup.otto.Subscribe; - /** * Activity responsible to manage public intent from 3rd party application. This * activity is "open" to public Intent. @@ -90,7 +98,15 @@ public void onCreate(Bundle savedInstanceState) if ((Intent.ACTION_SEND.equals(action) || Intent.ACTION_SEND_MULTIPLE.equals(action)) && getFragment(UploadFormFragment.TAG) == null) { - FragmentDisplayer.with(this).load(new UploadFormFragment()).back(false).animate(null).into(FragmentDisplayer.PANEL_LEFT); + FragmentDisplayer.with(this).load(new UploadFormFragment()).back(false).animate(null) + .into(FragmentDisplayer.PANEL_LEFT); + return; + } + + if (Intent.ACTION_VIEW.equals(action) + && AlfrescoIntentAPI.SCHEME.equals(getIntent().getData().getScheme().toLowerCase())) + { + managePublicIntent(null); return; } @@ -144,6 +160,151 @@ protected void onStop() super.onStop(); } + private boolean validateIntentId() + { + List pathSegments = getIntent().getData().getPathSegments(); + if (pathSegments == null || pathSegments.isEmpty()) + { + NotificationManager.getInstance(this).showLongToast(R.string.public_url_wrong_format); + finish(); + return false; + } + + if (!AlfrescoIntentAPI.ID.equals(pathSegments.get(0))) + { + NotificationManager.getInstance(this).showLongToast(R.string.public_url_file_missing_id); + finish(); + return false; + } + + return true; + } + + private boolean validateIntentFilter() + { + List pathSegments = getIntent().getData().getPathSegments(); + if (pathSegments == null || pathSegments.isEmpty()) + { + NotificationManager.getInstance(this).showLongToast(R.string.public_url_wrong_format); + finish(); + return false; + } + + if (!AlfrescoIntentAPI.FILTER.equals(pathSegments.get(0))) + { + NotificationManager.getInstance(this).showLongToast(R.string.public_url_tasks_missing_filter); + finish(); + return false; + } + + return true; + } + + private String retrieveNodeRef() + { + String nodeRefIntent = getIntent().getData().getLastPathSegment(); + if (NodeRefUtils.isIdentifier(nodeRefIntent)) + { + return NodeRefUtils.createNodeRefByIdentifier(getIntent().getData().getLastPathSegment()); + } + else if (NodeRefUtils.isNodeRef(nodeRefIntent)) + { + return nodeRefIntent; + } + else + { + NotificationManager.getInstance(this).showLongToast(R.string.public_url_noderef_format); + finish(); + return null; + } + } + + public void managePublicIntent(AlfrescoAccount accountSelected) + { + if (Intent.ACTION_VIEW.equals(getIntent().getAction()) + && AlfrescoIntentAPI.SCHEME.equals(getIntent().getData().getScheme().toLowerCase())) + { + Intent i = null; + try + { + // Check Hostname + // If no Hostname we just open the App + String hostname = getIntent().getData().getHost(); + if (TextUtils.isEmpty(hostname)) + { + i = new Intent(this, MainActivity.class); + startActivity(i); + finish(); + return; + } + + // If multiple account we have to request the user to select one + if (AlfrescoAccountManager.getInstance(this).hasMultipleAccount() && accountSelected == null) + { + + FragmentDisplayer.with(this).animate(null).load(AccountsFragment.with(this).createFragment()) + .back(false).into(FragmentDisplayer.PANEL_LEFT); + return; + } + + // Check URL Pattern + // We support only ids for the moment + // alfresco://document/id/ + AlfrescoAccount acc = accountSelected != null ? accountSelected : getCurrentAccount(); + if (acc == null) + { + acc = AlfrescoAccountManager.getInstance(this).getDefaultAccount(); + } + + if (AlfrescoIntentAPI.AUTHORITY_DOCUMENT.equals(hostname)) + { + // Check Id + if (!validateIntentId()) { return; } + if (retrieveNodeRef() == null) { return; } + + i = PublicIntentAPIUtils.viewDocument(acc.getId(), retrieveNodeRef()); + } + else if (AlfrescoIntentAPI.AUTHORITY_FOLDER.equals(hostname)) + { + // Check Id + if (!validateIntentId()) { return; } + if (retrieveNodeRef() == null) { return; } + + i = PublicIntentAPIUtils.viewFolder(acc.getId(), retrieveNodeRef()); + } + else if (AlfrescoIntentAPI.AUTHORITY_SITE.equals(hostname)) + { + // Check Id + if (!validateIntentId()) { return; } + i = PublicIntentAPIUtils.viewSite(acc.getId(), getIntent().getData().getLastPathSegment()); + } + else if (AlfrescoIntentAPI.AUTHORITY_USER.equals(hostname)) + { + // Check Id + if (!validateIntentId()) { return; } + i = PublicIntentAPIUtils.viewUser(acc.getId(), getIntent().getData().getLastPathSegment()); + } + else if (AlfrescoIntentAPI.AUTHORITY_TASKS.equals(hostname)) + { + if (!validateIntentFilter()) { return; } + i = PublicIntentAPIUtils.viewTasks(acc.getId(), getIntent().getData()); + } + else + { + i = new Intent(this, MainActivity.class); + } + } + catch (Exception e) + { + i = new Intent(this, MainActivity.class); + } + + startActivity(i); + finish(); + return; + } + } + // /////////////////////////////////////////////////////////////////////////// // UI Public Method // /////////////////////////////////////////////////////////////////////////// diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/account/AccountsFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/account/AccountsFragment.java new file mode 100644 index 00000000..a723d4ca --- /dev/null +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/account/AccountsFragment.java @@ -0,0 +1,146 @@ +/* + * Copyright (C) 2005-2016 Alfresco Software Limited. + * + * This file is part of Alfresco Mobile for Android. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.alfresco.mobile.android.application.fragments.account; + +import java.util.List; +import java.util.Map; + +import org.alfresco.mobile.android.application.R; +import org.alfresco.mobile.android.application.activity.PublicDispatcherActivity; +import org.alfresco.mobile.android.application.fragments.builder.LeafFragmentBuilder; +import org.alfresco.mobile.android.platform.accounts.AlfrescoAccount; +import org.alfresco.mobile.android.platform.accounts.AlfrescoAccountManager; +import org.alfresco.mobile.android.platform.extensions.AnalyticsManager; +import org.alfresco.mobile.android.ui.fragments.AlfrescoFragment; +import org.alfresco.mobile.android.ui.holder.HolderUtils; +import org.alfresco.mobile.android.ui.holder.TwoLinesViewHolder; + +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentActivity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; + +public class AccountsFragment extends AlfrescoFragment +{ + public static final String TAG = AccountsFragment.class.getName(); + + // ////////////////////////////////////////////////////////////////////// + // CONSTRUCTORS + // ////////////////////////////////////////////////////////////////////// + public AccountsFragment() + { + requiredSession = false; + checkSession = false; + eventBusRequired = false; + screenName = AnalyticsManager.SCREEN_ACCOUNTS_LISTING; + } + + protected static AccountsFragment newInstanceByTemplate(Bundle b) + { + AccountsFragment cbf = new AccountsFragment(); + cbf.setArguments(b); + return cbf; + } + + // ////////////////////////////////////////////////////////////////////// + // LIFE CYCLE + // ////////////////////////////////////////////////////////////////////// + @Override + public String onPrepareTitle() + { + return getString(R.string.accounts_title_select); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) + { + setRootView(inflater.inflate(R.layout.fr_accounts, container, false)); + + // Accounts + List accounts = AlfrescoAccountManager.retrieveAccounts(getActivity()); + View accountView; + LinearLayout accountContainer = (LinearLayout) viewById(R.id.settings_accounts_container); + accountContainer.removeAllViews(); + TwoLinesViewHolder vh; + for (AlfrescoAccount account : accounts) + { + accountView = LayoutInflater.from(getActivity()).inflate(R.layout.row_two_lines_borderless_rounded, + accountContainer, false); + accountView.setTag(account.getId()); + vh = HolderUtils.configure(accountView, account.getUsername(), account.getTitle(), + R.drawable.ic_account_circle_grey); + AccountsAdapter.displayAvatar(getActivity(), account, R.drawable.ic_account_light, vh.icon); + + vh.choose.setVisibility(View.GONE); + + accountView.setOnClickListener(new View.OnClickListener() + { + @Override + public void onClick(View v) + { + if (getActivity() instanceof PublicDispatcherActivity) + { + AlfrescoAccount selectedAccount = AlfrescoAccountManager.getInstance(getActivity()) + .retrieveAccount((Long) v.getTag()); + ((PublicDispatcherActivity) getActivity()).managePublicIntent(selectedAccount); + } + } + }); + accountContainer.addView(accountView); + } + + return getRootView(); + } + + // /////////////////////////////////////////////////////////////////////////// + // BUILDER + // /////////////////////////////////////////////////////////////////////////// + public static Builder with(FragmentActivity activity) + { + return new Builder(activity); + } + + public static class Builder extends LeafFragmentBuilder + { + // /////////////////////////////////////////////////////////////////////////// + // CONSTRUCTORS + // /////////////////////////////////////////////////////////////////////////// + public Builder(FragmentActivity activity) + { + super(activity); + this.extraConfiguration = new Bundle(); + } + + public Builder(FragmentActivity appActivity, Map configuration) + { + super(appActivity, configuration); + } + + // /////////////////////////////////////////////////////////////////////////// + // SETTERS + // /////////////////////////////////////////////////////////////////////////// + protected Fragment createFragment(Bundle b) + { + return newInstanceByTemplate(b); + } + } + +} diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/browser/DocumentFolderBrowserFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/browser/DocumentFolderBrowserFragment.java index 38bb33a7..bdf5096a 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/browser/DocumentFolderBrowserFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/browser/DocumentFolderBrowserFragment.java @@ -97,8 +97,12 @@ import org.alfresco.mobile.android.ui.node.browse.NodeBrowserTemplate; import org.alfresco.mobile.android.ui.operation.OperationWaitingDialogFragment; import org.apache.chemistry.opencmis.commons.PropertyIds; +import org.apache.chemistry.opencmis.commons.exceptions.CmisObjectNotFoundException; import org.apache.chemistry.opencmis.commons.impl.JSONConverter; +import com.cocosw.bottomsheet.BottomSheet; +import com.squareup.otto.Subscribe; + import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; @@ -122,9 +126,6 @@ import android.widget.SpinnerAdapter; import android.widget.TextView; -import com.cocosw.bottomsheet.BottomSheet; -import com.squareup.otto.Subscribe; - /** * Display a dialogFragment to retrieve information about the content of a * specific folder. @@ -772,7 +773,19 @@ public void onResult(NodeChildrenEvent event) { ev.setVisibility(View.VISIBLE); } - onResultError(event.exception); + + if (event.exception != null && event.exception.getCause() instanceof CmisObjectNotFoundException) + { + displayEmptyView(); + if (viewById(R.id.empty_text) != null) + { + ((TextView) viewById(R.id.empty_text)).setText(R.string.node_browser_folder_not_found); + } + } + else + { + onResultError(event.exception); + } } else { diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/PagerNodeDetailsFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/PagerNodeDetailsFragment.java index 59466718..5aa504dc 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/PagerNodeDetailsFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/node/details/PagerNodeDetailsFragment.java @@ -43,6 +43,9 @@ import org.alfresco.mobile.android.platform.extensions.AnalyticsManager; import org.alfresco.mobile.android.sync.utils.NodeSyncPlaceHolder; +import com.astuetz.PagerSlidingTabStrip; +import com.squareup.otto.Subscribe; + import android.annotation.TargetApi; import android.content.Intent; import android.os.Build; @@ -55,9 +58,6 @@ import android.util.Log; import android.widget.TextView; -import com.astuetz.PagerSlidingTabStrip; -import com.squareup.otto.Subscribe; - /** * Responsible to display details of a specific Node. * @@ -231,9 +231,16 @@ public void onResult(RetrieveNodeEvent event) { show(R.id.pager_empty); displayEmptyView(); - if (((TextView) viewById(R.id.empty_text)) != null) + if (viewById(R.id.empty_text) != null) { - ((TextView) viewById(R.id.empty_text)).setText(R.string.empty_child); + if (event.exception != null && event.exception instanceof NullPointerException) + { + ((TextView) viewById(R.id.empty_text)).setText(R.string.node_details_file_not_found); + } + else + { + ((TextView) viewById(R.id.empty_text)).setText(R.string.empty_child); + } } } else diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/user/UserProfileFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/user/UserProfileFragment.java index ab7504b9..768cb2e0 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/user/UserProfileFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/user/UserProfileFragment.java @@ -19,6 +19,7 @@ import java.util.Map; +import org.alfresco.mobile.android.api.exceptions.AlfrescoServiceException; import org.alfresco.mobile.android.api.model.Company; import org.alfresco.mobile.android.api.model.Person; import org.alfresco.mobile.android.api.session.AlfrescoSession; @@ -41,6 +42,8 @@ import org.alfresco.mobile.android.ui.rendition.RenditionManager; import org.alfresco.mobile.android.ui.utils.UIUtils; +import com.squareup.otto.Subscribe; + import android.content.ActivityNotFoundException; import android.content.ComponentName; import android.content.Context; @@ -64,8 +67,6 @@ import android.widget.PopupMenu.OnMenuItemClickListener; import android.widget.TextView; -import com.squareup.otto.Subscribe; - /** * @since 1.3 * @author jm.pascal @@ -203,8 +204,15 @@ public void onResult(PersonEvent event) { hide(R.id.progressbar); show(R.id.empty); - ((TextView) viewById(R.id.empty_text)).setText(R.string.empty_child); - CloudExceptionUtils.handleCloudException(getActivity(), event.exception, false); + if (event.exception instanceof AlfrescoServiceException + && event.exception.getMessage().contains("not found")) + { + ((TextView) viewById(R.id.empty_text)).setText(R.string.empty_users); + } + else + { + CloudExceptionUtils.handleCloudException(getActivity(), event.exception, false); + } } else { diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/workflow/task/TasksFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/workflow/task/TasksFragment.java index ca90d2f9..dcb1e7d4 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/workflow/task/TasksFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/workflow/task/TasksFragment.java @@ -43,6 +43,8 @@ import org.alfresco.mobile.android.ui.workflow.task.TasksFoundationAdapter; import org.alfresco.mobile.android.ui.workflow.task.TasksFoundationFragment; +import com.squareup.otto.Subscribe; + import android.content.Context; import android.content.Intent; import android.os.Bundle; @@ -57,8 +59,6 @@ import android.widget.ImageView; import android.widget.TextView; -import com.squareup.otto.Subscribe; - public class TasksFragment extends TasksFoundationFragment { private static final String ARGUMENT_MENU_ID = "menuId"; @@ -292,6 +292,12 @@ protected void retrieveCustomArgument(Map properties, Bundle b) TasksFoundationFragment.addFilter(properties, b); } + public Builder retrieveFilter(Intent intent) + { + TasksFoundationFragment.addFilter(intent, extraConfiguration); + return this; + } + // /////////////////////////////////////////////////////////////////////////// // SETTERS // /////////////////////////////////////////////////////////////////////////// diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/intent/PublicIntentAPIUtils.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/intent/PublicIntentAPIUtils.java index e0c00d67..3af5d704 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/intent/PublicIntentAPIUtils.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/intent/PublicIntentAPIUtils.java @@ -1,14 +1,38 @@ +/* + * Copyright (C) 2005-2016 Alfresco Software Limited. + * + * This file is part of Alfresco Mobile for Android. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.alfresco.mobile.android.application.intent; import java.io.File; import java.util.ArrayList; import java.util.List; +import org.alfresco.mobile.android.application.fragments.fileexplorer.FileExplorerFragment; +import org.alfresco.mobile.android.application.fragments.node.browser.DocumentFolderBrowserFragment; +import org.alfresco.mobile.android.application.fragments.node.details.NodeDetailsFragment; +import org.alfresco.mobile.android.application.fragments.user.UserProfileFragment; +import org.alfresco.mobile.android.application.fragments.workflow.task.TasksFragment; import org.alfresco.mobile.android.platform.intent.AlfrescoIntentAPI; import org.alfresco.mobile.android.platform.intent.PrivateIntent; import android.content.Intent; import android.net.Uri; +import android.support.v4.app.FragmentActivity; public class PublicIntentAPIUtils { @@ -63,25 +87,85 @@ private static Intent uploadFilesIntent(ArrayList filePaths, long accoun // /////////////////////////////////////////////////////////////////////////// public static Intent viewFolder(long accountId, String folderId) { - Uri.Builder b = new Uri.Builder().scheme(AlfrescoIntentAPI.SCHEME) - .authority(AlfrescoIntentAPI.AUTHORITY_FOLDER).appendPath(folderId); - return new Intent(AlfrescoIntentAPI.ACTION_VIEW).setData(b.build()).putExtra( - AlfrescoIntentAPI.EXTRA_ACCOUNT_ID, accountId); + Uri.Builder b = new Uri.Builder().scheme(AlfrescoIntentAPI.SCHEME).authority(AlfrescoIntentAPI.AUTHORITY_FOLDER) + .appendPath(folderId); + return new Intent(AlfrescoIntentAPI.ACTION_VIEW).setData(b.build()).putExtra(AlfrescoIntentAPI.EXTRA_ACCOUNT_ID, + accountId); } public static Intent viewDocument(long accountId, String documentId) { Uri.Builder b = new Uri.Builder().scheme(AlfrescoIntentAPI.SCHEME) .authority(AlfrescoIntentAPI.AUTHORITY_DOCUMENT).appendPath(documentId); - return new Intent(AlfrescoIntentAPI.ACTION_VIEW).setData(b.build()).putExtra( - AlfrescoIntentAPI.EXTRA_ACCOUNT_ID, accountId); + return new Intent(AlfrescoIntentAPI.ACTION_VIEW).setData(b.build()).putExtra(AlfrescoIntentAPI.EXTRA_ACCOUNT_ID, + accountId); + } + + public static Intent viewSite(long accountId, String siteShortName) + { + Uri.Builder b = new Uri.Builder().scheme(AlfrescoIntentAPI.SCHEME).authority(AlfrescoIntentAPI.AUTHORITY_SITE) + .appendPath(siteShortName); + return new Intent(AlfrescoIntentAPI.ACTION_VIEW).setData(b.build()).putExtra(AlfrescoIntentAPI.EXTRA_ACCOUNT_ID, + accountId); } public static Intent viewFile(long accountId, File file) { Uri.Builder b = new Uri.Builder().scheme(AlfrescoIntentAPI.SCHEME).authority(AlfrescoIntentAPI.AUTHORITY_FILE) .appendPath(file.getPath()); - return new Intent(AlfrescoIntentAPI.ACTION_VIEW).setData(b.build()).putExtra( - AlfrescoIntentAPI.EXTRA_ACCOUNT_ID, accountId); + return new Intent(AlfrescoIntentAPI.ACTION_VIEW).setData(b.build()).putExtra(AlfrescoIntentAPI.EXTRA_ACCOUNT_ID, + accountId); + } + + public static Intent viewUser(long accountId, String userId) + { + Uri.Builder b = new Uri.Builder().scheme(AlfrescoIntentAPI.SCHEME).authority(AlfrescoIntentAPI.AUTHORITY_USER) + .appendPath(userId); + return new Intent(AlfrescoIntentAPI.ACTION_VIEW).setData(b.build()).putExtra(AlfrescoIntentAPI.EXTRA_ACCOUNT_ID, + accountId); + } + + public static Intent viewTasks(long accountId, Uri data) + { + return new Intent(AlfrescoIntentAPI.ACTION_VIEW).setData(data).putExtra(AlfrescoIntentAPI.EXTRA_ACCOUNT_ID, + accountId); + } + + // /////////////////////////////////////////////////////////////////////////// + // DISPATCH VIEW + // /////////////////////////////////////////////////////////////////////////// + public static void openShortcut(FragmentActivity context, Intent intent) + { + if (AlfrescoIntentAPI.ACTION_VIEW.equals(intent.getAction()) && intent.getData() != null) + { + if (AlfrescoIntentAPI.AUTHORITY_FOLDER.equals(intent.getData().getAuthority())) + { + DocumentFolderBrowserFragment.with(context).folderIdentifier(intent.getData().getPathSegments().get(0)) + .shortcut(true).display(); + } + else if (AlfrescoIntentAPI.AUTHORITY_FILE.equals(intent.getData().getAuthority())) + { + FileExplorerFragment.with(context).file(new File(intent.getData().getPathSegments().get(0))).display(); + } + else if (AlfrescoIntentAPI.AUTHORITY_DOCUMENT.equals(intent.getData().getAuthority())) + { + NodeDetailsFragment.with(context).nodeId(intent.getData().getPathSegments().get(0)).back(true) + .display(); + } + else if (AlfrescoIntentAPI.AUTHORITY_SITE.equals(intent.getData().getAuthority())) + { + DocumentFolderBrowserFragment.with(context).siteShortName(intent.getData().getPathSegments().get(0)) + .back(true).display(); + } + else if (AlfrescoIntentAPI.AUTHORITY_USER.equals(intent.getData().getAuthority())) + { + UserProfileFragment.with(context).personId(intent.getData().getPathSegments().get(0)).back(true) + .display(); + } + else if (AlfrescoIntentAPI.AUTHORITY_TASKS.equals(intent.getData().getAuthority())) + { + TasksFragment.with(context).retrieveFilter(intent).back(true).display(); + } + } } } diff --git a/alfresco-mobile-android/src/main/res/layout/fr_accounts.xml b/alfresco-mobile-android/src/main/res/layout/fr_accounts.xml new file mode 100644 index 00000000..9918917b --- /dev/null +++ b/alfresco-mobile-android/src/main/res/layout/fr_accounts.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/alfresco-mobile-android/src/main/res/values/strings.xml b/alfresco-mobile-android/src/main/res/values/strings.xml index f6304ff1..0ac5ac3e 100644 --- a/alfresco-mobile-android/src/main/res/values/strings.xml +++ b/alfresco-mobile-android/src/main/res/values/strings.xml @@ -834,6 +834,18 @@ No comments found No files found Sign in + No file found + No folder found + No user found + We didn\'t recognize this link. Try contacting your Alfresco administrator + Filter information is missing. Try contacting your Alfresco administrator + Id information is missing. Try contacting your Alfresco administrator + NodeRef information seems wrong. Try contacting your Alfresco administrator + + + + Select an account + No accounts found. Try adding one. diff --git a/platform/foundation/src/main/java/org/alfresco/mobile/android/async/node/browse/NodeChildrenOperation.java b/platform/foundation/src/main/java/org/alfresco/mobile/android/async/node/browse/NodeChildrenOperation.java index 47ab584d..482a591a 100644 --- a/platform/foundation/src/main/java/org/alfresco/mobile/android/async/node/browse/NodeChildrenOperation.java +++ b/platform/foundation/src/main/java/org/alfresco/mobile/android/async/node/browse/NodeChildrenOperation.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.Map; +import org.alfresco.mobile.android.api.exceptions.AlfrescoException; import org.alfresco.mobile.android.api.exceptions.AlfrescoServiceException; import org.alfresco.mobile.android.api.model.Folder; import org.alfresco.mobile.android.api.model.Node; @@ -40,6 +41,7 @@ import org.alfresco.mobile.android.async.utils.ISO9075; import org.alfresco.mobile.android.platform.EventBusManager; import org.apache.chemistry.opencmis.client.bindings.spi.http.Response; +import org.apache.chemistry.opencmis.commons.exceptions.CmisObjectNotFoundException; import org.apache.chemistry.opencmis.commons.impl.JSONConverter; import org.apache.chemistry.opencmis.commons.impl.UrlBuilder; @@ -100,6 +102,7 @@ protected LoaderResult> doInBackground() if (siteId != null && site == null) { site = session.getServiceRegistry().getSiteService().getSite(siteId); + if (site == null) { throw new AlfrescoServiceException(AlfrescoException.DOCFOLDER_GENERIC, new CmisObjectNotFoundException()); } } if (site != null) { diff --git a/platform/foundation/src/main/java/org/alfresco/mobile/android/async/person/PersonOperation.java b/platform/foundation/src/main/java/org/alfresco/mobile/android/async/person/PersonOperation.java index 5f257e8d..f3a7501c 100644 --- a/platform/foundation/src/main/java/org/alfresco/mobile/android/async/person/PersonOperation.java +++ b/platform/foundation/src/main/java/org/alfresco/mobile/android/async/person/PersonOperation.java @@ -1,20 +1,20 @@ -/******************************************************************************* - * Copyright (C) 2005-2014 Alfresco Software Limited. +/* + * Copyright (C) 2005-2016 Alfresco Software Limited. * - * This file is part of Alfresco Mobile for Android. + * This file is part of Alfresco Mobile for Android. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *******************************************************************************/ + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.alfresco.mobile.android.async.person; import org.alfresco.mobile.android.api.model.Person; diff --git a/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/extensions/AnalyticsManager.java b/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/extensions/AnalyticsManager.java index a98dde54..3c160e5d 100644 --- a/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/extensions/AnalyticsManager.java +++ b/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/extensions/AnalyticsManager.java @@ -525,6 +525,10 @@ public abstract class AnalyticsManager extends Manager public static final String SCREEN_TEXT_EDITOR_TEXT_SIZE = "Text Editor - Text Size"; + public static final String PREFIX_ACCOUNTS = "Accounts - "; + + public static final String SCREEN_ACCOUNTS_LISTING = PREFIX_ACCOUNTS + "Listing"; + // //////////////////////////////////////////////////// // SETTINGS // //////////////////////////////////////////////////// diff --git a/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/intent/AlfrescoIntentAPI.java b/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/intent/AlfrescoIntentAPI.java index c26dd0b3..02bc8fcf 100644 --- a/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/intent/AlfrescoIntentAPI.java +++ b/platform/foundation/src/main/java/org/alfresco/mobile/android/platform/intent/AlfrescoIntentAPI.java @@ -1,3 +1,21 @@ +/* + * Copyright (C) 2005-2016 Alfresco Software Limited. + * + * This file is part of Alfresco Mobile for Android. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.alfresco.mobile.android.platform.intent; /** @@ -8,6 +26,10 @@ public interface AlfrescoIntentAPI { String SCHEME = "alfresco"; + String ID = "id"; + + String FILTER = "filter"; + // /////////////////////////////////////////////////////////////////////////// // PREFIX // /////////////////////////////////////////////////////////////////////////// @@ -23,6 +45,12 @@ public interface AlfrescoIntentAPI String AUTHORITY_FILE = "file"; + String AUTHORITY_SITE = "site"; + + String AUTHORITY_TASKS = "tasks"; + + String AUTHORITY_USER = "user"; + // EXTRA // /////////////////////////////////////////////////////////////////////////// String EXTRA_ACCOUNT_ID = PREFIX_EXTRA.concat(".ACCOUNT_ID"); diff --git a/platform/foundation/src/main/java/org/alfresco/mobile/android/ui/fragments/CommonGridFragment.java b/platform/foundation/src/main/java/org/alfresco/mobile/android/ui/fragments/CommonGridFragment.java index da2c3222..3a5421f8 100644 --- a/platform/foundation/src/main/java/org/alfresco/mobile/android/ui/fragments/CommonGridFragment.java +++ b/platform/foundation/src/main/java/org/alfresco/mobile/android/ui/fragments/CommonGridFragment.java @@ -32,6 +32,8 @@ import org.alfresco.mobile.android.ui.RefreshFragment; import org.alfresco.mobile.android.ui.template.ListingTemplate; +import com.github.clans.fab.FloatingActionButton; + import android.os.Bundle; import android.text.TextUtils; import android.util.DisplayMetrics; @@ -49,8 +51,6 @@ import android.widget.ImageView; import android.widget.TextView; -import com.github.clans.fab.FloatingActionButton; - import de.keyboardsurfer.android.widget.crouton.Crouton; import de.keyboardsurfer.android.widget.crouton.Style; @@ -413,6 +413,7 @@ protected void displayEmptyView() { if (!isVisible()) { return; } gv.setEmptyView(ev); + pb.setVisibility(View.GONE); isFullLoad = Boolean.TRUE; if (adapter != null) { diff --git a/platform/foundation/src/main/java/org/alfresco/mobile/android/ui/workflow/task/TasksFoundationFragment.java b/platform/foundation/src/main/java/org/alfresco/mobile/android/ui/workflow/task/TasksFoundationFragment.java index 58d622d9..63e245ef 100644 --- a/platform/foundation/src/main/java/org/alfresco/mobile/android/ui/workflow/task/TasksFoundationFragment.java +++ b/platform/foundation/src/main/java/org/alfresco/mobile/android/ui/workflow/task/TasksFoundationFragment.java @@ -1,20 +1,20 @@ -/******************************************************************************* - * Copyright (C) 2005-2014 Alfresco Software Limited. +/* + * Copyright (C) 2005-2016 Alfresco Software Limited. * - * This file is part of Alfresco Mobile for Android. + * This file is part of Alfresco Mobile for Android. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *******************************************************************************/ + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.alfresco.mobile.android.ui.workflow.task; import java.util.ArrayList; @@ -34,11 +34,12 @@ import org.alfresco.mobile.android.foundation.R; import org.alfresco.mobile.android.ui.fragments.BaseGridFragment; +import com.squareup.otto.Subscribe; + +import android.content.Intent; import android.os.Bundle; import android.util.Log; -import com.squareup.otto.Subscribe; - /** * Displays a fragment list of document and folders. * @@ -147,6 +148,16 @@ public static void addFilter(Map json, Bundle b) } } + public static void addFilter(Intent intent, Bundle b) + { + Map filter = new HashMap<>(intent.getData().getQueryParameterNames().size()); + for (String key : intent.getData().getQueryParameterNames()) + { + filter.put(key, intent.getData().getQueryParameter(key)); + } + b.putAll(createFilterBundle(filter)); + } + public static Bundle createFilterBundle(Map properties) { Bundle b = new Bundle(); From 6d41cd81e2cef186667ef2a107e1bc230b0bbc17 Mon Sep 17 00:00:00 2001 From: jmpascal Date: Fri, 20 May 2016 16:06:26 +0200 Subject: [PATCH 23/25] ANDROID-326 --- alfresco-mobile-android/build.gradle | 2 +- .../mobile/android/application/VersionNumber.java | 10 +++++----- build.gradle | 2 +- gradle.properties | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/alfresco-mobile-android/build.gradle b/alfresco-mobile-android/build.gradle index cfca74f8..014c7c54 100644 --- a/alfresco-mobile-android/build.gradle +++ b/alfresco-mobile-android/build.gradle @@ -27,7 +27,7 @@ android { minSdkVersion 15 targetSdkVersion 23 - versionCode 63 + versionCode 70 versionName VERSION_NAME diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/VersionNumber.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/VersionNumber.java index 5663990a..031a04b7 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/VersionNumber.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/VersionNumber.java @@ -61,14 +61,14 @@ public interface VersionNumber /** Release 19 Nov 2015. */ int VERSION_1_6_0 = 50; - /** Release 11 March 2015. */ + /** Release 11 March 2016. */ int VERSION_1_6_1 = 60; - /** Release April 2015. */ + /** Release April 2016. */ int VERSION_1_6_2 = 61; - /** Release XXX 2015. */ - int VERSION_1_6_3 = 63; + /** Release XXX 2016. */ + int VERSION_1_7_0 = 70; - int LATEST_VERSION = VERSION_1_6_3; + int LATEST_VERSION = VERSION_1_7_0; } diff --git a/build.gradle b/build.gradle index 14295a9a..bcc18ce1 100644 --- a/build.gradle +++ b/build.gradle @@ -22,7 +22,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:1.5.0' + classpath 'com.android.tools.build:gradle:2.1.0' classpath 'com.google.gms:google-services:1.5.0' } } diff --git a/gradle.properties b/gradle.properties index 98bb703f..322bbbe0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -39,7 +39,7 @@ ## DEFAULT BUILD VARIANT #################################################################### # Current Version number of the application -VERSION_NAME=1.6.3 +VERSION_NAME=1.7.0 # Build Number of the application # Overrides by Continuous Integration System during build From 3d93088d970de8b4d7e657b2b6dca8d2a0f1873f Mon Sep 17 00:00:00 2001 From: jmpascal Date: Fri, 20 May 2016 16:18:53 +0200 Subject: [PATCH 24/25] ANDROID-326 --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b4425f95..f3609984 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -21,4 +21,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip +distributionUrl=https://services.gradle.org/distributions/gradle-2.10-all.zip From 4078f03d9fadc007d78dfa79a29ea4b13a99bd3f Mon Sep 17 00:00:00 2001 From: jmpascal Date: Thu, 26 May 2016 08:56:31 +0100 Subject: [PATCH 25/25] ANDROID-323 --- .../application/activity/MainActivity.java | 11 +++++++---- .../activity/PrivateDialogActivity.java | 16 ++++++++++++++-- .../preferences/AccountSettingsFragment.java | 16 ++++++++++++++-- .../application/security/DataCleaner.java | 1 + .../application/security/PassCodeActivity.java | 11 +++++++++++ .../security/PassCodeDialogFragment.java | 1 + 6 files changed, 48 insertions(+), 8 deletions(-) diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/activity/MainActivity.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/activity/MainActivity.java index 314fe3f0..59ecdfe0 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/activity/MainActivity.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/activity/MainActivity.java @@ -361,10 +361,13 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) ((MainMenuFragment) getFragment(MainMenuFragment.TAG)).refreshAccount(); ((MainMenuFragment) getFragment(MainMenuFragment.SLIDING_TAG)).refreshAccount(); - // Send Event - // ConfigManager.getInstance(this).loadAndUseCustom(getCurrentAccount()); - EventBusManager.getInstance() - .post(new ConfigManager.ConfigurationMenuEvent(getCurrentAccount().getId())); + if (getCurrentAccount() != null) + { + // Send Event + // ConfigManager.getInstance(this).loadAndUseCustom(getCurrentAccount()); + EventBusManager.getInstance() + .post(new ConfigManager.ConfigurationMenuEvent(getCurrentAccount().getId())); + } } } diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/activity/PrivateDialogActivity.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/activity/PrivateDialogActivity.java index 6fca7aa2..5237d5fe 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/activity/PrivateDialogActivity.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/activity/PrivateDialogActivity.java @@ -32,12 +32,16 @@ import org.alfresco.mobile.android.application.fragments.preferences.GeneralPreferences; import org.alfresco.mobile.android.application.fragments.workflow.CreateTaskFragment; import org.alfresco.mobile.android.application.fragments.workflow.CreateTaskTypePickerFragment; +import org.alfresco.mobile.android.application.security.PassCodeActivity; import org.alfresco.mobile.android.application.ui.form.picker.DocumentPickerFragment.onPickDocumentFragment; import org.alfresco.mobile.android.async.file.encryption.AccountProtectionEvent; import org.alfresco.mobile.android.platform.extensions.AnalyticsHelper; import org.alfresco.mobile.android.platform.extensions.AnalyticsManager; import org.alfresco.mobile.android.platform.intent.PrivateIntent; +import com.squareup.otto.Subscribe; + +import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; @@ -45,8 +49,6 @@ import android.view.MenuItem; import android.view.View; -import com.squareup.otto.Subscribe; - /** * @author Jean Marie Pascal */ @@ -173,6 +175,16 @@ protected void onStop() super.onStop(); } + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) + { + if (requestCode == PassCodeActivity.REQUEST_CODE_PASSCODE && resultCode == RESULT_CANCELED) + { + setResult(Activity.RESULT_CANCELED); + finish(); + } + } + // /////////////////////////////////////////////////////////////////////////// // MENU // /////////////////////////////////////////////////////////////////////////// diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/preferences/AccountSettingsFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/preferences/AccountSettingsFragment.java index 9fe24da0..8c509a01 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/preferences/AccountSettingsFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/fragments/preferences/AccountSettingsFragment.java @@ -58,6 +58,8 @@ import org.alfresco.mobile.android.ui.holder.TwoLinesViewHolder; import org.alfresco.mobile.android.ui.utils.UIUtils; +import com.afollestad.materialdialogs.MaterialDialog; + import android.accounts.Account; import android.accounts.AccountManager; import android.content.Intent; @@ -75,8 +77,6 @@ import android.view.ViewGroup; import android.widget.TextView; -import com.afollestad.materialdialogs.MaterialDialog; - /** * Manage global application preferences. * @@ -193,6 +193,18 @@ public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); } + @Override + public void onStart() + { + super.onStart(); + if (AlfrescoAccountManager.getInstance(getActivity()).isEmpty() + && AlfrescoAccountManager.getInstance(getActivity()).hasData()) + { + dismiss(); + getActivity().finish(); + } + } + // /////////////////////////////////////////////////////////////////////////// // INTERNAL // /////////////////////////////////////////////////////////////////////////// diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/security/DataCleaner.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/security/DataCleaner.java index 95681118..294e883a 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/security/DataCleaner.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/security/DataCleaner.java @@ -80,6 +80,7 @@ protected Boolean doInBackground(String... params) // Delete loaded accounts SessionManager.getInstance(activityRef.get()).shutdown(); + AlfrescoAccountManager.getInstance(activityRef.get()).shutdown(); // Find folders File cache = activityRef.get().getCacheDir(); diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/security/PassCodeActivity.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/security/PassCodeActivity.java index 1e036acb..e0cbed32 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/security/PassCodeActivity.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/security/PassCodeActivity.java @@ -21,6 +21,7 @@ import org.alfresco.mobile.android.application.configuration.features.PasscodeConfigFeature; import org.alfresco.mobile.android.application.fragments.FragmentDisplayer; import org.alfresco.mobile.android.application.fragments.preferences.PasscodePreferences; +import org.alfresco.mobile.android.platform.accounts.AlfrescoAccountManager; import android.app.Activity; import android.content.Intent; @@ -58,6 +59,16 @@ public void onCreate(Bundle savedInstanceState) } } + @Override + protected void onStart() + { + super.onStart(); + if (AlfrescoAccountManager.getInstance(this).isEmpty() && AlfrescoAccountManager.getInstance(this).hasData()) + { + finish(); + } + } + public static void requestUserPasscode(FragmentActivity activity) { PasscodeConfigFeature feature = new PasscodeConfigFeature(activity); diff --git a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/security/PassCodeDialogFragment.java b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/security/PassCodeDialogFragment.java index d2a97a76..24198c2d 100644 --- a/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/security/PassCodeDialogFragment.java +++ b/alfresco-mobile-android/src/main/java/org/alfresco/mobile/android/application/security/PassCodeDialogFragment.java @@ -461,6 +461,7 @@ private void checkAttempts() if (maxAttempts > 0 && attempts >= maxAttempts) { WaitingDialogFragment fr = new WaitingDialogFragment(); + fr.setCancelable(false); fr.show(getActivity().getSupportFragmentManager(), WaitingDialogFragment.TAG); DataCleaner cleaner = new DataCleaner(getActivity());