UPDATE #2:
I have created OfficeDev/office-js#124 and OfficeDev/office-js-docs#1415 in order for someone at Microsoft to respond to this problem. Using Microsoft Support, both online and in the Outlook for iOS app, have proved fruitless.
UPDATE #1:
It appears that downgrading the requirement set at the base level of the manifest from Mailbox 1.5 to Mailbox 1.4 gets my side-loaded add-in to appear on my iOS device. This looks like a bug!
However, doing this broadens the list of supported platforms to include Office 2013. Based on the answer to another of my questions, this means I also need to set Mailbox 1.4 at the VersionOverridesV1_0 level.
I have still set Mailbox 1.5 at the VersionOverridesV1_1 level, so that there is support for calling the Outlook REST APIs and to support pinnable taskpanes.
Will my add-in, that uses APIs added in Mailbox 1.5, work as I expect on Outlook 2013?
(Specifically, I am using the new Office.context.mailbox.getCallbackTokenAsync() method to get a REST token.)
I am trying to get my add-in to appear on my iOS device so that I can test it. The device is an iPhone 6s with iOS 11.0.3 installed.
I want to target:
Outlook 2016 or later
Outlook on the Web
Outlook 2016 for Mac
Outlook for iOS
I require Mailbox 1.5 in order to support calling the Outlook REST APIs and to support pinnable taskpanes.
Here is my manifest:
<?xml version="1.0" encoding="UTF-8"?>
<OfficeApp
xmlns="http://schemas.microsoft.com/office/appforoffice/1.1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:bt="http://schemas.microsoft.com/office/officeappbasictypes/1.0"
xmlns:mailappor="http://schemas.microsoft.com/office/mailappversionoverrides" xsi:type="MailApp">
<Id>40ca534e-480c-444f-85bf-9f7051f23fe2</Id>
<Version>1.0.2.0</Version>
<ProviderName>TitleX E-Conveyancing Pty Ltd</ProviderName>
<DefaultLocale>en-US</DefaultLocale>
<DisplayName DefaultValue="[TEST] TitleX" />
<Description DefaultValue="Save your mail to TitleX."/>
<IconUrl DefaultValue="https://outlookapp.test.titlex.com.au/images/icon-64.png" />
<HighResolutionIconUrl DefaultValue="https://outlookapp.test.titlex.com.au/images/icon-128.png" />
<SupportUrl DefaultValue="https://community.titlex.com.au/s/" />
<AppDomains>
<!--LEAP Add-in Domains -->
<AppDomain>https://outlookapp-dev.leap365.com/</AppDomain>
<AppDomain>https://outlookapp-test.leap365.com/</AppDomain>
<AppDomain>https://outlookapp.leap365.com/</AppDomain>
<!--TitleX Add-in Domains -->
<AppDomain>https://outlookapp.dev.titlex.com.au/</AppDomain>
<AppDomain>https://outlookapp.test.titlex.com.au/</AppDomain>
<AppDomain>https://outlookapp.titlex.com.au/</AppDomain>
<!-- LEAP Auth -->
<AppDomain>https://auth-dev.leap.services/</AppDomain>
<AppDomain>https://auth-test.leap.services/</AppDomain>
<AppDomain>https://auth.leap.services/</AppDomain>
<!-- TitleX Auth -->
<AppDomain>https://login.dev.titlex.com.au/</AppDomain>
<AppDomain>https://login.test.titlex.com.au/</AppDomain>
<AppDomain>https://login.titlex.com.au/</AppDomain>
<AppDomain>https://login.dev.titlex.co.uk/</AppDomain>
<AppDomain>https://login.test.titlex.co.uk/</AppDomain>
<AppDomain>https://login.titlex.co.uk/</AppDomain>
<AppDomain>https://login.dev.titlex.com/</AppDomain>
<AppDomain>https://login.test.titlex.com/</AppDomain>
<AppDomain>https://login.titlex.com/</AppDomain>
</AppDomains>
<Hosts>
<Host Name="Mailbox" />
</Hosts>
<Requirements>
<Sets DefaultMinVersion="1.5">
<Set Name="Mailbox" />
</Sets>
</Requirements>
<FormSettings>
<Form xsi:type="ItemRead">
<DesktopSettings>
<SourceLocation DefaultValue="https://outlookapp.test.titlex.com.au/titlex.html"/>
<RequestedHeight>280</RequestedHeight>
</DesktopSettings>
</Form>
</FormSettings>
<Permissions>ReadWriteMailbox</Permissions>
<Rule xsi:type="RuleCollection" Mode="Or">
<Rule xsi:type="ItemIs" ItemType="Message" FormType="Read" /></Rule>
<DisableEntityHighlighting>false</DisableEntityHighlighting>
<VersionOverrides
xmlns="http://schemas.microsoft.com/office/mailappversionoverrides" xsi:type="VersionOverridesV1_0">
<Requirements>
<bt:Sets DefaultMinVersion="1.5">
<bt:Set Name="Mailbox" />
</bt:Sets>
</Requirements>
<Hosts>
<Host xsi:type="MailHost">
<DesktopFormFactor>
<FunctionFile resid="TitleX.Functions.Url" />
<!-- Message Read -->
<ExtensionPoint xsi:type="MessageReadCommandSurface">
<OfficeTab id="TabDefault">
<Group id="TitleX.Group1">
<Label resid="TitleX.Group1Label" />
<Control xsi:type="Button" id="TitleX.DefaultCommand">
<Label resid="TitleX.DefaultCommand.Label" />
<Supertip>
<Title resid="TitleX.DefaultCommand.Label" />
<Description resid="TitleX.DefaultCommand.Tooltip" />
</Supertip>
<Icon>
<bt:Image size="16" resid="TitleX.Icon.16" />
<bt:Image size="32" resid="TitleX.Icon.32" />
<bt:Image size="80" resid="TitleX.Icon.80" />
<bt:Image size="20" resid="TitleX.Icon.20" />
<bt:Image size="24" resid="TitleX.Icon.24" />
<bt:Image size="40" resid="TitleX.Icon.40" />
<bt:Image size="48" resid="TitleX.Icon.48" />
<bt:Image size="64" resid="TitleX.Icon.64" />
</Icon>
<Action xsi:type="ShowTaskpane">
<SourceLocation resid="TitleX.Taskpane.Url" />
</Action>
</Control>
</Group>
<!--<Label resid="Leap.TabLabel"/>-->
</OfficeTab>
</ExtensionPoint>
<!-- Go to http://aka.ms/ExtensionPointsCommands to learn how to add more Extension Points: MessageRead, AppointmentOrganizer, AppointmentAttendee -->
</DesktopFormFactor>
</Host>
</Hosts>
<Resources>
<bt:Images>
<bt:Image id="TitleX.Icon.16" DefaultValue="https://outlookapp.test.titlex.com.au/images/icon-16.png"/>
<bt:Image id="TitleX.Icon.32" DefaultValue="https://outlookapp.test.titlex.com.au/images/icon-32.png"/>
<bt:Image id="TitleX.Icon.80" DefaultValue="https://outlookapp.test.titlex.com.au/images/icon-80.png"/>
<bt:Image id="TitleX.Icon.20" DefaultValue="https://outlookapp.test.titlex.com.au/images/icon-20.png" />
<bt:Image id="TitleX.Icon.24" DefaultValue="https://outlookapp.test.titlex.com.au/images/icon-24.png" />
<bt:Image id="TitleX.Icon.25" DefaultValue="https://outlookapp.test.titlex.com.au/images/icon-25.png" />
<bt:Image id="TitleX.Icon.40" DefaultValue="https://outlookapp.test.titlex.com.au/images/icon-40.png" />
<bt:Image id="TitleX.Icon.48" DefaultValue="https://outlookapp.test.titlex.com.au/images/icon-48.png" />
<bt:Image id="TitleX.Icon.64" DefaultValue="https://outlookapp.test.titlex.com.au/images/icon-64.png" />
</bt:Images>
<bt:Urls>
<bt:Url id="TitleX.Taskpane.Url" DefaultValue="https://outlookapp.test.titlex.com.au/titlex.html" />
<bt:Url id="TitleX.Functions.Url" DefaultValue="https://outlookapp.test.titlex.com.au/functions.html" />
</bt:Urls>
<bt:ShortStrings>
<bt:String id="TitleX.TabLabel" DefaultValue="[TEST] TitleX" />
<bt:String id="TitleX.Group1Label" DefaultValue="TitleX" />
<bt:String id="TitleX.DefaultCommand.Label" DefaultValue="[TEST] TitleX Mail Manager" />
<bt:String id="TitleX.DefaultCommand.Title" DefaultValue="[TEST] TitleX" />
</bt:ShortStrings>
<bt:LongStrings>
<bt:String id="TitleX.DefaultCommand.Tooltip" DefaultValue="Click to show the add-in." />
<bt:String id="TitleX.Description" DefaultValue="Save your mail to TitleX." />
</bt:LongStrings>
</Resources>
<!-- NOTE: TO SUPPORT A PINNABLE TASKPANE AND MOBILEFORMFACTOR -->
<VersionOverrides
xmlns="http://schemas.microsoft.com/office/mailappversionoverrides/1.1" xsi:type="VersionOverridesV1_1">
<Requirements>
<bt:Sets DefaultMinVersion="1.5">
<bt:Set Name="Mailbox" />
</bt:Sets>
</Requirements>
<Hosts>
<Host xsi:type="MailHost">
<DesktopFormFactor>
<FunctionFile resid="TitleX.Functions.Url" />
<!-- Message Read -->
<ExtensionPoint xsi:type="MessageReadCommandSurface">
<OfficeTab id="TabDefault">
<Group id="TitleX.Group1">
<Label resid="TitleX.Group1Label" />
<Control xsi:type="Button" id="TitleX.DefaultCommand">
<Label resid="TitleX.DefaultCommand.Label" />
<Supertip>
<Title resid="TitleX.DefaultCommand.Label" />
<Description resid="TitleX.DefaultCommand.Tooltip" />
</Supertip>
<Icon>
<bt:Image size="16" resid="TitleX.Icon.16" />
<bt:Image size="32" resid="TitleX.Icon.32" />
<bt:Image size="80" resid="TitleX.Icon.80" />
<bt:Image size="20" resid="TitleX.Icon.20" />
<bt:Image size="24" resid="TitleX.Icon.24" />
<bt:Image size="40" resid="TitleX.Icon.40" />
<bt:Image size="48" resid="TitleX.Icon.48" />
<bt:Image size="64" resid="TitleX.Icon.64" />
</Icon>
<Action xsi:type="ShowTaskpane">
<SourceLocation resid="TitleX.Taskpane.Url" />
<SupportsPinning>true</SupportsPinning>
</Action>
</Control>
<!-- Go to http://aka.ms/ButtonCommands to learn how to add more Controls: ExecuteFunction and Menu -->
</Group>
</OfficeTab>
</ExtensionPoint>
<!-- Go to http://aka.ms/ExtensionPointsCommands to learn how to add more Extension Points: MessageRead, AppointmentOrganizer, AppointmentAttendee -->
</DesktopFormFactor>
<!-- See https://learn.microsoft.com/en-us/outlook/add-ins/add-mobile-support -->
<MobileFormFactor>
<FunctionFile resid="TitleX.Functions.Url" />
<ExtensionPoint xsi:type="MobileMessageReadCommandSurface">
<Group id="TitleX.Group1">
<Label resid="TitleX.Group1Label" />
<Control xsi:type="MobileButton" id="TitleX.DefaultCommand">
<Label resid="TitleX.DefaultCommand.Label" />
<Icon xsi:type="bt:MobileIconList">
<bt:Image size="25" scale="1" resid="TitleX.Icon.25" />
<bt:Image size="25" scale="2" resid="TitleX.Icon.25" />
<bt:Image size="25" scale="3" resid="TitleX.Icon.25" />
<bt:Image size="32" scale="1" resid="TitleX.Icon.32" />
<bt:Image size="32" scale="2" resid="TitleX.Icon.32" />
<bt:Image size="32" scale="3" resid="TitleX.Icon.32" />
<bt:Image size="48" scale="1" resid="TitleX.Icon.48" />
<bt:Image size="48" scale="2" resid="TitleX.Icon.48" />
<bt:Image size="48" scale="3" resid="TitleX.Icon.48" />
</Icon>
<Action xsi:type="ShowTaskpane">
<SourceLocation resid="TitleX.Taskpane.Url" />
</Action>
</Control>
</Group>
</ExtensionPoint>
</MobileFormFactor>
</Host>
</Hosts>
<Resources>
<bt:Images>
<bt:Image id="TitleX.Icon.16" DefaultValue="https://outlookapp.test.titlex.com.au/images/icon-16.png"/>
<bt:Image id="TitleX.Icon.32" DefaultValue="https://outlookapp.test.titlex.com.au/images/icon-32.png"/>
<bt:Image id="TitleX.Icon.80" DefaultValue="https://outlookapp.test.titlex.com.au/images/icon-80.png"/>
<bt:Image id="TitleX.Icon.20" DefaultValue="https://outlookapp.test.titlex.com.au/images/icon-20.png" />
<bt:Image id="TitleX.Icon.24" DefaultValue="https://outlookapp.test.titlex.com.au/images/icon-24.png" />
<bt:Image id="TitleX.Icon.25" DefaultValue="https://outlookapp.test.titlex.com.au/images/icon-25.png" />
<bt:Image id="TitleX.Icon.40" DefaultValue="https://outlookapp.test.titlex.com.au/images/icon-40.png" />
<bt:Image id="TitleX.Icon.48" DefaultValue="https://outlookapp.test.titlex.com.au/images/icon-48.png" />
<bt:Image id="TitleX.Icon.64" DefaultValue="https://outlookapp.test.titlex.com.au/images/icon-64.png" />
</bt:Images>
<bt:Urls>
<bt:Url id="TitleX.Taskpane.Url" DefaultValue="https://outlookapp.test.titlex.com.au/titlex.html" />
<bt:Url id="TitleX.Functions.Url" DefaultValue="https://outlookapp.test.titlex.com.au/functions.html" />
</bt:Urls>
<bt:ShortStrings>
<bt:String id="TitleX.TabLabel" DefaultValue="[TEST] TitleX" />
<bt:String id="TitleX.Group1Label" DefaultValue="TitleX" />
<bt:String id="TitleX.DefaultCommand.Label" DefaultValue="[TEST] TitleX Mail Manager" />
<bt:String id="TitleX.DefaultCommand.Title" DefaultValue="[TEST] TitleX" />
</bt:ShortStrings>
<bt:LongStrings>
<bt:String id="TitleX.DefaultCommand.Tooltip" DefaultValue="Click to show the add-in." />
<bt:String id="TitleX.Description" DefaultValue="Save your mail to TitleX." />
</bt:LongStrings>
</Resources>
</VersionOverrides>
</VersionOverrides>
</OfficeApp>
Here is the validate-office-addin result for the above add-in manifest:
Calling validation service. This might take a moment...
-------------------------------------
Validation: Passed
Based on the requirements specified in your manifest, your add-in can run on the following platforms; your add-in will be tested on these platforms when you submit it to the Office Store:
- Outlook 2016 or later
- Outlook 2016 for Mac
- Outlook for iOS
- Outlook on the Web
Important: This analysis is based on the requirements specified in your manifest and does not account for any runtime JavaScript calls within your add-in. For information about which API sets and features are supported on each platform, see Office Add-in host and platfo
rm availability. (https://dev.office.com/add-in-availability).
*This does not include mobile apps. You can opt-in to support mobile apps when you submit your add-in.
-------------------------------------
Looking at the documentation for Office Add-in host and platform availability for Outlook, I see that Mailbox 1.5 is supported on all platforms that I want to target.
So, everything looks to be aligned, but my add-in won't appear on my iOS device!
If, however, I downgrade the requirement set from 1.5 to 1.4, then side-load again, the add-in appears. Obviously, that's contrary to what I expect.
Question: why does specifying the Mailbox 1.5 requirement set on my manifest make it so that my side-loaded add-in does NOT appear on my iOS device? Please help.
As of 26 June 2018, Outlook for iOS 2.82.0 now correctly side-loads my add-in for testing.
Related
I faced a real strange scenario when after I restarted my PC due to freezing of windows some of my java codes in the Android Studio were converted to some strange xml codes and all those codes I written were lost! I faced this situation twice, the first time I faced this scenario, I reverted my code to last commit since the changes were very little after the last commit.
However this time the changes are huge after the last commit and I am completely perplexed!
The below is how one of my small code was converted.
<component name="libraryTable">
<library name="Gradle: com.android.support:print:28.0.0#aar">
<ANNOTATIONS>
<root url="jar://$USER_HOME$/.gradle/caches/transforms-1/files-1.1/print-28.0.0.aar/87cddf7f66cc3e6d635cf04e7292a008/annotations.zip!/" />
</ANNOTATIONS>
<CLASSES>
<root url="file://$USER_HOME$/.gradle/caches/transforms-1/files-1.1/print-28.0.0.aar/87cddf7f66cc3e6d635cf04e7292a008/res" />
<root url="jar://$USER_HOME$/.gradle/caches/transforms-1/files-1.1/print-28.0.0.aar/87cddf7f66cc3e6d635cf04e7292a008/jars/classes.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
My Android Studio version: 3.3.1
Is there any way to get back the code I wrote?
Any help would be appreciated.
EDIT
I faced again the same situation. Here is one of my another code replaced with xml
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AndroidConfiguredLogFilters">
<filters>
<filter>
<option name="logLevel" value="verbose" />
<option name="logMessagePattern" value="" />
<option name="logTagPattern" value="(MainActivity|Download|BooksFrag|Reading|BookPage|BookDetails|PageNumberPicker)" />
<option name="name" value="Unnamed-0" />
<option name="packageNamePattern" value="" />
<option name="pid" value="" />
</filter>
</filters>
</component>
<component name="AndroidLayouts">
<shared>
<config />
</shared>
</component>
<component name="AndroidLogFilters">
<option name="TOOL_WINDOW_CONFIGURED_FILTER" value="Unnamed-0" />
</component>
<component name="ChangeListManager">
<list default="true" id="0218df07-b316-45c7-a2ad-66ba2c0b4c43" name="Default Changelist" comment="">
<change afterPath="$PROJECT_DIR$/app/src/main/java/com/sed/maktaba_daar_al_hadeeth/utilities/RealmDBHelper.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/sed/maktaba_daar_al_hadeeth/BookSearchResultsContainer.java" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/sed/maktaba_daar_al_hadeeth/BookSearchResultsContainer.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/sed/maktaba_daar_al_hadeeth/BookSearcher.java" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/sed/maktaba_daar_al_hadeeth/BookSearcher.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/sed/maktaba_daar_al_hadeeth/SearchOptions.java" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/sed/maktaba_daar_al_hadeeth/SearchOptions.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/sed/maktaba_daar_al_hadeeth/SearchResult.java" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/sed/maktaba_daar_al_hadeeth/SearchResult.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/sed/maktaba_daar_al_hadeeth/SearchResultViewHolder.java" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/sed/maktaba_daar_al_hadeeth/SearchResultViewHolder.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/sed/maktaba_daar_al_hadeeth/activities/ReadingActivity.java" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/sed/maktaba_daar_al_hadeeth/activities/ReadingActivity.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/sed/maktaba_daar_al_hadeeth/utilities/ArabicUtilities.java" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/sed/maktaba_daar_al_hadeeth/utilities/ArabicUtilities.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/res/values/strings.xml" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/res/values/strings.xml" afterDir="false" />
</list>
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="ExternalProjectsManager">
<system id="GRADLE">
<state>
<projects_view />
</state>
</system>
</component>
<component name="FUSProjectUsageTrigger">
<session id="1042793738">
<usages-collector id="statistics.lifecycle.project">
<counts>
<entry key="project.closed" value="23" />
<entry key="project.open.time.12" value="2" />
<entry key="project.open.time.13" value="2" />
<entry key="project.open.time.14" value="1" />
<entry key="project.open.time.15" value="3" />
<entry key="project.open.time.16" value="1" />
<entry key="project.open.time.17" value="1" />
<entry key="project.open.time.18" value="2" />
<entry key="project.open.time.2" value="1" />
<entry key="project.open.time.21" value="1" />
<entry key="project.open.time.22" value="1" />
<entry key="project.open.time.24" value="1" />
<entry key="project.open.time.25" value="2" />
<entry key="project.open.time.26" value="2" />
<entry key="project.open.time.27" value="5" />
<entry key="project.open.time.28" value="1" />
<entry key="project.open.time.29" value="1" />
<entry key="project.open.time.3" value="1" />
<entry key="project.open.time.30" value="1" />
<entry key="project.open.time.31" value="1" />
<entry key="project.open.time.32" value="1" />
<entry key="project.open.time.36" value="1" />
<entry key="project.open.time.4" value="1" />
<entry key="project.open.time.46" value="1" />
<entry key="project.open.time.49" value="1" />
<entry key="project.open.time.5" value="2" />
<entry key="project.open.time.50" value="1" />
<entry key="project.open.time.51" value="1" />
<entry key="project.open.time.6" value="2" />
<entry key="project.open.time.7" value="1" />
<entry key="project.open.time.8" value="2" />
<entry key="project.opened" value="44" />
</counts>
</usages-collector>
<usages-collector id="statistics.file.extensions.open">
<counts>
<entry key="MF" value="1" />
<entry key="css" value="4" />
<entry key="csv" value="11" />
<entry key="gradle" value="14" />
<entry key="java" value="298" />
<entry key="js" value="19" />
I logged an issue with Google here.
Thanks.
EDIT (Nov 2019)
I faced this in android studio 3.5.2 as well. It seems the issue is not fixed yet.
dont worry!
Go to android studio folder located in Users/user/.androidstudiov.x.x
And delete your cache and restart android studio. This problem happened to me a couple of days ago, right after I upgraded to the new version. Even XML and java classes will have this. However all your data is safe.
A bug in android studio, importing settings..
I am trying to add additional columns to the "Links" page as highlighted in yellow, but can't seem to figure out how to do so. The request is to add columns to show "Assigned To" and "Remaining Work".
I've looked over and attempted following the information here with no luck: LinksControlOptions XML elements
Links Page - TFS 2018
I've tried on my side and found your can't customize the default links columns, a workaround is creating a new page between <WebLayout> and </WebLayout> as the following sample in your work item type definition and add <Column Name="FieldRefName" /> that you want to shows there:
<FORM>
<WebLayout>
<Page Label="Links" LayoutMode="FirstColumnWide">
<Section>
<Group Label="links">
<Control Type="LinksControl" Name="links">
<LinksControlOptions>
<LinkFilters>
<WorkItemLinkFilter Type="System.LinkTypes.Duplicate-Reverse" />
<WorkItemLinkFilter Type="System.LinkTypes.Hierarchy-Reverse" />
<WorkItemLinkFilter Type="Microsoft.VSTS.Common.TestedBy-Reverse" />
<WorkItemLinkFilter Type="Microsoft.VSTS.Common.TestedBy-Forward" />
<WorkItemLinkFilter Type="System.LinkTypes.Hierarchy-Forward" />
<WorkItemLinkFilter Type="System.LinkTypes.Duplicate-Forward" />
<WorkItemLinkFilter Type="System.LinkTypes.Dependency" />
<WorkItemLinkFilter Type="System.LinkTypes.Related" />
</LinkFilters>
<Columns>
<Column Name="System.State" />
<Column Name="System.ChangedDate" />
<Column Name="System.Links.Comment" />
<Column Name="System.AssignedTo" />
<Column Name="System.IterationPath" />
</Columns>
</LinksControlOptions>
</Control>
</Group>
</Section>
</Page>
</WebLayout>
</FORM>
For a heavily customized process template, I'm trying to implement multiple specialized LinksControls on the front page ("Details") of the work item form (TFS2017.Update1).
What I have done is the following:
<Group Label="Derived">
<Control Type="LinksControl" Name="Derived">
<LinksControlOptions ViewMode="List">
<ListViewOptions GroupLinks="true" />
<LinkFilters>
<WorkItemLinkFilter Type="RE.DerivedFrom-Forward" />
</LinkFilters>
<WorkItemTypeFilters>
<Filter WorkItemType="Product Requirement" />
<Filter WorkItemType="Customer Requirement" />
</WorkItemTypeFilters>
<Columns>
<Column Name="System.State" />
<Column Name="System.ChangedDate" />
<Column Name="System.Links.Comment" />
</Columns>
</LinksControlOptions>
</Control>
</Group>
<Group Label="Usings">
<Control Type="LinksControl" Name="Usings">
<LinksControlOptions ViewMode="List">
<ListViewOptions GroupLinks="true" />
<LinkFilters>
<WorkItemLinkFilter Type="RE.Uses" />
</LinkFilters>
<WorkItemTypeFilters>
<Filter WorkItemType="Product Property" />
<Filter WorkItemType="Product Requirement" />
<Filter WorkItemType="Customer Requirement" />
</WorkItemTypeFilters>
<Columns>
<Column Name="System.State" />
<Column Name="System.ChangedDate" />
<Column Name="System.Links.Comment" />
</Columns>
</LinksControlOptions>
</Control>
</Group>
<Group Label="Hierarchy">
<Control Type="LinksControl" Name="Hierarchy">
<LinksControlOptions ViewMode="List">
<ListViewOptions GroupLinks="true" />
<LinkFilters>
<WorkItemLinkFilter Type="System.LinkTypes.Hierarchy" />
</LinkFilters>
<Columns>
<Column Name="System.State" />
<Column Name="System.ChangedDate" />
<Column Name="System.Links.Comment" />
</Columns>
</LinksControlOptions>
</Control>
</Group>
When I open the form, some of the groups are empty, although there definitely are other work items linked using the link types in the filter:
To verify, that the links really exist I checked on the "all links" page:
When I hit the refresh button other links are shown. Which seems to be quite random.
Is there an error in my XML? Or is there any restriction to the WebLayout and usage of LinksControl that I'm not aware of? Or is this a known bug in TFS?
This seems to be a version specific bug(?) in TFS 2017.1.
I copied the collection to a fresh TFS 2018 install and now it looks like I expected it:
Not a perfect answer. But a solution I can live with, since we are about to upgrade to TFS 2018 anyway.
Hello ive been getting this problem ive been deploying my app but i keep getting this error
11-23 11:25:23.381 18936-18987/nandos.android.appmy E/com.parse.PushService: Tried to use push, but this app is not configured for push due to: Push is not configured for this app because the app manifest is missing required declarations. Please add the following declarations to your app manifest to support either GCM or PPNS for push (or both). To enable GCM support, please make sure that these permissions are declared as children of the root element:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission android:name="nandos.android.appmy.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="nandos.android.appmy.permission.C2D_MESSAGE" />
Also, please make sure that these services and broadcast receivers are declared as children of the <application> element:
<service android:name="com.parse.PushService" />
<receiver android:name="com.parse.GcmBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="nandos.android.appmy" />
</intent-filter>
</receiver>
To enable PPNS support, please make sure that these permissions are declared as children of the root <manifest> element:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
Also, please make sure that these services and broadcast receivers are declared as children of the <application> element:
<service android:name="com.parse.PushService" />
<receiver android:name="com.parse.ParseBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.USER_PRESENT" />
</intent-filter>
</receiver>
This is my manifest:
enter code here <?xml version="1.0" encoding="utf-8"?>
<permission
android:name="nandos.android.appmy.permission.MAPS_RECEIVE"
android:protectionLevel="signature" />
<!--Required permission for JPush-->
<permission
android:name="nandos.android.appmy.permission.JPUSH_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="nandos.android.appmy.permission.JPUSH_MESSAGE" />
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- Optional. Required for location feature -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<!--Required permission for JPush-->
<uses-permission android:name="nandos.android.appmy.permission.MAPS_RECEIVE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="com.sonyericsson.home.permission.BROADCAST_BADGE" />
<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission
android:name="nandos.android.appmy.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="nandos.android.appmy.permission.C2D_MESSAGE" />
<application
android:name="nandos.android.appmy.ui.activities.NandoApplication"
android:allowBackup="true"
android:hardwareAccelerated="true"
android:icon="#drawable/ic_launcher"
android:label="#string/app_name"
android:largeHeap="true"
android:theme="#style/Theme.Nandos_actionbar">
<uses-library
android:name="com.google.android.maps"
android:required="true" />
<!--Release Key -->
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="AIzaSyBfGUWQYewQ2grdwckW0cyYUyGy7-qHugw" />
<!--AIzaSyBfGUWQYewQ2grdwckW0cyYUyGy7-qHugw-->
<!--AIzaSyBtOtmmPuaXb_B2PfBvvRUOapBTnO7w4k4 testing-->
<activity
android:name="nandos.android.lib.ui.activities.contact.ContactActivity"
android:label="#string/app_name"
android:screenOrientation="portrait">
<intent-filter>
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="nandos.android.appmy.ui.activities.OverrideMainActivity"
android:label="#string/app_name"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="myapp"
android:scheme="nando"
/>
</intent-filter>
</activity>
<activity
android:name=".ui.activities.menu.OverrideMenuActivity"
android:label="#string/app_name"
android:screenOrientation="portrait">
<intent-filter>
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="nandos.android.appmy.ui.activities.NewContactUsActivity_"
android:label="#string/app_name"
android:screenOrientation="portrait">
<intent-filter>
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="nandos.android.appmy.ui.activities.tabletalk.TableTalkerMainActivity_"
android:label="#string/app_name"
android:screenOrientation="portrait">
<intent-filter>
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="nandos.android.appmy.ui.activities.OverrideRestaurantsActivity"
android:label="#string/app_name"
android:screenOrientation="portrait">
<intent-filter>
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ui.activities.LoyaltyActivity_"
android:label="#string/app_name"
android:screenOrientation="portrait">
<intent-filter>
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ui.activities.socialhub.SocialHubActivity_"
android:label="#string/app_name"
android:screenOrientation="portrait">
<intent-filter>
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ui.activities.socialhub.SocialHubDetails_"
android:label="#string/app_name"
android:screenOrientation="portrait">
<intent-filter>
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!--JPush Requirements-->
<activity
android:name="cn.jpush.android.ui.PopWinActivity"
android:theme="#style/MyDialogStyle"
android:exported="false">
</activity>
<!-- Required SDK Core functions-->
<activity
android:name="cn.jpush.android.ui.PushActivity"
android:configChanges="orientation|keyboardHidden"
android:theme="#android:style/Theme.NoTitleBar"
android:exported="false">
<intent-filter>
<action android:name="cn.jpush.android.ui.PushActivity" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="nandos.android.appmy" />
</intent-filter>
</activity>
<!-- Required SDK Core functions-->
<service
android:name="cn.jpush.android.service.DownloadService"
android:enabled="true"
android:exported="false" >
</service>
<!-- Required SDK Core functions-->
<!-- Configurable android:process Parameter PushService In other processes -->
<service
android:name="cn.jpush.android.service.PushService"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="cn.jpush.android.intent.REGISTER" />
<action android:name="cn.jpush.android.intent.REPORT" />
<action android:name="cn.jpush.android.intent.PushService" />
<action android:name="cn.jpush.android.intent.PUSH_TIME" />
</intent-filter>
</service>
<!-- since 1.8.0 option Optional. For the same equipment in different applications JPush Services to each other pull function. -->
<!-- If this feature is enabled to remove the component will not pull up other applications other applications can not be pulled -->
<service
android:name="cn.jpush.android.service.DaemonService"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="cn.jpush.android.intent.DaemonService" />
<category android:name="nandos.android.appmy" />
</intent-filter>
</service>
<!-- Required SDK Core functions-->
<receiver
android:name="cn.jpush.android.service.PushReceiver"
android:enabled="true"
android:exported="false">
<intent-filter android:priority="1000">
<action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" /> <!--Required 显示通知栏 -->
<category android:name="nandos.android.appmy" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.USER_PRESENT" />
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
<!-- Optional -->
<intent-filter>
<action android:name="android.intent.action.PACKAGE_ADDED" />
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<data android:scheme="package" />
</intent-filter>
</receiver>
<!-- Required SDK Core functions-->
<receiver android:name="cn.jpush.android.service.AlarmReceiver"
android:exported="false"
/>
<!--JPush Requirements-->
<receiver
android:name="nandos.android.appmy.ui.activities.pushNotification.GcmBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="nandos.android.appmy" />
</intent-filter>
</receiver>
<service android:name="nandos.android.appmy.ui.activities.pushNotification.GCMNotificationIntentService" />
<service android:name="com.parse.PushService" />
<receiver android:name="com.parse.ParseBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.USER_PRESENT" />
</intent-filter>
</receiver>
<receiver
android:name="com.parse.GcmBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="nandos.android.appmy" />
</intent-filter>
</receiver>
<!-- Used for Google Play Store Campaign Measurement-->
<service android:name="com.google.android.gms.analytics.CampaignTrackingService" />
<receiver android:name="com.google.android.gms.analytics.CampaignTrackingReceiver"
android:exported="true">
<intent-filter>
<action android:name="com.android.vending.INSTALL_REFERRER" />
</intent-filter>
</receiver>
<meta-data
android:name="com.crashlytics.ApiKey"
android:value="2c2ff6e3c30f2c8d1dc8d90718b5ce4c2d4c96f5" />
<!--Call the JPush channel and App Key-->
<meta-data android:name="JPUSH_CHANNEL" android:value="developer-default"/>
<meta-data android:name="JPUSH_APPKEY" android:value="08e8c5fb8b4c587351bce7f0"/>
</application>
enter code here
I am trying to give my website (created using JSF 2) a custom login from using Spring Security. When I use the default login form, the website works fine. However, when I try to use my own custom login form, I am always directed to my authentication-failure-url, even when I type the correct username/password. Does anyone know why this is or how I can fix it? My code is below.
security-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans
xmlns:sec="http://www.springframework.org/schema/security"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd">
<sec:http auto-config="true" use-expressions="true">
<sec:intercept-url pattern="/login.jsf" access="isAnonymous()" />
<sec:intercept-url pattern="/pages/secure/**" access="hasRole('ROLE_USER')" />
<sec:intercept-url pattern="/pages/home/**" access="hasRole('ROLE_USER')" />
<sec:intercept-url pattern="/pages/unsecure/**" access="permitAll"/>
<sec:form-login login-page="/login.jsf" default-target-url="/pages/home/home.jsf"
authentication-failure-url="/fail.jsf"/>
</sec:http>
<sec:authentication-manager alias="authenticationManager">
<sec:authentication-provider>
<sec:user-service>
<sec:user authorities="ROLE_USER" name="admin" password="admin" />
</sec:user-service>
</sec:authentication-provider>
</sec:authentication-manager>
</beans:beans>
login.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<title>Login</title>
<h:outputStylesheet name="css/styles.css" />
<h:outputScript name="jquery/jquery-plugins.js" library="primefaces" />
</h:head>
<h:body>
<div class="login">
<form method="POST" action="j_spring_security_check">
<h:inputText name="j_username" id="username"></h:inputText>
<p:watermark for="username" value="Username" />
<br />
<h:inputSecret name="j_password" id="password">
</h:inputSecret>
<p:watermark for="password" value="Password" />
<br />
<h:commandButton name="submit" type="submit" value="Submit"></h:commandButton>
</form>
</div>
</h:body>
</html>
Have you looked at the generated HTML output? Rightclick page in browser, do View Source to see it.
The name attribute of
<h:inputText name="j_username" id="username"></h:inputText>
<h:inputSecret name="j_password" id="password"></h:inputSecret>
isn't been generated at all! Instead, the client ID represents the element's name.
Fix it accordingly:
<h:inputText id="j_username" />
<p:watermark for="j_username" value="Username" />
<h:inputSecret id="j_password" />
<p:watermark for="j_password" value="Password" />
You could of course also just use plain vanilla HTML:
<input type="text" name="j_username" placeholder="Username" />
<input type="password" name="j_password" placeholder="Password" />
Try setting the following as action of the form.
action="#{request.contextPath}/j_spring_security_check"