diff options
297 files changed, 4102 insertions, 1500 deletions
diff --git a/.idea/gradle.xml b/.idea/gradle.xml index f6e673a..e97777d 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,3 +1,18 @@ <?xml version="1.0" encoding="UTF-8"?> -<project version="4" /> +<project version="4"> + <component name="GradleSettings"> + <option name="linkedExternalProjectsSettings"> + <GradleProjectSettings> + <option name="distributionType" value="LOCAL" /> + <option name="externalProjectPath" value="$PROJECT_DIR$/google-play-services_lib" /> + <option name="gradleHome" value="/usr/share/java/gradle" /> + <option name="modules"> + <set> + <option value="$PROJECT_DIR$/google-play-services_lib" /> + </set> + </option> + </GradleProjectSettings> + </option> + </component> +</project> diff --git a/.idea/inspectionProfiles/c_geo_standards.xml b/.idea/inspectionProfiles/c_geo_standards.xml index cf3d2fb..1f06821 100644 --- a/.idea/inspectionProfiles/c_geo_standards.xml +++ b/.idea/inspectionProfiles/c_geo_standards.xml @@ -17,61 +17,106 @@ <inspection_tool class="Annotator" enabled="false" level="ERROR" enabled_by_default="false" /> <inspection_tool class="AntMissingPropertiesFileInspection" enabled="false" level="ERROR" enabled_by_default="false" /> <inspection_tool class="AntResolveInspection" enabled="false" level="ERROR" enabled_by_default="false" /> + <inspection_tool class="ArrayEquality" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="ArraysAsListWithZeroOrOneArgument" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="AssignmentToCatchBlockParameter" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="AssignmentToMethodParameter" enabled="true" level="WARNING" enabled_by_default="true"> <option name="ignoreTransformationOfOriginalParameter" value="false" /> </inspection_tool> <inspection_tool class="AssignmentUsedAsCondition" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="BooleanMethodIsAlwaysInverted" enabled="false" level="WARNING" enabled_by_default="false" /> + <inspection_tool class="BooleanMethodNameMustStartWithQuestion" enabled="false" level="TYPO" enabled_by_default="false"> + <option name="ignoreBooleanMethods" value="false" /> + <option name="ignoreInAnnotationInterface" value="true" /> + <option name="onlyWarnOnBaseMethods" value="true" /> + <option name="questionString" value="is,can,has,should,could,will,shall,check,contains,equals,add,put,remove,startsWith,endsWith,on,require" /> + </inspection_tool> + <inspection_tool class="BusyWait" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="CStyleArrayDeclaration" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="CanBeFinal" enabled="false" level="WARNING" enabled_by_default="false"> <option name="REPORT_CLASSES" value="false" /> <option name="REPORT_METHODS" value="false" /> <option name="REPORT_FIELDS" value="true" /> </inspection_tool> + <inspection_tool class="CastConflictsWithInstanceof" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="CastToIncompatibleInterface" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="ChainedEquality" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="CheckEmptyScriptTag" enabled="false" level="WARNING" enabled_by_default="false" /> <inspection_tool class="CheckTagEmptyBody" enabled="false" level="WARNING" enabled_by_default="false" /> <inspection_tool class="CheckValidXmlInScriptTagBody" enabled="false" level="ERROR" enabled_by_default="false" /> <inspection_tool class="ClassInTopLevelPackage" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="ClassNameDiffersFromFileName" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="ClassNamingConvention" enabled="true" level="WARNING" enabled_by_default="true"> + <option name="m_regex" value="[A-Z][A-Za-z\d]*" /> + <option name="m_minLength" value="3" /> + <option name="m_maxLength" value="64" /> + </inspection_tool> + <inspection_tool class="ClassNewInstance" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="ClassOnlyUsedInOneModule" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="ClassOnlyUsedInOnePackage" enabled="false" level="WEAK WARNING" enabled_by_default="false" /> + <inspection_tool class="CollectionAddedToSelf" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="CollectionsFieldAccessReplaceableByMethodCall" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="ComparableImplementedButEqualsNotOverridden" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="ConditionSignal" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="ConditionalExpressionWithIdenticalBranches" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="ConfusingElse" enabled="true" level="WARNING" enabled_by_default="true"> <option name="reportWhenNoStatementFollow" value="false" /> </inspection_tool> + <inspection_tool class="ConstantAssertCondition" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="ConstantConditions" enabled="true" level="WARNING" enabled_by_default="true"> <option name="SUGGEST_NULLABLE_ANNOTATIONS" value="false" /> <option name="DONT_REPORT_TRUE_ASSERT_STATEMENTS" value="true" /> </inspection_tool> + <inspection_tool class="ConstantNamingConvention" enabled="false" level="WEAK WARNING" enabled_by_default="false"> + <option name="onlyCheckImmutables" value="false" /> + <option name="m_regex" value="[A-Z][A-Z_\d]*" /> + <option name="m_minLength" value="3" /> + <option name="m_maxLength" value="32" /> + </inspection_tool> + <inspection_tool class="ConstantStringIntern" enabled="true" level="ERROR" enabled_by_default="true" /> + <inspection_tool class="CovariantCompareTo" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="CovariantEquals" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="CyclomaticComplexity" enabled="false" level="WEAK WARNING" enabled_by_default="false"> + <option name="m_limit" value="10" /> + </inspection_tool> <inspection_tool class="DefaultNotLastCaseInSwitch" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="Deprecation" enabled="true" level="WARNING" enabled_by_default="true"> <option name="IGNORE_INSIDE_DEPRECATED" value="true" /> </inspection_tool> + <inspection_tool class="DollarSignInName" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="DoubleLiteralMayBeFloatLiteral" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="DuplicateBooleanBranch" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="DuplicateCondition" enabled="true" level="WARNING" enabled_by_default="true"> <option name="ignoreMethodCalls" value="false" /> </inspection_tool> + <inspection_tool class="DynamicRegexReplaceableByCompiledPattern" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="EmptyCatchBlock" enabled="false" level="WARNING" enabled_by_default="false"> <option name="m_includeComments" value="true" /> <option name="m_ignoreTestCases" value="true" /> <option name="m_ignoreIgnoreParameter" value="true" /> </inspection_tool> <inspection_tool class="EmptyMethod" enabled="false" level="WARNING" enabled_by_default="false" /> + <inspection_tool class="EmptySynchronizedStatement" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="EnumSwitchStatementWhichMissesCases" enabled="true" level="WARNING" enabled_by_default="true"> <option name="ignoreSwitchStatementsWithDefault" value="true" /> </inspection_tool> <inspection_tool class="EqualsAndHashcode" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="ErrorRethrown" enabled="true" level="ERROR" enabled_by_default="true" /> + <inspection_tool class="ExtendsThread" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="FallthruInSwitchStatement" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="FieldAccessedSynchronizedAndUnsynchronized" enabled="true" level="WARNING" enabled_by_default="true"> + <option name="countGettersAndSetters" value="false" /> + </inspection_tool> <inspection_tool class="FieldCanBeLocal" enabled="true" level="ERROR" enabled_by_default="true" /> + <inspection_tool class="FieldHidesSuperclassField" enabled="true" level="WARNING" enabled_by_default="true"> + <option name="m_ignoreInvisibleFields" value="true" /> + </inspection_tool> <inspection_tool class="FieldMayBeStatic" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="FinalStaticMethod" enabled="false" level="WARNING" enabled_by_default="false" /> - <inspection_tool class="ForCanBeForeach" enabled="false" level="WARNING" enabled_by_default="false"> - <option name="REPORT_INDEXED_LOOP" value="true" /> - <option name="ignoreUntypedCollections" value="false" /> - </inspection_tool> <inspection_tool class="ForLoopReplaceableByWhile" enabled="true" level="WARNING" enabled_by_default="true"> <option name="m_ignoreLoopsWithoutConditions" value="false" /> </inspection_tool> + <inspection_tool class="ForLoopThatDoesntUseLoopVariable" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="ForLoopWithMissingComponent" enabled="true" level="WARNING" enabled_by_default="true"> <option name="ignoreCollectionLoops" value="false" /> </inspection_tool> @@ -108,7 +153,28 @@ </inspection_tool> <inspection_tool class="InfiniteLoopStatement" enabled="false" level="WARNING" enabled_by_default="false" /> <inspection_tool class="InnerClassMayBeStatic" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="InstanceMethodNamingConvention" enabled="true" level="WARNING" enabled_by_default="true"> + <option name="m_regex" value="[a-z][A-Za-z\d]*" /> + <option name="m_minLength" value="3" /> + <option name="m_maxLength" value="32" /> + </inspection_tool> + <inspection_tool class="InstanceVariableNamingConvention" enabled="true" level="WARNING" enabled_by_default="true"> + <option name="m_regex" value="[a-z][A-Za-z\d]*" /> + <option name="m_minLength" value="2" /> + <option name="m_maxLength" value="30" /> + </inspection_tool> + <inspection_tool class="InstanceofCatchParameter" enabled="true" level="ERROR" enabled_by_default="true" /> + <inspection_tool class="InstanceofIncompatibleInterface" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="InstanceofThis" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="InstantiationOfUtilityClass" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="IntLiteralMayBeLongLiteral" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="InterfaceNamingConvention" enabled="true" level="WARNING" enabled_by_default="true"> + <option name="m_regex" value="[A-Z][A-Za-z\d]*" /> + <option name="m_minLength" value="3" /> + <option name="m_maxLength" value="64" /> + </inspection_tool> + <inspection_tool class="IteratorHasNextCallsIteratorNext" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="IteratorNextDoesNotThrowNoSuchElementException" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="JavaDoc" enabled="false" level="WARNING" enabled_by_default="false"> <option name="TOP_LEVEL_CLASS_OPTIONS"> <value> @@ -141,10 +207,23 @@ <option name="myAdditionalJavadocTags" value="" /> </inspection_tool> <inspection_tool class="JavadocReference" enabled="false" level="ERROR" enabled_by_default="false" /> + <inspection_tool class="KeySetIterationMayUseEntrySet" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="LengthOneStringInIndexOf" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="ListIndexOfReplaceableByContains" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="ListenerMayUseAdapter" enabled="true" level="WARNING" enabled_by_default="true"> <option name="checkForEmptyMethods" value="true" /> </inspection_tool> + <inspection_tool class="LocalVariableHidingMemberVariable" enabled="true" level="WARNING" enabled_by_default="true"> + <option name="m_ignoreInvisibleFields" value="true" /> + <option name="m_ignoreStaticMethods" value="true" /> + </inspection_tool> + <inspection_tool class="LocalVariableNamingConvention" enabled="true" level="WARNING" enabled_by_default="true"> + <option name="m_ignoreForLoopParameters" value="true" /> + <option name="m_ignoreCatchParameters" value="true" /> + <option name="m_regex" value="[a-z][A-Za-z\d]*" /> + <option name="m_minLength" value="2" /> + <option name="m_maxLength" value="30" /> + </inspection_tool> <inspection_tool class="LoggerInitializedWithForeignClass" enabled="false" level="WARNING" enabled_by_default="false"> <option name="loggerClassName" value="org.apache.log4j.Logger,org.slf4j.LoggerFactory,org.apache.commons.logging.LogFactory,java.util.logging.Logger" /> <option name="loggerFactoryMethodName" value="getLogger,getLogger,getLog,getLogger" /> @@ -153,10 +232,26 @@ <option name="ignoreIterators" value="false" /> </inspection_tool> <inspection_tool class="LoopWithImplicitTerminationCondition" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="MapReplaceableByEnumMap" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="MethodCanBeVariableArityMethod" enabled="false" level="WARNING" enabled_by_default="false"> + <option name="ignoreByteAndShortArrayParameters" value="true" /> + <option name="ignoreOverridingMethods" value="true" /> + </inspection_tool> + <inspection_tool class="MethodCoupling" enabled="false" level="WEAK WARNING" enabled_by_default="false"> + <option name="m_includeJavaClasses" value="false" /> + <option name="m_includeLibraryClasses" value="false" /> + <option name="m_limit" value="10" /> + </inspection_tool> <inspection_tool class="MethodMayBeStatic" enabled="true" level="ERROR" enabled_by_default="true"> <option name="m_onlyPrivateOrFinal" value="false" /> <option name="m_ignoreEmptyMethods" value="true" /> </inspection_tool> + <inspection_tool class="MethodMayBeSynchronized" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="MethodNamesDifferOnlyByCase" enabled="true" level="ERROR" enabled_by_default="true" /> + <inspection_tool class="MethodOverloadsParentMethod" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="MethodOverridesPackageLocalMethod" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="MethodOverridesPrivateMethod" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="MethodOverridesStaticMethod" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="MismatchedCollectionQueryUpdate" enabled="false" level="WARNING" enabled_by_default="false"> <option name="queryNames"> <value /> @@ -169,11 +264,35 @@ <option name="ignoreObjectMethods" value="true" /> <option name="ignoreAnonymousClassMethods" value="false" /> </inspection_tool> + <inspection_tool class="MisspelledCompareTo" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="MisspelledEquals" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="MisspelledHashcode" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="MisspelledToString" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="NakedNotify" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="NegatedIfElse" enabled="false" level="WARNING" enabled_by_default="false"> <option name="m_ignoreNegatedNullComparison" value="true" /> <option name="m_ignoreNegatedZeroComparison" value="true" /> </inspection_tool> + <inspection_tool class="NestedSynchronizedStatement" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="NestingDepth" enabled="false" level="WEAK WARNING" enabled_by_default="false"> + <option name="m_limit" value="5" /> + </inspection_tool> + <inspection_tool class="NonAtomicOperationOnVolatileField" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="NonBooleanMethodNameMayNotStartWithQuestion" enabled="true" level="TYPO" enabled_by_default="true"> + <option name="questionString" value="is,can,has,should,could,will,shall,contains,equals,startsWith,endsWith" /> + <option name="ignoreBooleanMethods" value="false" /> + <option name="onlyWarnOnBaseMethods" value="true" /> + </inspection_tool> + <inspection_tool class="NonCommentSourceStatements" enabled="false" level="WEAK WARNING" enabled_by_default="false"> + <option name="m_limit" value="30" /> + </inspection_tool> + <inspection_tool class="NonExceptionNameEndsWithException" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="NonFinalFieldInEnum" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="NonShortCircuitBoolean" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="NonSynchronizedMethodOverridesSynchronizedMethod" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="NotifyCalledOnCondition" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="NotifyNotInSynchronizedContext" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="NotifyWithoutCorrespondingWait" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="NullableProblems" enabled="true" level="ERROR" enabled_by_default="true"> <option name="REPORT_NULLABLE_METHOD_OVERRIDES_NOTNULL" value="true" /> <option name="REPORT_NOT_ANNOTATED_METHOD_OVERRIDES_NOTNULL" value="true" /> @@ -184,20 +303,49 @@ <option name="REPORT_ANNOTATION_NOT_PROPAGATED_TO_OVERRIDERS" value="true" /> <option name="REPORT_NULLS_PASSED_TO_NON_ANNOTATED_METHOD" value="true" /> </inspection_tool> - <inspection_tool class="ObjectEquality" enabled="true" level="WARNING" enabled_by_default="true"> - <option name="m_ignoreEnums" value="true" /> - <option name="m_ignoreClassObjects" value="false" /> - <option name="m_ignorePrivateConstructors" value="false" /> - </inspection_tool> + <inspection_tool class="ObjectNotify" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="ObjectToString" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="ObsoleteCollection" enabled="true" level="WARNING" enabled_by_default="true"> <option name="ignoreRequiredObsoleteCollectionTypes" value="false" /> </inspection_tool> + <inspection_tool class="OverloadedMethodsWithSameNumberOfParameters" enabled="true" level="WARNING" enabled_by_default="true"> + <option name="ignoreInconvertibleTypes" value="true" /> + </inspection_tool> + <inspection_tool class="PackageNamingConvention" enabled="true" level="TYPO" enabled_by_default="true"> + <option name="m_regex" value="[a-z]*" /> + <option name="m_minLength" value="2" /> + <option name="m_maxLength" value="16" /> + </inspection_tool> + <inspection_tool class="ParameterHidingMemberVariable" enabled="true" level="WARNING" enabled_by_default="true"> + <option name="m_ignoreInvisibleFields" value="true" /> + <option name="m_ignoreStaticMethodParametersHidingInstanceFields" value="true" /> + <option name="m_ignoreForConstructors" value="true" /> + <option name="m_ignoreForPropertySetters" value="true" /> + <option name="m_ignoreForAbstractMethods" value="false" /> + </inspection_tool> + <inspection_tool class="ParameterNameDiffersFromOverriddenParameter" enabled="false" level="WEAK WARNING" enabled_by_default="false"> + <option name="m_ignoreSingleCharacterNames" value="false" /> + <option name="m_ignoreOverridesOfLibraryMethods" value="false" /> + </inspection_tool> + <inspection_tool class="ParameterNamingConvention" enabled="true" level="WARNING" enabled_by_default="true"> + <option name="m_regex" value="[a-z][A-Za-z\d]*" /> + <option name="m_minLength" value="2" /> + <option name="m_maxLength" value="30" /> + </inspection_tool> <inspection_tool class="PointlessArithmeticExpression" enabled="false" level="WARNING" enabled_by_default="false"> <option name="m_ignoreExpressionsContainingConstants" value="false" /> </inspection_tool> <inspection_tool class="PointlessIndexOfComparison" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="PointlessNullCheck" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="ProtectedMemberInFinalClass" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="PublicFieldAccessedInSynchronizedContext" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="QuestionableName" enabled="true" level="WARNING" enabled_by_default="true"> + <option name="nameString" value="aa,abc,bad,bar,bar2,baz,baz1,baz2,baz3,bb,blah,bogus,bool,cc,dd,defau1t,dummy,dummy2,ee,fa1se,ff,foo,foo1,foo2,foo3,foobar,four,fred,fred1,fred2,gg,hh,hello,hello1,hello2,hello3,ii,nu11,one,silly,silly2,string,two,that,then,three,whi1e,var" /> + </inspection_tool> + <inspection_tool class="RandomDoubleForRandomInteger" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="RedundantArrayCreation" enabled="false" level="WARNING" enabled_by_default="false" /> + <inspection_tool class="RedundantStringFormatCall" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="ReplaceAllDot" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="ReplaceAssignmentWithOperatorAssignment" enabled="true" level="WARNING" enabled_by_default="true"> <option name="ignoreLazyOperators" value="true" /> <option name="ignoreObscureOperators" value="false" /> @@ -212,40 +360,88 @@ <option name="m_reportCollectionMethods" value="true" /> <option name="m_ignorePrivateMethods" value="false" /> </inspection_tool> + <inspection_tool class="SafeLock" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="SameParameterValue" enabled="false" level="WARNING" enabled_by_default="false" /> <inspection_tool class="SameReturnValue" enabled="false" level="WARNING" enabled_by_default="false" /> + <inspection_tool class="SharedThreadLocalRandom" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="SignalWithoutCorrespondingAwait" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="SimplifiableEqualsExpression" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="SimplifiableIfStatement" enabled="false" level="WARNING" enabled_by_default="false" /> + <inspection_tool class="Since15" enabled="true" level="ERROR" enabled_by_default="true"> + <effectiveLL value="JDK_1_6" /> + </inspection_tool> <inspection_tool class="SizeReplaceableByIsEmpty" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="SleepWhileHoldingLock" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="SpellCheckingInspection" enabled="false" level="TYPO" enabled_by_default="false"> <option name="processCode" value="true" /> <option name="processLiterals" value="true" /> <option name="processComments" value="true" /> </inspection_tool> + <inspection_tool class="StaticCallOnSubclass" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="StaticFieldReferenceOnSubclass" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="StaticMethodNamingConvention" enabled="true" level="WARNING" enabled_by_default="true"> + <option name="m_regex" value="[a-z][A-Za-z\d]*" /> + <option name="m_minLength" value="1" /> + <option name="m_maxLength" value="64" /> + </inspection_tool> + <inspection_tool class="StaticVariableNamingConvention" enabled="false" level="WARNING" enabled_by_default="false"> + <option name="checkMutableFinals" value="false" /> + <option name="m_regex" value="[a-z][A-Za-z\d]*" /> + <option name="m_minLength" value="3" /> + <option name="m_maxLength" value="30" /> + </inspection_tool> <inspection_tool class="StringBufferReplaceableByString" enabled="false" level="WARNING" enabled_by_default="false" /> <inspection_tool class="StringBufferToStringInConcatenation" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="StringConcatenationInFormatCall" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="StringConcatenationInMessageFormatCall" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="StringConcatenationMissingWhitespace" enabled="true" level="WARNING" enabled_by_default="true"> + <option name="ignoreNonStringLiterals" value="true" /> + </inspection_tool> <inspection_tool class="StringConstructor" enabled="false" level="WARNING" enabled_by_default="false"> <option name="ignoreSubstringArguments" value="false" /> </inspection_tool> - <inspection_tool class="SuspiciousMethodCalls" enabled="false" level="WARNING" enabled_by_default="false"> - <option name="REPORT_CONVERTIBLE_METHOD_CALLS" value="true" /> + <inspection_tool class="StringEqualsEmptyString" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="StringReplaceableByStringBuffer" enabled="true" level="WARNING" enabled_by_default="true"> + <option name="onlyWarnOnLoop" value="true" /> </inspection_tool> + <inspection_tool class="SubstringZero" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="SwitchStatementWithConfusingDeclaration" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="SwitchStatementWithTooFewBranches" enabled="true" level="WARNING" enabled_by_default="true"> <option name="m_limit" value="2" /> </inspection_tool> - <inspection_tool class="SynchronizationOnLocalVariableOrMethodParameter" enabled="false" level="WARNING" enabled_by_default="false"> - <option name="reportLocalVariables" value="true" /> - <option name="reportMethodParameters" value="true" /> - </inspection_tool> + <inspection_tool class="SynchronizeOnLock" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="SynchronizedOnLiteralObject" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="SyntaxError" enabled="false" level="ERROR" enabled_by_default="false" /> + <inspection_tool class="SystemGC" enabled="true" level="ERROR" enabled_by_default="true" /> <inspection_tool class="SystemOutErr" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="SystemRunFinalizersOnExit" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="TextLabelInSwitchStatement" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="ThreadDeathRethrown" enabled="true" level="ERROR" enabled_by_default="true" /> + <inspection_tool class="ThreadLocalNotStaticFinal" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="ThreadPriority" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="ThreadRun" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="ThreadStartInConstruction" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="ThreadStopSuspendResume" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="ThreadWithDefaultRunMethod" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="ThreadYield" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="ThreeNegationsPerMethod" enabled="false" level="WEAK WARNING" enabled_by_default="false"> + <option name="m_ignoreInEquals" value="true" /> + <option name="ignoreInAssert" value="false" /> + </inspection_tool> <inspection_tool class="TooBroadScope" enabled="true" level="WARNING" enabled_by_default="true"> <option name="m_allowConstructorAsInitializer" value="false" /> <option name="m_onlyLookAtBlocks" value="false" /> </inspection_tool> + <inspection_tool class="TrivialStringConcatenation" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="TryFinallyCanBeTryWithResources" enabled="false" level="WARNING" enabled_by_default="false" /> + <inspection_tool class="TypeParameterNamingConvention" enabled="true" level="WARNING" enabled_by_default="true"> + <option name="m_regex" value="[A-Z][A-Za-z\d]*" /> + <option name="m_minLength" value="1" /> + <option name="m_maxLength" value="16" /> + </inspection_tool> <inspection_tool class="UNCHECKED_WARNING" enabled="false" level="WARNING" enabled_by_default="false" /> + <inspection_tool class="UnaryPlus" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="UnconditionalWait" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="UnnecessarilyQualifiedStaticallyImportedElement" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="UnnecessaryBlockStatement" enabled="true" level="WARNING" enabled_by_default="true"> <option name="ignoreSwitchBranches" value="true" /> @@ -257,11 +453,16 @@ <inspection_tool class="UnnecessaryQualifierForThis" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="UnnecessarySemicolon" enabled="false" level="WARNING" enabled_by_default="false" /> <inspection_tool class="UnnecessarySuperConstructor" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="UnnecessaryUnaryMinus" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="UnusedAssignment" enabled="true" level="WARNING" enabled_by_default="true"> <option name="REPORT_PREFIX_EXPRESSIONS" value="false" /> <option name="REPORT_POSTFIX_EXPRESSIONS" value="false" /> <option name="REPORT_REDUNDANT_INITIALIZER" value="true" /> </inspection_tool> + <inspection_tool class="UnusedCatchParameter" enabled="true" level="WARNING" enabled_by_default="true"> + <option name="m_ignoreCatchBlocksWithComments" value="false" /> + <option name="m_ignoreTestCases" value="false" /> + </inspection_tool> <inspection_tool class="UnusedDeclaration" enabled="false" level="WARNING" enabled_by_default="false"> <option name="ADD_MAINS_TO_ENTRIES" value="true" /> <option name="ADD_APPLET_TO_ENTRIES" value="true" /> @@ -272,14 +473,26 @@ <inspection_tool class="UnusedParameters" enabled="false" level="WARNING" enabled_by_default="false" /> <inspection_tool class="UnusedProperty" enabled="false" level="WARNING" enabled_by_default="false" /> <inspection_tool class="UnusedReturnValue" enabled="false" level="WARNING" enabled_by_default="false" /> + <inspection_tool class="UpperCaseFieldNameNotConstant" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="UseOfPropertiesAsHashtable" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="UtilityClassWithPublicConstructor" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="WaitCalledOnCondition" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="WaitNotInLoop" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="WaitNotInSynchronizedContext" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="WaitOrAwaitWithoutTimeout" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="WaitWhileHoldingTwoLocks" enabled="true" level="WARNING" enabled_by_default="true" /> + <inspection_tool class="WaitWithoutCorrespondingNotify" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="WeakerAccess" enabled="false" level="WARNING" enabled_by_default="false"> <option name="SUGGEST_PACKAGE_LOCAL_FOR_MEMBERS" value="true" /> <option name="SUGGEST_PACKAGE_LOCAL_FOR_TOP_CLASSES" value="true" /> <option name="SUGGEST_PRIVATE_FOR_INNERS" value="false" /> </inspection_tool> + <inspection_tool class="WhileLoopSpinsOnField" enabled="true" level="WARNING" enabled_by_default="true"> + <option name="ignoreNonEmtpyLoops" value="false" /> + </inspection_tool> <inspection_tool class="XmlDuplicatedId" enabled="false" level="ERROR" enabled_by_default="false" /> <inspection_tool class="XmlHighlighting" enabled="false" level="ERROR" enabled_by_default="false" /> <inspection_tool class="XmlUnboundNsPrefix" enabled="false" level="WARNING" enabled_by_default="false" /> + <inspection_tool class="ZeroLengthArrayInitialization" enabled="true" level="WARNING" enabled_by_default="true" /> </profile> </component>
\ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml index aa26ebf..fd2a5a2 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -6,6 +6,8 @@ <module fileurl="file://$PROJECT_DIR$/main/cgeo.iml" filepath="$PROJECT_DIR$/main/cgeo.iml" /> <module fileurl="file://$PROJECT_DIR$/cgeo-calendar/cgeo-calendar.iml" filepath="$PROJECT_DIR$/cgeo-calendar/cgeo-calendar.iml" /> <module fileurl="file://$PROJECT_DIR$/cgeo-contacts/cgeo-contacts.iml" filepath="$PROJECT_DIR$/cgeo-contacts/cgeo-contacts.iml" /> + <module fileurl="file://$PROJECT_DIR$/google-play-services_lib/google-play-services_lib.iml" filepath="$PROJECT_DIR$/google-play-services_lib/google-play-services_lib.iml" /> + <module fileurl="file://$PROJECT_DIR$/google-play-services_lib/google-play-services_lib.iml" filepath="$PROJECT_DIR$/google-play-services_lib/google-play-services_lib.iml" /> <module fileurl="file://$PROJECT_DIR$/mapswithme-api/mapswithme-api.iml" filepath="$PROJECT_DIR$/mapswithme-api/mapswithme-api.iml" /> <module fileurl="file://$PROJECT_DIR$/tests/tests.iml" filepath="$PROJECT_DIR$/tests/tests.iml" /> </modules> diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 9d32e50..ef26a35 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -3,6 +3,8 @@ <component name="VcsDirectoryMappings"> <mapping directory="" vcs="" /> <mapping directory="$PROJECT_DIR$" vcs="Git" /> + <mapping directory="$PROJECT_DIR$" vcs="Git" /> + <mapping directory="$PROJECT_DIR$" vcs="Git" /> </component> </project> diff --git a/cgeo-calendar/build.gradle b/cgeo-calendar/build.gradle index 6b36270..b0d4747 100644 --- a/cgeo-calendar/build.gradle +++ b/cgeo-calendar/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.application' android { compileSdkVersion 19 - buildToolsVersion "19.1.0" + buildToolsVersion "20" @@ -26,4 +26,4 @@ android { dependencies { // The dependency to the ICalnder interface from the main project is missing // compile project(":main") is not working -}
\ No newline at end of file +} diff --git a/cgeo-contacts/build.gradle b/cgeo-contacts/build.gradle index e35cff8..6c6ea6a 100644 --- a/cgeo-contacts/build.gradle +++ b/cgeo-contacts/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.application' android { compileSdkVersion 19 - buildToolsVersion "19.1.0" + buildToolsVersion "20" @@ -28,4 +28,4 @@ dependencies { compile files('../main/compile-libs/org.eclipse.jdt.annotation_1.1.0.v20130513-1648.jar') // The depency to the ICalnder interface from the main project is missing // compile(:main) is not right -}
\ No newline at end of file +} diff --git a/google-play-services_lib/.classpath b/google-play-services_lib/.classpath new file mode 100644 index 0000000..c3c8602 --- /dev/null +++ b/google-play-services_lib/.classpath @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
+ <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="src" path="gen"/>
+ <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
+ <classpathentry kind="output" path="bin/classes"/>
+</classpath>
diff --git a/google-play-services_lib/.project b/google-play-services_lib/.project new file mode 100644 index 0000000..e10c7d5 --- /dev/null +++ b/google-play-services_lib/.project @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>google-play-services_lib</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>com.android.ide.eclipse.adt.ApkBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>com.android.ide.eclipse.adt.AndroidNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/google-play-services_lib/AndroidManifest.xml b/google-play-services_lib/AndroidManifest.xml new file mode 100644 index 0000000..d17da08 --- /dev/null +++ b/google-play-services_lib/AndroidManifest.xml @@ -0,0 +1,17 @@ +<!-- Copyright (C) 2012 The Android Open Source Project + + 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. +--><!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/ub-gcore-longhorn-release/vendor/unbundled_google/packages/OneUp/client/AndroidManifest.xml --><manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="5089000" android:versionName="5.0.89-000" package="com.google.android.gms"> + <uses-sdk android:minSdkVersion="9"/> + <application/> +</manifest> diff --git a/google-play-services_lib/README.txt b/google-play-services_lib/README.txt new file mode 100644 index 0000000..32f8d5e --- /dev/null +++ b/google-play-services_lib/README.txt @@ -0,0 +1,17 @@ +Library Project including Google Play services client jar. + +This can be used by an Android project to use the API's provided +by Google Play services. + +There is technically no source, but the src folder is necessary +to ensure that the build system works. The content is actually +located in the libs/ directory. + + +USAGE: + +Make sure you import this Android library project into your IDE +and set this project as a dependency. + +Note that if you use proguard, you will want to include the +options from proguard.txt in your configuration.
\ No newline at end of file diff --git a/google-play-services_lib/build.xml b/google-play-services_lib/build.xml new file mode 100644 index 0000000..f59a204 --- /dev/null +++ b/google-play-services_lib/build.xml @@ -0,0 +1,91 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project name="google_play_services_lib" default="help"> + + <!-- The local.properties file is created and updated by the 'android' tool. + It contains the path to the SDK. It should *NOT* be checked into + Version Control Systems. --> + <property file="local.properties" /> + + <!-- The ant.properties file can be created by you. It is only edited by the + 'android' tool to add properties to it. + This is the place to change some Ant specific build properties. + Here are some properties you may want to change/update: + + source.dir + The name of the source directory. Default is 'src'. + out.dir + The name of the output directory. Default is 'bin'. + + For other overridable properties, look at the beginning of the rules + files in the SDK, at tools/ant/build.xml + + Properties related to the SDK location or the project target should + be updated using the 'android' tool with the 'update' action. + + This file is an integral part of the build system for your + application and should be checked into Version Control Systems. + + --> + <property file="ant.properties" /> + + <!-- if sdk.dir was not set from one of the property file, then + get it from the ANDROID_HOME env var. + This must be done before we load project.properties since + the proguard config can use sdk.dir --> + <property environment="env" /> + <condition property="sdk.dir" value="${env.ANDROID_HOME}"> + <isset property="env.ANDROID_HOME" /> + </condition> + + <!-- The project.properties file is created and updated by the 'android' + tool, as well as ADT. + + This contains project specific properties such as project target, and library + dependencies. Lower level build properties are stored in ant.properties + (or in .classpath for Eclipse projects). + + This file is an integral part of the build system for your + application and should be checked into Version Control Systems. --> + <loadproperties srcFile="project.properties" /> + + <!-- quick check on sdk.dir --> + <fail + message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable." + unless="sdk.dir" /> + + <!-- + Import per project custom build rules if present at the root of the project. + This is the place to put custom intermediary targets such as: + -pre-build + -pre-compile + -post-compile (This is typically used for code obfuscation. + Compiled code location: ${out.classes.absolute.dir} + If this is not done in place, override ${out.dex.input.absolute.dir}) + -post-package + -post-build + -pre-clean + --> + <import file="custom_rules.xml" optional="true" /> + + <!-- Import the actual build file. + + To customize existing targets, there are two options: + - Customize only one target: + - copy/paste the target into this file, *before* the + <import> task. + - customize it to your needs. + - Customize the whole content of build.xml + - copy/paste the content of the rules files (minus the top node) + into this file, replacing the <import> task. + - customize to your needs. + + *********************** + ****** IMPORTANT ****** + *********************** + In all cases you must update the value of version-tag below to read 'custom' instead of an integer, + in order to avoid having your file be overridden by tools such as "android update project" + --> + <!-- version-tag: 1 --> + <import file="${sdk.dir}/tools/ant/build.xml" /> + +</project> diff --git a/google-play-services_lib/google-play-services_lib.iml b/google-play-services_lib/google-play-services_lib.iml new file mode 100644 index 0000000..22663f6 --- /dev/null +++ b/google-play-services_lib/google-play-services_lib.iml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<module external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="GRADLE" external.system.module.group="" external.system.module.version="unspecified" type="JAVA_MODULE" version="4"> + <component name="FacetManager"> + <facet type="android" name="Android"> + <configuration> + <option name="LIBRARY_PROJECT" value="true" /> + </configuration> + </facet> + </component> + <component name="NewModuleRootManager" inherit-compiler-output="true"> + <exclude-output /> + <content url="file://$MODULE_DIR$"> + <sourceFolder url="file://$MODULE_DIR$/gen" isTestSource="false" generated="true" /> + <excludeFolder url="file://$MODULE_DIR$/.gradle" /> + <excludeFolder url="file://$MODULE_DIR$/build" /> + </content> + <orderEntry type="inheritedJdk" /> + <orderEntry type="sourceFolder" forTests="false" /> + <orderEntry type="module-library" exported=""> + <library> + <CLASSES> + <root url="file://$MODULE_DIR$/libs" /> + </CLASSES> + <JAVADOC /> + <SOURCES /> + <jarDirectory url="file://$MODULE_DIR$/libs" recursive="false" /> + </library> + </orderEntry> + </component> +</module> + diff --git a/google-play-services_lib/libs/google-play-services.jar b/google-play-services_lib/libs/google-play-services.jar Binary files differnew file mode 100644 index 0000000..2b1aa4d --- /dev/null +++ b/google-play-services_lib/libs/google-play-services.jar diff --git a/google-play-services_lib/libs/google-play-services.jar.properties b/google-play-services_lib/libs/google-play-services.jar.properties new file mode 100644 index 0000000..429687b --- /dev/null +++ b/google-play-services_lib/libs/google-play-services.jar.properties @@ -0,0 +1 @@ +doc=../../../docs/reference diff --git a/google-play-services_lib/proguard.txt b/google-play-services_lib/proguard.txt new file mode 100644 index 0000000..0c9693a --- /dev/null +++ b/google-play-services_lib/proguard.txt @@ -0,0 +1,20 @@ +-keep class * extends java.util.ListResourceBundle { + protected Object[][] getContents(); +} + +# Keep SafeParcelable value, needed for reflection. This is required to support backwards +# compatibility of some classes. +-keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable { + public static final *** NULL; +} + +# Keep the names of classes/members we need for client functionality. +-keepnames @com.google.android.gms.common.annotation.KeepName class * +-keepclassmembernames class * { + @com.google.android.gms.common.annotation.KeepName *; +} + +# Needed for Parcelable/SafeParcelable Creators to not get stripped +-keepnames class * implements android.os.Parcelable { + public static final ** CREATOR; +}
\ No newline at end of file diff --git a/google-play-services_lib/project.properties b/google-play-services_lib/project.properties new file mode 100644 index 0000000..91d2b02 --- /dev/null +++ b/google-play-services_lib/project.properties @@ -0,0 +1,15 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system edit +# "ant.properties", and override values to adapt the script to your +# project structure. +# +# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): +#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt + +# Project target. +target=android-19 +android.library=true diff --git a/google-play-services_lib/res/color/common_signin_btn_text_dark.xml b/google-play-services_lib/res/color/common_signin_btn_text_dark.xml new file mode 100644 index 0000000..a615ba2 --- /dev/null +++ b/google-play-services_lib/res/color/common_signin_btn_text_dark.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item + android:state_pressed="true" + android:color="@color/common_signin_btn_dark_text_pressed" /> + <item + android:state_enabled="false" + android:state_focused="true" + android:color="@color/common_signin_btn_dark_text_disabled" /> + <item + android:state_focused="true" + android:color="@color/common_signin_btn_dark_text_focused" /> + <item + android:state_enabled="false" + android:color="@color/common_signin_btn_dark_text_disabled" /> + <item + android:color="@color/common_signin_btn_dark_text_default" /> +</selector> diff --git a/google-play-services_lib/res/color/common_signin_btn_text_light.xml b/google-play-services_lib/res/color/common_signin_btn_text_light.xml new file mode 100644 index 0000000..6620668 --- /dev/null +++ b/google-play-services_lib/res/color/common_signin_btn_text_light.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item + android:state_pressed="true" + android:color="@color/common_signin_btn_light_text_pressed" /> + <item + android:state_enabled="false" + android:state_focused="true" + android:color="@color/common_signin_btn_light_text_disabled" /> + <item + android:state_focused="true" + android:color="@color/common_signin_btn_light_text_focused" /> + <item + android:state_enabled="false" + android:color="@color/common_signin_btn_light_text_disabled" /> + <item + android:color="@color/common_signin_btn_light_text_default" /> +</selector> diff --git a/google-play-services_lib/res/color/wallet_primary_text_holo_light.xml b/google-play-services_lib/res/color/wallet_primary_text_holo_light.xml new file mode 100644 index 0000000..9c2c0fb --- /dev/null +++ b/google-play-services_lib/res/color/wallet_primary_text_holo_light.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright 2014 Google Inc. All Rights Reserved. --> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_enabled="false" android:color="@color/wallet_bright_foreground_disabled_holo_light"/> + <item android:state_window_focused="false" android:color="@color/wallet_bright_foreground_holo_light"/> + <item android:state_pressed="true" android:color="@color/wallet_bright_foreground_holo_light"/> + <item android:state_selected="true" android:color="@color/wallet_bright_foreground_holo_light"/> + <item android:color="@color/wallet_bright_foreground_holo_light"/> <!-- not selected --> +</selector> diff --git a/google-play-services_lib/res/color/wallet_secondary_text_holo_dark.xml b/google-play-services_lib/res/color/wallet_secondary_text_holo_dark.xml new file mode 100644 index 0000000..0fa1a76 --- /dev/null +++ b/google-play-services_lib/res/color/wallet_secondary_text_holo_dark.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright 2014 Google Inc. All Rights Reserved. --> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_window_focused="false" android:state_enabled="false" android:color="@color/wallet_dim_foreground_disabled_holo_dark"/> + <item android:state_window_focused="false" android:color="@color/wallet_dim_foreground_holo_dark"/> + <item android:state_selected="true" android:state_enabled="false" android:color="@color/wallet_dim_foreground_disabled_holo_dark"/> + <item android:state_pressed="true" android:state_enabled="false" android:color="@color/wallet_dim_foreground_disabled_holo_dark"/> + <item android:state_selected="true" android:color="@color/wallet_dim_foreground_holo_dark"/> + <item android:state_pressed="true" android:color="@color/wallet_dim_foreground_holo_dark"/> + <item android:state_enabled="false" android:color="@color/wallet_dim_foreground_disabled_holo_dark"/> + <item android:color="@color/wallet_dim_foreground_holo_dark"/> <!-- not selected --> +</selector>
\ No newline at end of file diff --git a/google-play-services_lib/res/drawable-hdpi/common_signin_btn_icon_disabled_dark.9.png b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_icon_disabled_dark.9.png Binary files differnew file mode 100644 index 0000000..0f9e791 --- /dev/null +++ b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_icon_disabled_dark.9.png diff --git a/google-play-services_lib/res/drawable-hdpi/common_signin_btn_icon_disabled_focus_dark.9.png b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_icon_disabled_focus_dark.9.png Binary files differnew file mode 100644 index 0000000..570e432 --- /dev/null +++ b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_icon_disabled_focus_dark.9.png diff --git a/google-play-services_lib/res/drawable-hdpi/common_signin_btn_icon_disabled_focus_light.9.png b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_icon_disabled_focus_light.9.png Binary files differnew file mode 100644 index 0000000..570e432 --- /dev/null +++ b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_icon_disabled_focus_light.9.png diff --git a/google-play-services_lib/res/drawable-hdpi/common_signin_btn_icon_disabled_light.9.png b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_icon_disabled_light.9.png Binary files differnew file mode 100644 index 0000000..0f9e791 --- /dev/null +++ b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_icon_disabled_light.9.png diff --git a/google-play-services_lib/res/drawable-hdpi/common_signin_btn_icon_focus_dark.9.png b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_icon_focus_dark.9.png Binary files differnew file mode 100644 index 0000000..f507b9f --- /dev/null +++ b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_icon_focus_dark.9.png diff --git a/google-play-services_lib/res/drawable-hdpi/common_signin_btn_icon_focus_light.9.png b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_icon_focus_light.9.png Binary files differnew file mode 100644 index 0000000..d5625e5 --- /dev/null +++ b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_icon_focus_light.9.png diff --git a/google-play-services_lib/res/drawable-hdpi/common_signin_btn_icon_normal_dark.9.png b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_icon_normal_dark.9.png Binary files differnew file mode 100644 index 0000000..aea3c0d --- /dev/null +++ b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_icon_normal_dark.9.png diff --git a/google-play-services_lib/res/drawable-hdpi/common_signin_btn_icon_normal_light.9.png b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_icon_normal_light.9.png Binary files differnew file mode 100644 index 0000000..849e89f --- /dev/null +++ b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_icon_normal_light.9.png diff --git a/google-play-services_lib/res/drawable-hdpi/common_signin_btn_icon_pressed_dark.9.png b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_icon_pressed_dark.9.png Binary files differnew file mode 100644 index 0000000..f4ab2f2 --- /dev/null +++ b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_icon_pressed_dark.9.png diff --git a/google-play-services_lib/res/drawable-hdpi/common_signin_btn_icon_pressed_light.9.png b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_icon_pressed_light.9.png Binary files differnew file mode 100644 index 0000000..9fe611d --- /dev/null +++ b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_icon_pressed_light.9.png diff --git a/google-play-services_lib/res/drawable-hdpi/common_signin_btn_text_disabled_dark.9.png b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_text_disabled_dark.9.png Binary files differnew file mode 100644 index 0000000..bbcde39 --- /dev/null +++ b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_text_disabled_dark.9.png diff --git a/google-play-services_lib/res/drawable-hdpi/common_signin_btn_text_disabled_focus_dark.9.png b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_text_disabled_focus_dark.9.png Binary files differnew file mode 100644 index 0000000..53957b6 --- /dev/null +++ b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_text_disabled_focus_dark.9.png diff --git a/google-play-services_lib/res/drawable-hdpi/common_signin_btn_text_disabled_focus_light.9.png b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_text_disabled_focus_light.9.png Binary files differnew file mode 100644 index 0000000..53957b6 --- /dev/null +++ b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_text_disabled_focus_light.9.png diff --git a/google-play-services_lib/res/drawable-hdpi/common_signin_btn_text_disabled_light.9.png b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_text_disabled_light.9.png Binary files differnew file mode 100644 index 0000000..bbcde39 --- /dev/null +++ b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_text_disabled_light.9.png diff --git a/google-play-services_lib/res/drawable-hdpi/common_signin_btn_text_focus_dark.9.png b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_text_focus_dark.9.png Binary files differnew file mode 100644 index 0000000..000d12e --- /dev/null +++ b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_text_focus_dark.9.png diff --git a/google-play-services_lib/res/drawable-hdpi/common_signin_btn_text_focus_light.9.png b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_text_focus_light.9.png Binary files differnew file mode 100644 index 0000000..d927940 --- /dev/null +++ b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_text_focus_light.9.png diff --git a/google-play-services_lib/res/drawable-hdpi/common_signin_btn_text_normal_dark.9.png b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_text_normal_dark.9.png Binary files differnew file mode 100644 index 0000000..67f263c --- /dev/null +++ b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_text_normal_dark.9.png diff --git a/google-play-services_lib/res/drawable-hdpi/common_signin_btn_text_normal_light.9.png b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_text_normal_light.9.png Binary files differnew file mode 100644 index 0000000..96324c5 --- /dev/null +++ b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_text_normal_light.9.png diff --git a/google-play-services_lib/res/drawable-hdpi/common_signin_btn_text_pressed_dark.9.png b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_text_pressed_dark.9.png Binary files differnew file mode 100644 index 0000000..e450312 --- /dev/null +++ b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_text_pressed_dark.9.png diff --git a/google-play-services_lib/res/drawable-hdpi/common_signin_btn_text_pressed_light.9.png b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_text_pressed_light.9.png Binary files differnew file mode 100644 index 0000000..fb94b77 --- /dev/null +++ b/google-play-services_lib/res/drawable-hdpi/common_signin_btn_text_pressed_light.9.png diff --git a/google-play-services_lib/res/drawable-hdpi/ic_plusone_medium_off_client.png b/google-play-services_lib/res/drawable-hdpi/ic_plusone_medium_off_client.png Binary files differnew file mode 100644 index 0000000..894f1b9 --- /dev/null +++ b/google-play-services_lib/res/drawable-hdpi/ic_plusone_medium_off_client.png diff --git a/google-play-services_lib/res/drawable-hdpi/ic_plusone_small_off_client.png b/google-play-services_lib/res/drawable-hdpi/ic_plusone_small_off_client.png Binary files differnew file mode 100644 index 0000000..ac77761 --- /dev/null +++ b/google-play-services_lib/res/drawable-hdpi/ic_plusone_small_off_client.png diff --git a/google-play-services_lib/res/drawable-hdpi/ic_plusone_standard_off_client.png b/google-play-services_lib/res/drawable-hdpi/ic_plusone_standard_off_client.png Binary files differnew file mode 100644 index 0000000..f1c32d3 --- /dev/null +++ b/google-play-services_lib/res/drawable-hdpi/ic_plusone_standard_off_client.png diff --git a/google-play-services_lib/res/drawable-hdpi/ic_plusone_tall_off_client.png b/google-play-services_lib/res/drawable-hdpi/ic_plusone_tall_off_client.png Binary files differnew file mode 100644 index 0000000..08a4670 --- /dev/null +++ b/google-play-services_lib/res/drawable-hdpi/ic_plusone_tall_off_client.png diff --git a/google-play-services_lib/res/drawable-hdpi/powered_by_google_dark.png b/google-play-services_lib/res/drawable-hdpi/powered_by_google_dark.png Binary files differnew file mode 100644 index 0000000..721905c --- /dev/null +++ b/google-play-services_lib/res/drawable-hdpi/powered_by_google_dark.png diff --git a/google-play-services_lib/res/drawable-hdpi/powered_by_google_light.png b/google-play-services_lib/res/drawable-hdpi/powered_by_google_light.png Binary files differnew file mode 100644 index 0000000..53328af --- /dev/null +++ b/google-play-services_lib/res/drawable-hdpi/powered_by_google_light.png diff --git a/google-play-services_lib/res/drawable-mdpi/common_signin_btn_icon_disabled_dark.9.png b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_icon_disabled_dark.9.png Binary files differnew file mode 100644 index 0000000..dddcbeb --- /dev/null +++ b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_icon_disabled_dark.9.png diff --git a/google-play-services_lib/res/drawable-mdpi/common_signin_btn_icon_disabled_focus_dark.9.png b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_icon_disabled_focus_dark.9.png Binary files differnew file mode 100644 index 0000000..58b75bd --- /dev/null +++ b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_icon_disabled_focus_dark.9.png diff --git a/google-play-services_lib/res/drawable-mdpi/common_signin_btn_icon_disabled_focus_light.9.png b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_icon_disabled_focus_light.9.png Binary files differnew file mode 100644 index 0000000..58b75bd --- /dev/null +++ b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_icon_disabled_focus_light.9.png diff --git a/google-play-services_lib/res/drawable-mdpi/common_signin_btn_icon_disabled_light.9.png b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_icon_disabled_light.9.png Binary files differnew file mode 100644 index 0000000..dddcbeb --- /dev/null +++ b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_icon_disabled_light.9.png diff --git a/google-play-services_lib/res/drawable-mdpi/common_signin_btn_icon_focus_dark.9.png b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_icon_focus_dark.9.png Binary files differnew file mode 100644 index 0000000..7d9ed78 --- /dev/null +++ b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_icon_focus_dark.9.png diff --git a/google-play-services_lib/res/drawable-mdpi/common_signin_btn_icon_focus_light.9.png b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_icon_focus_light.9.png Binary files differnew file mode 100644 index 0000000..0ca401d --- /dev/null +++ b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_icon_focus_light.9.png diff --git a/google-play-services_lib/res/drawable-mdpi/common_signin_btn_icon_normal_dark.9.png b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_icon_normal_dark.9.png Binary files differnew file mode 100644 index 0000000..f2c3f55 --- /dev/null +++ b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_icon_normal_dark.9.png diff --git a/google-play-services_lib/res/drawable-mdpi/common_signin_btn_icon_normal_light.9.png b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_icon_normal_light.9.png Binary files differnew file mode 100644 index 0000000..83b4fc9 --- /dev/null +++ b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_icon_normal_light.9.png diff --git a/google-play-services_lib/res/drawable-mdpi/common_signin_btn_icon_pressed_dark.9.png b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_icon_pressed_dark.9.png Binary files differnew file mode 100644 index 0000000..dd74fe8 --- /dev/null +++ b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_icon_pressed_dark.9.png diff --git a/google-play-services_lib/res/drawable-mdpi/common_signin_btn_icon_pressed_light.9.png b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_icon_pressed_light.9.png Binary files differnew file mode 100644 index 0000000..b7dc7aa --- /dev/null +++ b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_icon_pressed_light.9.png diff --git a/google-play-services_lib/res/drawable-mdpi/common_signin_btn_text_disabled_dark.9.png b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_text_disabled_dark.9.png Binary files differnew file mode 100644 index 0000000..efdfe2e --- /dev/null +++ b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_text_disabled_dark.9.png diff --git a/google-play-services_lib/res/drawable-mdpi/common_signin_btn_text_disabled_focus_dark.9.png b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_text_disabled_focus_dark.9.png Binary files differnew file mode 100644 index 0000000..c7650b0 --- /dev/null +++ b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_text_disabled_focus_dark.9.png diff --git a/google-play-services_lib/res/drawable-mdpi/common_signin_btn_text_disabled_focus_light.9.png b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_text_disabled_focus_light.9.png Binary files differnew file mode 100644 index 0000000..c7650b0 --- /dev/null +++ b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_text_disabled_focus_light.9.png diff --git a/google-play-services_lib/res/drawable-mdpi/common_signin_btn_text_disabled_light.9.png b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_text_disabled_light.9.png Binary files differnew file mode 100644 index 0000000..efdfe2e --- /dev/null +++ b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_text_disabled_light.9.png diff --git a/google-play-services_lib/res/drawable-mdpi/common_signin_btn_text_focus_dark.9.png b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_text_focus_dark.9.png Binary files differnew file mode 100644 index 0000000..8c76283 --- /dev/null +++ b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_text_focus_dark.9.png diff --git a/google-play-services_lib/res/drawable-mdpi/common_signin_btn_text_focus_light.9.png b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_text_focus_light.9.png Binary files differnew file mode 100644 index 0000000..abd26bc --- /dev/null +++ b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_text_focus_light.9.png diff --git a/google-play-services_lib/res/drawable-mdpi/common_signin_btn_text_normal_dark.9.png b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_text_normal_dark.9.png Binary files differnew file mode 100644 index 0000000..28181c3 --- /dev/null +++ b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_text_normal_dark.9.png diff --git a/google-play-services_lib/res/drawable-mdpi/common_signin_btn_text_normal_light.9.png b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_text_normal_light.9.png Binary files differnew file mode 100644 index 0000000..34957fa --- /dev/null +++ b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_text_normal_light.9.png diff --git a/google-play-services_lib/res/drawable-mdpi/common_signin_btn_text_pressed_dark.9.png b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_text_pressed_dark.9.png Binary files differnew file mode 100644 index 0000000..e923ee9 --- /dev/null +++ b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_text_pressed_dark.9.png diff --git a/google-play-services_lib/res/drawable-mdpi/common_signin_btn_text_pressed_light.9.png b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_text_pressed_light.9.png Binary files differnew file mode 100644 index 0000000..34cf6bb --- /dev/null +++ b/google-play-services_lib/res/drawable-mdpi/common_signin_btn_text_pressed_light.9.png diff --git a/google-play-services_lib/res/drawable-mdpi/ic_plusone_medium_off_client.png b/google-play-services_lib/res/drawable-mdpi/ic_plusone_medium_off_client.png Binary files differnew file mode 100644 index 0000000..d7e5777 --- /dev/null +++ b/google-play-services_lib/res/drawable-mdpi/ic_plusone_medium_off_client.png diff --git a/google-play-services_lib/res/drawable-mdpi/ic_plusone_small_off_client.png b/google-play-services_lib/res/drawable-mdpi/ic_plusone_small_off_client.png Binary files differnew file mode 100644 index 0000000..af301c2 --- /dev/null +++ b/google-play-services_lib/res/drawable-mdpi/ic_plusone_small_off_client.png diff --git a/google-play-services_lib/res/drawable-mdpi/ic_plusone_standard_off_client.png b/google-play-services_lib/res/drawable-mdpi/ic_plusone_standard_off_client.png Binary files differnew file mode 100644 index 0000000..f43e965 --- /dev/null +++ b/google-play-services_lib/res/drawable-mdpi/ic_plusone_standard_off_client.png diff --git a/google-play-services_lib/res/drawable-mdpi/ic_plusone_tall_off_client.png b/google-play-services_lib/res/drawable-mdpi/ic_plusone_tall_off_client.png Binary files differnew file mode 100644 index 0000000..0b2b5c9 --- /dev/null +++ b/google-play-services_lib/res/drawable-mdpi/ic_plusone_tall_off_client.png diff --git a/google-play-services_lib/res/drawable-mdpi/powered_by_google_dark.png b/google-play-services_lib/res/drawable-mdpi/powered_by_google_dark.png Binary files differnew file mode 100644 index 0000000..a152807 --- /dev/null +++ b/google-play-services_lib/res/drawable-mdpi/powered_by_google_dark.png diff --git a/google-play-services_lib/res/drawable-mdpi/powered_by_google_light.png b/google-play-services_lib/res/drawable-mdpi/powered_by_google_light.png Binary files differnew file mode 100644 index 0000000..015a0ad --- /dev/null +++ b/google-play-services_lib/res/drawable-mdpi/powered_by_google_light.png diff --git a/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_icon_disabled_dark.9.png b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_icon_disabled_dark.9.png Binary files differnew file mode 100644 index 0000000..9044a11 --- /dev/null +++ b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_icon_disabled_dark.9.png diff --git a/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_icon_disabled_focus_dark.9.png b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_icon_disabled_focus_dark.9.png Binary files differnew file mode 100644 index 0000000..e94a49b --- /dev/null +++ b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_icon_disabled_focus_dark.9.png diff --git a/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_icon_disabled_focus_light.9.png b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_icon_disabled_focus_light.9.png Binary files differnew file mode 100644 index 0000000..e94a49b --- /dev/null +++ b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_icon_disabled_focus_light.9.png diff --git a/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_icon_disabled_light.9.png b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_icon_disabled_light.9.png Binary files differnew file mode 100644 index 0000000..9044a11 --- /dev/null +++ b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_icon_disabled_light.9.png diff --git a/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_icon_focus_dark.9.png b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_icon_focus_dark.9.png Binary files differnew file mode 100644 index 0000000..bfe4f04 --- /dev/null +++ b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_icon_focus_dark.9.png diff --git a/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_icon_focus_light.9.png b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_icon_focus_light.9.png Binary files differnew file mode 100644 index 0000000..876884f --- /dev/null +++ b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_icon_focus_light.9.png diff --git a/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_icon_normal_dark.9.png b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_icon_normal_dark.9.png Binary files differnew file mode 100644 index 0000000..b3e6dd5 --- /dev/null +++ b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_icon_normal_dark.9.png diff --git a/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_icon_normal_light.9.png b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_icon_normal_light.9.png Binary files differnew file mode 100644 index 0000000..5a888f2 --- /dev/null +++ b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_icon_normal_light.9.png diff --git a/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_icon_pressed_dark.9.png b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_icon_pressed_dark.9.png Binary files differnew file mode 100644 index 0000000..d0f7b4c --- /dev/null +++ b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_icon_pressed_dark.9.png diff --git a/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_icon_pressed_light.9.png b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_icon_pressed_light.9.png Binary files differnew file mode 100644 index 0000000..0db6b06 --- /dev/null +++ b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_icon_pressed_light.9.png diff --git a/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_text_disabled_dark.9.png b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_text_disabled_dark.9.png Binary files differnew file mode 100644 index 0000000..d182b5e --- /dev/null +++ b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_text_disabled_dark.9.png diff --git a/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_text_disabled_focus_dark.9.png b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_text_disabled_focus_dark.9.png Binary files differnew file mode 100644 index 0000000..47e2aea --- /dev/null +++ b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_text_disabled_focus_dark.9.png diff --git a/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_text_disabled_focus_light.9.png b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_text_disabled_focus_light.9.png Binary files differnew file mode 100644 index 0000000..47e2aea --- /dev/null +++ b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_text_disabled_focus_light.9.png diff --git a/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_text_disabled_light.9.png b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_text_disabled_light.9.png Binary files differnew file mode 100644 index 0000000..d182b5e --- /dev/null +++ b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_text_disabled_light.9.png diff --git a/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_text_focus_dark.9.png b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_text_focus_dark.9.png Binary files differnew file mode 100644 index 0000000..64e9706 --- /dev/null +++ b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_text_focus_dark.9.png diff --git a/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_text_focus_light.9.png b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_text_focus_light.9.png Binary files differnew file mode 100644 index 0000000..0fd8cdd --- /dev/null +++ b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_text_focus_light.9.png diff --git a/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_text_normal_dark.9.png b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_text_normal_dark.9.png Binary files differnew file mode 100644 index 0000000..3427b47 --- /dev/null +++ b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_text_normal_dark.9.png diff --git a/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_text_normal_light.9.png b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_text_normal_light.9.png Binary files differnew file mode 100644 index 0000000..31e38c4 --- /dev/null +++ b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_text_normal_light.9.png diff --git a/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_text_pressed_dark.9.png b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_text_pressed_dark.9.png Binary files differnew file mode 100644 index 0000000..e6a7880 --- /dev/null +++ b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_text_pressed_dark.9.png diff --git a/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_text_pressed_light.9.png b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_text_pressed_light.9.png Binary files differnew file mode 100644 index 0000000..972962d --- /dev/null +++ b/google-play-services_lib/res/drawable-xhdpi/common_signin_btn_text_pressed_light.9.png diff --git a/google-play-services_lib/res/drawable-xhdpi/ic_plusone_medium_off_client.png b/google-play-services_lib/res/drawable-xhdpi/ic_plusone_medium_off_client.png Binary files differnew file mode 100644 index 0000000..bb93309 --- /dev/null +++ b/google-play-services_lib/res/drawable-xhdpi/ic_plusone_medium_off_client.png diff --git a/google-play-services_lib/res/drawable-xhdpi/ic_plusone_small_off_client.png b/google-play-services_lib/res/drawable-xhdpi/ic_plusone_small_off_client.png Binary files differnew file mode 100644 index 0000000..6174fcd --- /dev/null +++ b/google-play-services_lib/res/drawable-xhdpi/ic_plusone_small_off_client.png diff --git a/google-play-services_lib/res/drawable-xhdpi/ic_plusone_standard_off_client.png b/google-play-services_lib/res/drawable-xhdpi/ic_plusone_standard_off_client.png Binary files differnew file mode 100644 index 0000000..6a4c298 --- /dev/null +++ b/google-play-services_lib/res/drawable-xhdpi/ic_plusone_standard_off_client.png diff --git a/google-play-services_lib/res/drawable-xhdpi/ic_plusone_tall_off_client.png b/google-play-services_lib/res/drawable-xhdpi/ic_plusone_tall_off_client.png Binary files differnew file mode 100644 index 0000000..f68e913 --- /dev/null +++ b/google-play-services_lib/res/drawable-xhdpi/ic_plusone_tall_off_client.png diff --git a/google-play-services_lib/res/drawable-xhdpi/powered_by_google_dark.png b/google-play-services_lib/res/drawable-xhdpi/powered_by_google_dark.png Binary files differnew file mode 100644 index 0000000..ffd9126 --- /dev/null +++ b/google-play-services_lib/res/drawable-xhdpi/powered_by_google_dark.png diff --git a/google-play-services_lib/res/drawable-xhdpi/powered_by_google_light.png b/google-play-services_lib/res/drawable-xhdpi/powered_by_google_light.png Binary files differnew file mode 100644 index 0000000..d9f0593 --- /dev/null +++ b/google-play-services_lib/res/drawable-xhdpi/powered_by_google_light.png diff --git a/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_icon_disabled_dark.9.png b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_icon_disabled_dark.9.png Binary files differnew file mode 100644 index 0000000..c97f349 --- /dev/null +++ b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_icon_disabled_dark.9.png diff --git a/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_icon_disabled_focus_dark.9.png b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_icon_disabled_focus_dark.9.png Binary files differnew file mode 100644 index 0000000..34cbff1 --- /dev/null +++ b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_icon_disabled_focus_dark.9.png diff --git a/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_icon_disabled_focus_light.9.png b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_icon_disabled_focus_light.9.png Binary files differnew file mode 100644 index 0000000..34cbff1 --- /dev/null +++ b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_icon_disabled_focus_light.9.png diff --git a/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_icon_disabled_light.9.png b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_icon_disabled_light.9.png Binary files differnew file mode 100644 index 0000000..c97f349 --- /dev/null +++ b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_icon_disabled_light.9.png diff --git a/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_icon_focus_dark.9.png b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_icon_focus_dark.9.png Binary files differnew file mode 100644 index 0000000..702c49b --- /dev/null +++ b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_icon_focus_dark.9.png diff --git a/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_icon_focus_light.9.png b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_icon_focus_light.9.png Binary files differnew file mode 100644 index 0000000..06ad5a5 --- /dev/null +++ b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_icon_focus_light.9.png diff --git a/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_icon_normal_dark.9.png b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_icon_normal_dark.9.png Binary files differnew file mode 100644 index 0000000..af160fc --- /dev/null +++ b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_icon_normal_dark.9.png diff --git a/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_icon_normal_light.9.png b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_icon_normal_light.9.png Binary files differnew file mode 100644 index 0000000..c647fb4 --- /dev/null +++ b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_icon_normal_light.9.png diff --git a/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_icon_pressed_dark.9.png b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_icon_pressed_dark.9.png Binary files differnew file mode 100644 index 0000000..fd0a431 --- /dev/null +++ b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_icon_pressed_dark.9.png diff --git a/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_icon_pressed_light.9.png b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_icon_pressed_light.9.png Binary files differnew file mode 100644 index 0000000..f8ce5a6 --- /dev/null +++ b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_icon_pressed_light.9.png diff --git a/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_text_disabled_dark.9.png b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_text_disabled_dark.9.png Binary files differnew file mode 100644 index 0000000..b491f62 --- /dev/null +++ b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_text_disabled_dark.9.png diff --git a/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_text_disabled_focus_dark.9.png b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_text_disabled_focus_dark.9.png Binary files differnew file mode 100644 index 0000000..777c8d6 --- /dev/null +++ b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_text_disabled_focus_dark.9.png diff --git a/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_text_disabled_focus_light.9.png b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_text_disabled_focus_light.9.png Binary files differnew file mode 100644 index 0000000..777c8d6 --- /dev/null +++ b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_text_disabled_focus_light.9.png diff --git a/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_text_disabled_light.9.png b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_text_disabled_light.9.png Binary files differnew file mode 100644 index 0000000..b491f62 --- /dev/null +++ b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_text_disabled_light.9.png diff --git a/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_text_focus_dark.9.png b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_text_focus_dark.9.png Binary files differnew file mode 100644 index 0000000..c8a8f1c --- /dev/null +++ b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_text_focus_dark.9.png diff --git a/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_text_focus_light.9.png b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_text_focus_light.9.png Binary files differnew file mode 100644 index 0000000..bcd0d0c --- /dev/null +++ b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_text_focus_light.9.png diff --git a/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_text_normal_dark.9.png b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_text_normal_dark.9.png Binary files differnew file mode 100644 index 0000000..ac75dad --- /dev/null +++ b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_text_normal_dark.9.png diff --git a/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_text_normal_light.9.png b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_text_normal_light.9.png Binary files differnew file mode 100644 index 0000000..c19afad --- /dev/null +++ b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_text_normal_light.9.png diff --git a/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_text_pressed_dark.9.png b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_text_pressed_dark.9.png Binary files differnew file mode 100644 index 0000000..c490441 --- /dev/null +++ b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_text_pressed_dark.9.png diff --git a/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_text_pressed_light.9.png b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_text_pressed_light.9.png Binary files differnew file mode 100644 index 0000000..c52be74 --- /dev/null +++ b/google-play-services_lib/res/drawable-xxhdpi/common_signin_btn_text_pressed_light.9.png diff --git a/google-play-services_lib/res/drawable-xxhdpi/ic_plusone_medium_off_client.png b/google-play-services_lib/res/drawable-xxhdpi/ic_plusone_medium_off_client.png Binary files differnew file mode 100644 index 0000000..4f23739 --- /dev/null +++ b/google-play-services_lib/res/drawable-xxhdpi/ic_plusone_medium_off_client.png diff --git a/google-play-services_lib/res/drawable-xxhdpi/ic_plusone_small_off_client.png b/google-play-services_lib/res/drawable-xxhdpi/ic_plusone_small_off_client.png Binary files differnew file mode 100644 index 0000000..8ffa1d7 --- /dev/null +++ b/google-play-services_lib/res/drawable-xxhdpi/ic_plusone_small_off_client.png diff --git a/google-play-services_lib/res/drawable-xxhdpi/ic_plusone_standard_off_client.png b/google-play-services_lib/res/drawable-xxhdpi/ic_plusone_standard_off_client.png Binary files differnew file mode 100644 index 0000000..4d81cf4 --- /dev/null +++ b/google-play-services_lib/res/drawable-xxhdpi/ic_plusone_standard_off_client.png diff --git a/google-play-services_lib/res/drawable-xxhdpi/ic_plusone_tall_off_client.png b/google-play-services_lib/res/drawable-xxhdpi/ic_plusone_tall_off_client.png Binary files differnew file mode 100644 index 0000000..fab5a79 --- /dev/null +++ b/google-play-services_lib/res/drawable-xxhdpi/ic_plusone_tall_off_client.png diff --git a/google-play-services_lib/res/drawable-xxhdpi/powered_by_google_dark.png b/google-play-services_lib/res/drawable-xxhdpi/powered_by_google_dark.png Binary files differnew file mode 100644 index 0000000..0165a01 --- /dev/null +++ b/google-play-services_lib/res/drawable-xxhdpi/powered_by_google_dark.png diff --git a/google-play-services_lib/res/drawable-xxhdpi/powered_by_google_light.png b/google-play-services_lib/res/drawable-xxhdpi/powered_by_google_light.png Binary files differnew file mode 100644 index 0000000..aa6b6db --- /dev/null +++ b/google-play-services_lib/res/drawable-xxhdpi/powered_by_google_light.png diff --git a/google-play-services_lib/res/drawable/common_signin_btn_icon_dark.xml b/google-play-services_lib/res/drawable/common_signin_btn_icon_dark.xml new file mode 100644 index 0000000..dd1cf67 --- /dev/null +++ b/google-play-services_lib/res/drawable/common_signin_btn_icon_dark.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item + android:state_pressed="true" + android:drawable="@drawable/common_signin_btn_icon_pressed_dark" /> + <item + android:state_enabled="false" + android:state_focused="true" + android:drawable="@drawable/common_signin_btn_icon_disabled_focus_dark" /> + <item + android:state_focused="true" + android:drawable="@drawable/common_signin_btn_icon_focus_dark" /> + <item + android:state_enabled="false" + android:drawable="@drawable/common_signin_btn_icon_disabled_dark" /> + <item + android:drawable="@drawable/common_signin_btn_icon_normal_dark" /> +</selector> diff --git a/google-play-services_lib/res/drawable/common_signin_btn_icon_light.xml b/google-play-services_lib/res/drawable/common_signin_btn_icon_light.xml new file mode 100644 index 0000000..abf412b --- /dev/null +++ b/google-play-services_lib/res/drawable/common_signin_btn_icon_light.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item + android:state_pressed="true" + android:drawable="@drawable/common_signin_btn_icon_pressed_light" /> + <item + android:state_enabled="false" + android:state_focused="true" + android:drawable="@drawable/common_signin_btn_icon_disabled_focus_light" /> + <item + android:state_focused="true" + android:drawable="@drawable/common_signin_btn_icon_focus_light" /> + <item + android:state_enabled="false" + android:drawable="@drawable/common_signin_btn_icon_disabled_light" /> + <item + android:drawable="@drawable/common_signin_btn_icon_normal_light" /> +</selector> diff --git a/google-play-services_lib/res/drawable/common_signin_btn_text_dark.xml b/google-play-services_lib/res/drawable/common_signin_btn_text_dark.xml new file mode 100644 index 0000000..2d92217 --- /dev/null +++ b/google-play-services_lib/res/drawable/common_signin_btn_text_dark.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item + android:state_pressed="true" + android:drawable="@drawable/common_signin_btn_text_pressed_dark" /> + <item + android:state_enabled="false" + android:state_focused="true" + android:drawable="@drawable/common_signin_btn_text_disabled_focus_dark" /> + <item + android:state_focused="true" + android:drawable="@drawable/common_signin_btn_text_focus_dark" /> + <item + android:state_enabled="false" + android:drawable="@drawable/common_signin_btn_text_disabled_dark" /> + <item + android:drawable="@drawable/common_signin_btn_text_normal_dark" /> +</selector> diff --git a/google-play-services_lib/res/drawable/common_signin_btn_text_light.xml b/google-play-services_lib/res/drawable/common_signin_btn_text_light.xml new file mode 100644 index 0000000..810c021 --- /dev/null +++ b/google-play-services_lib/res/drawable/common_signin_btn_text_light.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item + android:state_pressed="true" + android:drawable="@drawable/common_signin_btn_text_pressed_light" /> + <item + android:state_enabled="false" + android:state_focused="true" + android:drawable="@drawable/common_signin_btn_text_disabled_focus_light" /> + <item + android:state_focused="true" + android:drawable="@drawable/common_signin_btn_text_focus_light" /> + <item + android:state_enabled="false" + android:drawable="@drawable/common_signin_btn_text_disabled_light" /> + <item + android:drawable="@drawable/common_signin_btn_text_normal_light" /> +</selector> diff --git a/google-play-services_lib/res/values-af/common_strings.xml b/google-play-services_lib/res/values-af/common_strings.xml new file mode 100644 index 0000000..3a388b0 --- /dev/null +++ b/google-play-services_lib/res/values-af/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Google Play Services-fout"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"\'n Program vereis dat Google Play Services geïnstalleer word."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"\'n Program vereis dat Google Play Services opgedateer word."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"\'n Program vereis dat Google Play Services geaktiveer word."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Versoek deur <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Kry Google Play-dienste"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Hierdie program sal nie loop sonder Google Play-dienste nie, wat nie op jou foon is nie."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Hierdie program sal nie loop sonder Google Play-dienste nie, wat nie op jou tablet is nie."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Kry Google Play-dienste"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Aktiveer Google Play-dienste"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Hierdie program sal nie werk tensy jy Google Play-dienste aktiveer nie."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Aktiveer Google Play-dienste"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Dateer Google Play-dienste op"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Hierdie program sal nie loop nie, tensy jy Google Play-dienste opdateer."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Netwerkfout"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"\'n Dataverbinding is nodig om aan Google Play-dienste te koppel."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Ongeldige rekening"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"Die gespesifiseerde rekening bestaan nie op hierdie toestel nie. Kies asseblief \'n ander rekening."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Onbekende probleem met Google Play-dienste."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Google Play-dienste"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Google Play-dienste, waarop sommige van jou programme staatmaak, werk nie met jou toestel nie. Kontak asseblief die vervaardiger vir bystand."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"Dit lyk of die datum op die toestel verkeerd is. Gaan asseblief die datum op die toestel na."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Dateer op"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Meld aan"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Meld aan met Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-am/common_strings.xml b/google-play-services_lib/res/values-am/common_strings.xml new file mode 100644 index 0000000..1c5df4f --- /dev/null +++ b/google-play-services_lib/res/values-am/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"የGoogle Play አገልግሎቶች ስህተት"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"አንድ መተግበሪያ የGoogle Play አገልግሎቶች እንዲጫኑ ይፈልጋል።"</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"አንድ መተግበሪያ የGoogle Play አገልግሎቶች እንዲዘምኑ ይፈልጋል።"</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"አንድ መተግበሪያ የGoogle Play አገልግሎቶች እንዲነቁ ይፈልጋል።"</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"በ<xliff:g id="APP_NAME">%1$s</xliff:g> የተጠየቀ"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Google Play አገልግሎቶችን አግኝ"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"ይህ መተግበሪያ ያለ Google Play አገልግሎቶች አይሰራም፣ እነሱ ደግሞ ስልክዎ ላይ የሉም።"</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"ይህ መተግበሪያ ያለ Google Play አገልግሎቶች አይሰራም፣ እነሱ ደግሞ ጡባዊዎ ላይ የሉም።"</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Google Play አገልግሎቶችን አግኝ"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Google Play አገልግሎቶችን አንቃ"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Google Play አገልግሎቶችን እስካላነቁ ድረስ ይህ መተግበሪያ አይሰራም።"</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Google Play አገልግሎቶችን አንቃ"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Google Play አገልግሎቶችን ያዘምኑ"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Google Play አገልግሎቶችን እስኪያዘምኑ ድረስ ይህ መተግበሪያ አይሰራም።"</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"የአውታረ መረብ ስህተት"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"ከGoogle Play አገልግሎቶች ጋር ለመገናኘት የውሂብ ግንኙነት ያስፈልጋል።"</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"ልክ ያልሆነ መለያ"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"የተገለጸው መለያ በዚህ መሣሪያ ላይ የለም። እባክው የተለየ መለያ ይምረጡ።"</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"በGoogle Play አገልግሎቶች ላይ ያልታወቀ ችግር።"</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Google Play አገልግሎቶች"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"የGoogle Play አገልግሎቶች፣ አንዳንድ መተግበሪያዎችዎ በእሱ ላይ ጥገኛ የሆኑት፣ በመሣሪያዎ አይደገፍም። እባክዎ ለእርዳታ አምራቹን ያግኙ።"</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"በመሣሪያው ላይ ያለው ቀን ትክክል አይመስልም። እባክዎ በመሣሪያው ላይ ያለውን ቀን ያረጋግጡ።"</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"ያዘምኑ"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"ግባ"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"በGoogle ይግቡ"</string> +</resources> diff --git a/google-play-services_lib/res/values-ar/common_strings.xml b/google-play-services_lib/res/values-ar/common_strings.xml new file mode 100644 index 0000000..357ca9f --- /dev/null +++ b/google-play-services_lib/res/values-ar/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"خطأ في خدمات Google Play"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"يتطلب أحد التطبيقات تثبيت خدمات Google Play."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"يتطلب أحد التطبيقات تحديث خدمات Google Play."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"يتطلب أحد التطبيقات تمكين خدمات Google Play."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"تم الطلب عن طريق <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"الحصول على خدمات Google Play"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"لن يتم تشغيل هذا التطبيق بدون خدمات Google Play، والتي لا تتوفر في هاتفك."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"لن يتم تشغيل هذا التطبيق بدون خدمات Google Play، والتي لا تتوفر في جهازك اللوحي."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"الحصول على خدمات Google Play"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"تمكين خدمات Google Play"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"لن يعمل هذا التطبيق ما لم يتم تمكين خدمات Google Play."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"تمكين خدمات Google Play"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"تحديث خدمات Google Play"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"لن يتم تشغيل هذا التطبيق ما لم تحدِّث خدمات Google Play."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"خطأ في الشبكة"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"يتطلب الاتصال بخدمات Google Play وجود اتصال بيانات."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"حساب غير صالح"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"الحساب الذي تمّ تحديده غير موجود على الجهاز. يُرجى اختيار حساب آخر."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"حدثت مشكلة غير معروفة في خدمات Google Play."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"خدمات Google Play"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"خدمات Google Play التي تستجيب لها بعض تطبيقاتك لا تعمل على جهازك. يُرجى الاتصال بجهة التصنيع للحصول على المساعدة."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"يبدو أن التاريخ على الجهاز غير صحيح. الرجاء التحقق من التاريخ على الجهاز."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"تحديث"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"تسجيل الدخول"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"تسجيل الدخول باستخدام Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-be/common_strings.xml b/google-play-services_lib/res/values-be/common_strings.xml new file mode 100644 index 0000000..03c0cdd --- /dev/null +++ b/google-play-services_lib/res/values-be/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Атрымаць службы Google Play"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Гэта прыкладанне не будзе працаваць без службаў Google Play, якіх няма ў вашым тэлефоне."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Гэта прыкладанне не будзе працаваць без службаў Google Play, якіх няма на вашым планшэце."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Атрымаць службы Google Play"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Уключыць службы Google Play"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Гэта прыкладанне не будзе працаваць, пакуль вы не ўключыце службы Google Play."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Уключыць службы Google Play"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Абнаўленне службаў Google Play"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Гэта прыкладанне не будзе працаваць падчас абнаўлення службаў Google Play."</string> + <!-- no translation found for common_google_play_services_network_error_title (3827284619958211114) --> + <skip /> + <!-- no translation found for common_google_play_services_network_error_text (9038847255613537209) --> + <skip /> + <!-- no translation found for common_google_play_services_invalid_account_title (1066672360770936753) --> + <skip /> + <!-- no translation found for common_google_play_services_invalid_account_text (4983316348021735578) --> + <skip /> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Невядомая праблема са службамі Google Play."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Службы Google Play"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Службы Google Play, да якiх прывязаны некаторыя прыкладаннi, не падтрымлiваюцца на вашай прыладзе. Па дапамогу звярнiцеся да вытворцы."</string> + <!-- no translation found for common_google_play_services_unsupported_date_text (4725396522367789365) --> + <skip /> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Абнавіць"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Увайсцi"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Увайсці ў Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-bg/common_strings.xml b/google-play-services_lib/res/values-bg/common_strings.xml new file mode 100644 index 0000000..4aa01ec --- /dev/null +++ b/google-play-services_lib/res/values-bg/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Грешка в услугите за Google Play"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"Приложение изисква инсталирането на услугите за Google Play."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"Приложение изисква актуализирането на услугите за Google Play."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"Приложение изисква активирането на услугите за Google Play."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Заявено от <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Изтегляне на услугите за Google Play"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Това приложение няма да се изпълнява без услугите за Google Play, които липсват в телефона ви."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Това приложение няма да се изпълнява без услугите за Google Play, които липсват в таблета ви."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Услуги за Google Play: Изтегл."</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Активиране на услугите за Google Play"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Това приложение няма да работи, освен ако не активирате услугите за Google Play."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Услуги за Google Play: Актив."</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Актуализиране на услугите за Google Play"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Това приложение няма да се изпълнява, освен ако не актуализирате услугите за Google Play."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Грешка в мрежата"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"За свързване с услугите за Google Play се изисква връзка за данни."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Невалиден профил"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"Посоченият профил не съществува на това устройство. Моля, изберете друг."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Неизвестен проблем с услугите за Google Play."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Услуги за Google Play"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Услугите за Google Play, на които разчитат някои от приложенията ви, не се поддържат от устройството ви. Моля, свържете се с производителя за помощ."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"Изглежда, че датата на устройството е неправилна. Моля, проверете я."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Актуализиране"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Вход"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Вход с Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-ca/common_strings.xml b/google-play-services_lib/res/values-ca/common_strings.xml new file mode 100644 index 0000000..d9ebc7f --- /dev/null +++ b/google-play-services_lib/res/values-ca/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Error dels serveis de Google Play"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"Una aplicació requereix que s\'instal·lin els serveis de Google Play."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"Una aplicació requereix que s\'actualitzin els serveis de Google Play."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"Una aplicació requereix que s\'activin els serveis de Google Play."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Sol·licitada per <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Baixa els serveis de Google Play"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Aquesta aplicació no s\'executarà si el telèfon no té instal·lats els serveis de Google Play."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Aquesta aplicació no funcionarà si la tauleta no té instal·lats els serveis de Google Play."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Baixa els serveis de Google Play"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Activa els serveis de Google Play"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Aquesta aplicació no funcionarà si no actives els serveis de Google Play."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Activa els serveis de Google Play"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Actualitza els serveis de Google Play"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Aquesta aplicació no s\'executarà si no actualitzes els serveis de Google Play."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Error de xarxa"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"Es requereix una connexió de dades per connectar amb els serveis de Google Play."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Compte no vàlid"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"El compte especificat no existeix en aquest dispositiu. Tria un compte diferent."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Error desconegut relacionat amb els serveis de Google Play."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Serveis de Google Play"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"El teu dispositiu no és compatible amb els serveis de Google Play, en què es basen les teves aplicacions. Per obtenir assistència, contacta amb el fabricant."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"Sembla que la data del dispositiu no és correcta. Comprova-la."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Actualitza"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Inicia sessió"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Inicia sessió amb Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-cs/common_strings.xml b/google-play-services_lib/res/values-cs/common_strings.xml new file mode 100644 index 0000000..669d2a2 --- /dev/null +++ b/google-play-services_lib/res/values-cs/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Chyba služeb Google Play"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"Aplikace vyžaduje instalaci služeb Google Play."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"Aplikace vyžaduje aktualizaci služeb Google Play."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"Aplikace vyžaduje aktivaci služeb Google Play."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Požadováno aplikací <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Instalovat služby Google Play"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Ke spuštění této aplikace jsou potřeba služby Google Play, které v telefonu nemáte."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Ke spuštění této aplikace jsou potřeba služby Google Play, které v tabletu nemáte."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Instalovat služby Google Play"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Aktivovat služby Google Play"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Ke spuštění této aplikace je třeba aktivovat služby Google Play."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Aktivovat služby Google Play"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Aktualizace služeb Google Play"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Ke spuštění této aplikace je třeba aktualizovat služby Google Play."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Chyba sítě"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"Připojení ke službám Google Play vyžaduje datové připojení."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Neplatný účet"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"Zadaný účet v tomto zařízení neexistuje. Zvolte prosím jiný účet."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Nastal neznámý problém se službami Google Play."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Služby Google Play"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Některé vaše aplikace vyžadují služby Google Play, které ve vašem zařízení nejsou podporovány. S žádostí o pomoc se prosím obraťte na výrobce."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"Datum v zařízení není správně nastaveno. Zkontrolujte prosím datum."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Aktualizovat"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Přihlásit se"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Přihlásit se účtem Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-da/common_strings.xml b/google-play-services_lib/res/values-da/common_strings.xml new file mode 100644 index 0000000..79c3c64 --- /dev/null +++ b/google-play-services_lib/res/values-da/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Fejl i Google Play-tjenester"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"En applikation kræver, at Google Play-tjenester installeres."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"En applikation kræver, at Google Play-tjenester opdateres."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"En applikation kræver, at Google Play-tjenester aktiveres."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Anmodning fra <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Hent Google Play-tjenester"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Denne app kan ikke køre uden Google Play-tjenester, som mangler på din telefon."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Denne app kan ikke køre uden Google Play-tjenester, som mangler på din tablet."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Hent Google Play-tjenester"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Aktivér Google Play-tjenester"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Denne app virker ikke, medmindre du aktiverer Google Play-tjenester."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Aktivér Google Play-tjenester"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Opdater Google Play-tjenester"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Denne app kan ikke køre, medmindre du opdaterer Google Play-tjenester."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Netværksfejl"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"Der kræves en dataforbindelse for at oprette forbindelse til Google Play-tjenester."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Ugyldig konto"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"Den angivne konto findes ikke på denne enhed. Vælg en anden konto."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Ukendt problem med Google Play-tjenester."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Google Play-tjenester"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Google Play-tjenester, som nogle af dine applikationer er afhængige af, understøttes ikke af din enhed. Kontakt producenten for at få hjælp."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"Datoen på enheden ser ud til at være forkert. Husk at kontrollere datoen på enheden."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Opdater"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Log ind"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Log ind med Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-de/common_strings.xml b/google-play-services_lib/res/values-de/common_strings.xml new file mode 100644 index 0000000..30c49d6 --- /dev/null +++ b/google-play-services_lib/res/values-de/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Fehler bei Zugriff auf Google Play-Dienste"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"App erfordert die Installation der Google Play-Dienste"</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"App erfordert ein Update der Google Play-Dienste"</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"App erfordert die Aktivierung der Google Play-Dienste"</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Angefordert von <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Google Play-Dienste installieren"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Zur Nutzung dieser App sind Google Play-Dienste erforderlich, die auf Ihrem Telefon nicht installiert sind."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Zur Nutzung dieser App sind Google Play-Dienste erforderlich, die auf Ihrem Tablet nicht installiert sind."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Google Play-Dienste installieren"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Google Play-Dienste aktivieren"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Diese App funktioniert nur, wenn Sie die Google Play-Dienste aktivieren."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Google Play-Dienste aktivieren"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Google Play-Dienste aktualisieren"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Diese App wird nur ausgeführt, wenn Sie die Google Play-Dienste aktualisieren."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Netzwerkfehler"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"Um eine Verbindung zu den Google Play-Diensten herzustellen, ist eine Datenverbindung erforderlich."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Ungültiges Konto"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"Das angegebene Konto ist auf diesem Gerät nicht vorhanden. Bitte wählen Sie ein anderes Konto aus."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Unbekanntes Problem mit Google Play-Diensten"</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Google Play-Dienste"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Google Play-Dienste, auf denen einige Ihrer Apps basieren, werden von diesem Gerät nicht unterstützt. Wenden Sie sich für weitere Informationen an den Hersteller."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"Das Datum auf dem Gerät scheint falsch zu sein. Bitte überprüfen Sie das Datum auf dem Gerät."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Aktualisieren"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Anmelden"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Über Google anmelden"</string> +</resources> diff --git a/google-play-services_lib/res/values-el/common_strings.xml b/google-play-services_lib/res/values-el/common_strings.xml new file mode 100644 index 0000000..0ea141e --- /dev/null +++ b/google-play-services_lib/res/values-el/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Σφάλμα Υπηρεσιών Google Play"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"Μια εφαρμογή απαιτεί την εγκατάσταση των Υπηρεσιών Google Play."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"Μια εφαρμογή απαιτεί την ενημέρωση των Υπηρεσιών Google Play."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"Μια εφαρμογή απαιτεί την ενεργοποίηση των Υπηρεσιών Google Play."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Υποβλήθηκε αίτημα από την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Λήψη υπηρεσιών Google Play"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Αυτή η εφαρμογή δεν θα εκτελεστεί χωρίς τις υπηρεσίες Google Play, οι οποίες λείπουν από το τηλέφωνό σας."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Αυτή η εφαρμογή δεν θα εκτελεστεί χωρίς τις υπηρεσίες Google Play, οι οποίες λείπουν από το tablet σας."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Λήψη υπηρεσιών Google Play"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Ενεργοποίηση υπηρεσιών Google Play"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Αυτή η εφαρμογή δεν θα λειτουργήσει εάν δεν έχετε ενεργοποιήσει τις υπηρεσίες Google Play."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Ενεργοπ. υπηρεσιών Google Play"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Ενημέρωση υπηρεσιών Google Play"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Αυτή η εφαρμογή θα εκτελεστεί αφού ενημερώσετε τις υπηρεσίες Google Play."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Σφάλμα δικτύου"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"Απαιτείται σύνδεση δεδομένων για να συνδεθείτε με τις Υπηρεσίες Google Play."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Μη έγκυρος λογαριασμός"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"Ο συγκεκριμένος λογαριασμός δεν υπάρχει σε αυτήν τη συσκευή. Επιλέξτε έναν διαφορετικό λογαριασμό."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Άγνωστο πρόβλημα με τις υπηρεσίες Google Play."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Υπηρεσίες Google Play"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Οι υπηρεσίες Google Play, στις οποίες βασίζονται ορισμένες από τις εφαρμογές σας, δεν υποστηρίζονται στη συσκευή σας. Επικοινωνήστε με τον κατασκευαστή για υποστήριξη."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"Η ημερομηνία στη συσκευή φαίνεται λανθασμένη. Ελέγξτε την ημερομηνία στη συσκευή."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Ενημέρωση"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Σύνδεση"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Συνδεθείτε στο Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-en-rGB/common_strings.xml b/google-play-services_lib/res/values-en-rGB/common_strings.xml new file mode 100644 index 0000000..b32a51e --- /dev/null +++ b/google-play-services_lib/res/values-en-rGB/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Google Play services error"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"An application requires installation of Google Play services."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"An application requires an update for Google Play Services."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"An application requires Google Play services to be enabled."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Requested by <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Get Google Play services"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"This app won\'t run without Google Play services, which are missing from your phone."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"This app won\'t run without Google Play services, which are missing from your tablet."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Get Google Play services"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Enable Google Play services"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"This app won\'t work unless you enable Google Play services."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Enable Google Play services"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Update Google Play services"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"This app won\'t run unless you update Google Play services."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Network Error"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"A data connection is required to connect to Google Play services."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Invalid Account"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"The specified account does not exist on this device. Please choose a different account."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Unknown issue with Google Play services."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Google Play services"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Google Play services, which some of your applications rely on, is not supported by your device. Please contact the manufacturer for assistance."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"The date on the device appears to be incorrect. Please check the date on the device."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Update"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Sign in"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Sign in with Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-en-rIN/common_strings.xml b/google-play-services_lib/res/values-en-rIN/common_strings.xml new file mode 100644 index 0000000..b32a51e --- /dev/null +++ b/google-play-services_lib/res/values-en-rIN/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Google Play services error"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"An application requires installation of Google Play services."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"An application requires an update for Google Play Services."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"An application requires Google Play services to be enabled."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Requested by <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Get Google Play services"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"This app won\'t run without Google Play services, which are missing from your phone."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"This app won\'t run without Google Play services, which are missing from your tablet."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Get Google Play services"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Enable Google Play services"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"This app won\'t work unless you enable Google Play services."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Enable Google Play services"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Update Google Play services"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"This app won\'t run unless you update Google Play services."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Network Error"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"A data connection is required to connect to Google Play services."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Invalid Account"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"The specified account does not exist on this device. Please choose a different account."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Unknown issue with Google Play services."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Google Play services"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Google Play services, which some of your applications rely on, is not supported by your device. Please contact the manufacturer for assistance."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"The date on the device appears to be incorrect. Please check the date on the device."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Update"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Sign in"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Sign in with Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-es-rUS/common_strings.xml b/google-play-services_lib/res/values-es-rUS/common_strings.xml new file mode 100644 index 0000000..541ea96 --- /dev/null +++ b/google-play-services_lib/res/values-es-rUS/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Error de Google Play Services"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"Una aplicación requiere que se instale Google Play Services"</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"Una aplicación requiere que se actualice Google Play Services"</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"Una aplicación requiere que se habilite Google Play Services"</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Solicitada por <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Obtener Google Play Services"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Esta aplicación no se ejecutará si no instalasGoogle Play Services en tu dispositivo."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Esta aplicación no se ejecutará si no instalas Google Play Services en tu tablet."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Descargar Google Play Services"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Activar Google Play Services"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Esta aplicación no funcionará si no activas Google Play Services."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Activar Google Play Services"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Actualizar Google Play Services"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Esta aplicación no se ejecutará si no actualizas Google Play Services."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Error de red"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"Se necesita una conexión de datos para establecer conexión con Google Play Services."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Cuenta no válida"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"La cuenta especificada no existe en este dispositivo. Elige otra cuenta."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Error desconocido relacionado con Google Play Services"</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Google Play Services"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Google Play Services, del cual dependen algunas de tus aplicaciones, no es compatible con tu dispositivo. Comunícate con el fabricante para obtener ayuda."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"Parece que la fecha del dispositivo es incorrecta. ¿Puedes revisarla?"</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Actualizar"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Acceder"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Acceder con Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-es/common_strings.xml b/google-play-services_lib/res/values-es/common_strings.xml new file mode 100644 index 0000000..a96c717 --- /dev/null +++ b/google-play-services_lib/res/values-es/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Error de servicios de Google Play"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"Una aplicación requiere la instalación de servicios de Google Play."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"Una aplicación requiere una actualización de servicios de Google Play."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"Una aplicación requiere que se habiliten los servicios de Google Play."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Solicitada por <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Descargar servicios de Google Play"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Esta aplicación no se ejecutará si tu teléfono no tiene instalados los servicios de Google Play."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Esta aplicación no se ejecutará si tu tablet no tiene instalados los servicios de Google Play."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Descargar servicios de Google Play"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Habilitar servicios de Google Play"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Esta aplicación no funcionará si no habilitas los servicios de Google Play."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Habilitar servicios de Google Play"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Actualizar servicios de Google Play"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Esta aplicación no se ejecutará si no actualizas los servicios de Google Play."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Error de red"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"Se necesita una conexión de datos para establecer conexión con los servicios de Google Play."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Cuenta no válida"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"La cuenta especificada no existe en este dispositivo. Selecciona otra cuenta."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Error desconocido relacionado con los servicios de Google Play"</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Servicios de Google Play"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Tu dispositivo no es compatible con los servicios de Google Play, de los cuales dependen tus aplicaciones. Para obtener asistencia, ponte en contacto el fabricante."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"Parece que la fecha del dispositivo es incorrecta. Compruébala."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Actualizar"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Iniciar sesión"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Iniciar sesión con Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-es/wallet_strings.xml b/google-play-services_lib/res/values-es/wallet_strings.xml new file mode 100644 index 0000000..345f2cf --- /dev/null +++ b/google-play-services_lib/res/values-es/wallet_strings.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="wallet_buy_button_place_holder">Comprar con Google</string> +</resources> diff --git a/google-play-services_lib/res/values-et-rEE/common_strings.xml b/google-play-services_lib/res/values-et-rEE/common_strings.xml new file mode 100644 index 0000000..262340f --- /dev/null +++ b/google-play-services_lib/res/values-et-rEE/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Viga Google Play teenustes"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"Rakenduse kasutamiseks peavad olema installitud Google Play teenused."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"Rakenduse kasutamiseks tuleb värskendada Google Play teenuseid."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"Rakenduse kasutamiseks peavad olema lubatud Google Play teenused."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Taotluse esitas <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Hankige Google Play teenused"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Selle rakenduse käitamiseks on vaja Google Play teenuseid, mida teie telefonis pole."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Selle rakenduse käitamiseks on vaja Google Play teenuseid, mida teie tahvelarvutis pole."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Hankige Google Play teenused"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Lubage Google Play teenused"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"See rakendus ei tööta, kui te ei luba Google Play teenuseid."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Lubage Google Play teenused"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Värskendage Google Play teenuseid"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Seda rakendust ei saa käitada, kui te ei värskenda Google Play teenuseid."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Võrgu viga"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"Google Play teenustega ühenduse loomiseks on vajalik andmesideühendus."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Vale konto"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"Määratud kontot pole selles seadmes olemas. Valige muu konto."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Google Play teenuste tundmatu probleem."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Google Play teenused"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Teie seade ei toeta Google Play teenuseid, millele mõni teie rakendustest toetub. Abi saamiseks võtke ühendust tootjaga."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"Seadme kuupäev paistab olevat vale. Kontrollige seadme kuupäeva."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Värskenda"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Logi sisse"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Logi sisse Google\'iga"</string> +</resources> diff --git a/google-play-services_lib/res/values-fa/common_strings.xml b/google-play-services_lib/res/values-fa/common_strings.xml new file mode 100644 index 0000000..17a4e43 --- /dev/null +++ b/google-play-services_lib/res/values-fa/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"خطا در خدمات Google Play"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"برنامهای نیاز به نصب خدمات Google Play دارد."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"برنامهای نیاز به یک بهروزرسانی برای خدمات Google Play دارد."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"برنامهای نیاز به فعال شدن خدمات Google Play دارد."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"درخواست توسط <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"دریافت خدمات Google Play"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"این برنامه بدون خدمات Google Play اجرا نمیشود، این خدمات در تلفن شما وجود ندارد."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"این برنامه بدون خدمات Google Play اجرا نمیشود، این خدمات در رایانهٔ لوحی شما وجود ندارد."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"دریافت خدمات Google Play"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"فعال کردن خدمات Google Play"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"تا زمانیکه خدمات Google Play را فعال نکنید این برنامه کار نمیکند."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"فعال کردن خدمات Google Play"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"بهروزرسانی خدمات Google Play"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"تا زمانیکه خدمات Google Play را بهروز نکنید این برنامه کار نمیکند."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"خطای شبکه"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"برای اتصال به خدمات Google Play اتصال داده لازم است."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"حساب نامعتبر"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"حسابی که تعیین کردید در این دستگاه وجود ندارد. لطفاً حساب دیگری را انتخاب کنید."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"مشکل نامشخص در خدمات Google Play."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"خدمات Google Play"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"خدمات Google Play، که برخی از برنامههای شما به آن وابسته است، توسط دستگاه شما پشتیبانی نمیشود. لطفاً برای دریافت کمک با سازنده تماس بگیرید."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"تاریخ روی دستگاه ظاهراً اشتباه است. لطفاً تاریخ روی دستگاه را بررسی کنید."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"بهروزرسانی"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"ورود به سیستم"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"ورود به سیستم با Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-fi/common_strings.xml b/google-play-services_lib/res/values-fi/common_strings.xml new file mode 100644 index 0000000..ccf1a10 --- /dev/null +++ b/google-play-services_lib/res/values-fi/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Virhe Google Play -palveluissa"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"Asenna Google Play -palvelut, jotta sovellus toimii."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"Päivitä Google Play -palvelut, jotta sovellus toimii."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"Ota käyttöön Google Play -palvelut, jotta sovellus toimii."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Pyynnön teki <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Asenna Google Play -palvelut"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Tämä sovellus ei toimi ilman Google Play -palveluita, jotka puuttuvat puhelimesta."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Tämä sovellus ei toimi ilman Google Play -palveluita, jotka puuttuvat tablet-laitteesta."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Asenna Google Play -palvelut"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Ota Google Play -palvelut käyttöön"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Tämä sovellus ei toimi, ellet ota Google Play -palveluita käyttöön."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Ota Google Play -palv. käyttöön"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Päivitä Google Play -palvelut"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Tämä sovellus ei toimi, ellet päivitä Google Play -palveluita."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Verkkovirhe"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"Google Play -palveluiden käyttöön tarvitaan tietoliikenneyhteys."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Tili ei kelpaa"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"Kyseistä tiliä ei ole tällä laitteella. Valitse toinen tili."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Tuntematon ongelma käytettäessä Google Play -palveluita."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Google Play -palvelut"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Google Play -palveluita, joita osa sovelluksistasi käyttää, ei tueta laitteellasi. Pyydä ohjeita laitteen valmistajalta."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"Laitteen päivämäärä vaikuttaa virheelliseltä. Tarkista laitteen päivämäärä."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Päivitä"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Kirjaudu"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Kirjaudu Google-tiliin"</string> +</resources> diff --git a/google-play-services_lib/res/values-fr-rCA/common_strings.xml b/google-play-services_lib/res/values-fr-rCA/common_strings.xml new file mode 100644 index 0000000..cd4150e --- /dev/null +++ b/google-play-services_lib/res/values-fr-rCA/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Erreur liée aux services Google Play"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"Une application demande l\'installation des services Google Play."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"Une application requiert la mise à jour des services Google Play."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"Une application requiert l\'activation des services Google Play."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Demandée par <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Installer les services Google Play"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Cette application ne fonctionnera pas sans les services Google Play, qui ne sont pas installés sur votre téléphone."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Cette application ne fonctionnera pas sans les services Google Play, qui ne sont pas installés sur votre tablette."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Installer les services Google Play"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Activer les services Google Play"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Cette application ne fonctionnera pas tant que vous n\'aurez pas activé les services Google Play."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Activer les services Google Play"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Mettre à jour les services Google Play"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Cette application ne fonctionnera pas tant que vous n\'aurez pas mis à jour les services Google Play."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Erreur réseau"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"Vous devez disposer d\'une connexion de données pour utiliser les services Google Play."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Compte erroné"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"Le compte indiqué n\'existe pas sur cet appareil. Veuillez sélectionner un autre compte."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Problème inconnu avec les services Google Play."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Services Google Play"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Les services Google Play, dont dépendent certaines de vos applications, ne sont pas compatibles avec votre appareil. Veuillez contacter le fabricant pour obtenir de l\'aide."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"La date sur l\'appareil semble incorrecte. Veuillez la vérifier."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Mettre à jour"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Connexion"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Se connecter via Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-fr/common_strings.xml b/google-play-services_lib/res/values-fr/common_strings.xml new file mode 100644 index 0000000..1d62961 --- /dev/null +++ b/google-play-services_lib/res/values-fr/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Erreur liée aux services Google Play"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"Une application demande l\'installation des services Google Play."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"Une application demande la mise à jour des services Google Play."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"Une application demande l\'activation des services Google Play."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Notification issue de l\'application \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Installer les services Google Play"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Cette application ne fonctionnera pas sans les services Google Play, qui ne sont pas installés sur votre téléphone."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Cette application ne fonctionnera pas sans les services Google Play, qui ne sont pas installés sur votre tablette."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Installer services Google Play"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Activer les services Google Play"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Cette application ne fonctionnera pas tant que vous n\'aurez pas activé les services Google Play."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Activer services Google Play"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Mettre à jour les services Google Play"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Cette application ne fonctionnera pas tant que vous n\'aurez pas mis à jour les services Google Play."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Erreur réseau"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"Vous devez disposer d\'une connexion de données pour utiliser les services Google Play."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Compte erroné"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"Le compte indiqué n\'existe pas sur cet appareil. Veuillez sélectionner un autre compte."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Problème inconnu avec les services Google Play."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Services Google Play"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Les services Google Play, dont dépendent certaines de vos applications, ne sont pas compatibles avec votre appareil. Veuillez contacter le fabricant pour obtenir de l\'aide."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"La date sur l\'appareil semble incorrecte. Veuillez la vérifier."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Mettre à jour"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Connexion"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Se connecter avec Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-hi/common_strings.xml b/google-play-services_lib/res/values-hi/common_strings.xml new file mode 100644 index 0000000..66d9c54 --- /dev/null +++ b/google-play-services_lib/res/values-hi/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Google Play सेवाएं त्रुटि"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"एप्लिकेशन के लिए Google Play सेवाएं इंस्टॉल किए जाने की आवश्यकता है."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"एप्लिकेशन के लिए Google Play सेवाओं में नई जानकारी की आवश्यकता है."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"एप्लिकेशन के लिए Google Play सेवाएं सक्षम किए जाने की आवश्यकता है."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"<xliff:g id="APP_NAME">%1$s</xliff:g> के द्वारा अनुरोधित"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Google Play सेवाएं पाएं"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"यह ऐप्स Google Play सेवाओं के बिना नहीं चलेगा, जो आपके फ़ोन में नहीं हैं."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"यह ऐप्स Google Play सेवाओं के बिना नहीं चलेगा, जो आपके टेबलेट में नहीं हैं."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Google Play सेवाएं पाएं"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Google Play सेवाएं सक्षम करें"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"जब तक आप Google Play सेवाएं सक्षम नहीं करते, तब तक यह ऐप्स कार्य नहीं करेगा."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Google Play सेवाएं सक्षम करें"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Google Play सेवाएं से नई जानकारी"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"जब तक आप Google Play सेवाओं से नई जानकारी नहीं लेते हैं, तब तक यह ऐप्स नहीं चलेगा."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"नेटवर्क त्रुटि"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"Google Play सेवाओं से कनेक्ट करने के लिए डेटा कनेक्शन की आवश्यकता है."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"अमान्य खाता"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"निर्दिष्ट खाता इस उपकरण पर मौजूद नहीं है. कृपया कोई भिन्न खाता चुनें."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Google Play सेवाओं के साथ अज्ञात समस्या."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Google Play सेवाएं"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Google Play सेवाएं, जिन पर आपके कुछ ऐप्स निर्भर करते हैं, आपके उपकरण द्वारा समर्थित नहीं हैं. कृपया सहायता के लिए निर्माता से संपर्क करें."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"उपकरण का दिनांक गलत प्रतीत हो रहा है. कृपया उपकरण का दिनांक जांचें."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"नई जानकारी पाएं"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"प्रवेश करें"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Google से प्रवेश करें"</string> +</resources> diff --git a/google-play-services_lib/res/values-hr/common_strings.xml b/google-play-services_lib/res/values-hr/common_strings.xml new file mode 100644 index 0000000..f8f72c7 --- /dev/null +++ b/google-play-services_lib/res/values-hr/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Pogreška Usluga za Google Play"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"Aplikacija zahtijeva instaliranje Usluga za Google Play."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"Aplikacija zahtijeva ažuriranje Usluga za Google Play."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"Aplikacija zahtijeva da Usluge za Google Play budu omogućene."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Zahtijeva aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Preuzmi usluge za Google Play"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Ova aplikacija neće funkcionirati bez usluga za Google Play, koje nisu instalirane na vašem telefonu."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Ova aplikacija neće funkcionirati bez usluga za Google Play, koje nisu instalirane na vašem tabletnom računalu."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Preuzmi usluge za Google Play"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Omogući usluge za Google Play"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Ova aplikacija neće raditi ako ne omogućite usluge za Google Play."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Omogući usluge za Google Play"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Ažuriraj usluge za Google Play"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Ova se aplikacija neće pokrenuti ako ne ažurirate usluge za Google Play."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Mrežna pogreška"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"Potrebna je podatkovna veza za povezivanje s uslugama Google Play."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Nevažeći račun"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"Navedeni račun ne postoji na ovom uređaju. Odaberite neki drugi račun."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Nepoznata poteškoća s uslugama za Google Play."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Usluge za Google Play"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Usluge za Google Play, koje su potrebne za funkcioniranje nekih vaših aplikacija, nisu podržane na vašem uređaju. Pomoć potražite od proizvođača."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"Čini se da datum na uređaju nije točan. Provjerite datum na uređaju."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Ažuriranje"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Prijava"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Prijava uslugom Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-hu/common_strings.xml b/google-play-services_lib/res/values-hu/common_strings.xml new file mode 100644 index 0000000..8c429e4 --- /dev/null +++ b/google-play-services_lib/res/values-hu/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Google Play szolgáltatások – hiba"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"Egy alkalmazás Google Play-szolgáltatások telepítését kéri."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"Egy alkalmazás Google Play-szolgáltatások frissítését kéri."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"Egy alkalmazás Google Play-szolgáltatások engedélyezését kéri."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> kérésére"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Play Szolgáltatások telepítése"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Az alkalmazás működéséhez a Google Play Szolgáltatások szükségesek, ezek nincsenek telepítve a telefonon."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Az alkalmazás működéséhez a Google Play Szolgáltatások szükségesek, ezek nincsenek telepítve a táblagépen."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Play Szolgáltatások telepítése"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Google Play Szolgáltatások aktiválása"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Az alkalmazás csak akkor fog működni, ha engedélyezi a Google Play Szolgáltatásokat."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Play Szolgáltatások aktiválása"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Play Szolgáltatások frissítése"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Az alkalmazás csak akkor fog működni, ha frissíti a Google Play Szolgáltatásokat."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Hálózati hiba"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"A Google Play Szolgáltatásokhoz történő kapcsolódáshoz adatkapcsolat szükséges."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Érvénytelen fiók"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"A megadott fiók nem létezik ezen az eszközön. Kérjük, válasszon másik fiókot."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Ismeretlen hiba a Google Play Szolgáltatásokban."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Google Play Szolgáltatások"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"A Google Play Szolgáltatásokat, amelyre egyes alkalmazások támaszkodnak, nem támogatja az eszköz. Segítségért forduljon az eszköz gyártójához."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"Az eszközön beállított dátum helytelen. Kérjük, ellenőrizze azt."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Frissítés"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Belépés"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Google-bejelentkezés"</string> +</resources> diff --git a/google-play-services_lib/res/values-hy-rAM/common_strings.xml b/google-play-services_lib/res/values-hy-rAM/common_strings.xml new file mode 100644 index 0000000..ea5d130 --- /dev/null +++ b/google-play-services_lib/res/values-hy-rAM/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Google Play ծառայությունների սխալ կա"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"Ինչ-որ հավելված պահանջում է տեղադրել Google Play ծառայությունները:"</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"Ինչ-որ հավելված պահանջում է թարմացնել Google Play ծառայությունները:"</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"Ինչ-որ հավելված պահանջում է միացնել Google Play ծառայությունները:"</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"<xliff:g id="APP_NAME">%1$s</xliff:g>-ի հարցմամբ"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Տեղադրեք Google Play ծառայությունները"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Այս հավելվածը չի գործարկվի առանց Google Play ծառայությունների, որոնք բացակայում են ձեր հեռախոսում:"</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Այս հավելվածը չի գործարկվի առանց Google Play ծառայությունների, որոնք բացակայում են ձեր գրասալիկում:"</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Տեղադրել Google Play ծառայությունները"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Միացնել Google Play ծառայությունները"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Այս ծրագիրը չի աշխատի, եթե դուք չմիացնեք Google Play ծառայությունները:"</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Միացնել Google Play ծառայությունները"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Նորացրեք Google Play ծառայությունները"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Այս ծրագիրը չի գործարկվի, եթե դուք չնորացնեք Google Play ծառայությունները:"</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Ցանցի սխալ կա"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"Պահանջվում է տվյալների կապ` Google Play ծառայություններին միանալու համար:"</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Հաշիվն անվավեր է"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"Նշված հաշիվը գոյություն չունի այս սարքում: Ընտրեք այլ հաշիվ:"</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Անհայտ խնդիր՝ Google Play ծառայություններում:"</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Google Play ծառայություններ"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Google Play ծառայությունները, որոնց ապավինում են ձեր ծրագրերից որոշները, չեն աջակցվում ձեր սարքի կողմից: Խնդրում ենք կապվել արտադրողի հետ օգնության համար:"</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"Սարքի ամսաթիվը կարծես սխալ է: Ստուգեք սարքի ամսաթիվը:"</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Նորացնել"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Մուտք գործել"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Մուտք գործեք Google-ով"</string> +</resources> diff --git a/google-play-services_lib/res/values-in/common_strings.xml b/google-play-services_lib/res/values-in/common_strings.xml new file mode 100644 index 0000000..d13356a --- /dev/null +++ b/google-play-services_lib/res/values-in/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Kesalahan layanan Google Play"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"Aplikasi mewajibkan pemasangan layanan Google Play."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"Aplikasi mewajibkan pembaruan untuk layanan Google Play."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"Aplikasi mewajibkan agar layanan Google Play diaktifkan."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Diminta oleh <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Dapatkan layanan Google Play"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Aplikasi ini tidak akan berjalan tanpa layanan Google Play, yang tidak ada di ponsel Anda."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Aplikasi ini tidak akan berjalan tanpa layanan Google Play, yang tidak ada di tablet Anda."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Dapatkan layanan Google Play"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Aktifkan layanan Google Play"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Aplikasi ini tidak akan bekerja sampai Anda mengaktifkan layanan Google Play."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Aktifkan layanan Google Play"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Perbarui layanan Google Play"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Aplikasi ini tidak akan berjalan sampai Anda memperbarui layanan Google Play."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Kesalahan Jaringan"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"Sambungan data diperlukan untuk tersambung ke layanan Google Play."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Akun Tidak Valid"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"Akun yang ditentukan tidak ada di perangkat ini. Pilih akun lain."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Masalah tidak diketahui pada layanan Google Play."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Layanan Google Play"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Layanan Google Play, yang diandalkan oleh beberapa aplikasi Anda, tidak didukung oleh perangkat Anda. Hubungi pabrikan untuk mendapatkan bantuan."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"Tampaknya tanggal di perangkat salah. Periksa tanggal di perangkat."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Perbarui"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Masuk"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Masuk dengan Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-it/common_strings.xml b/google-play-services_lib/res/values-it/common_strings.xml new file mode 100644 index 0000000..213127d --- /dev/null +++ b/google-play-services_lib/res/values-it/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Errore Google Play Services"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"Un\'applicazione richiede l\'installazione di Google Play Services."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"Un\'applicazione richiede un aggiornamento di Google Play Services."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"Un\'applicazione richiede l\'attivazione di Google Play Services."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Richiesta da <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Installa Google Play Services"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"L\'app non funzionerà senza Google Play Services, non presente sul tuo telefono."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"L\'app non funzionerà senza Google Play Services, non presente sul tuo tablet."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Installa Google Play Services"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Attiva Google Play Services"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"L\'app non funzionerà se non attivi Google Play Services."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Attiva Google Play Services"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Aggiorna Google Play Services"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"L\'app non funzionerà se non aggiorni Google Play Services."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Errore di rete"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"È necessaria una connessione dati per connettersi a Google Play Services."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Account non valido"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"L\'account specificato non esiste su questo dispositivo. Scegli un altro account."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Problema sconosciuto con Google Play Services."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Google Play Services"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"La piattaforma Google Play Services, su cui sono basate alcune delle tue applicazioni, non è supportata dal dispositivo in uso. Per assistenza, contatta il produttore."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"La data sul dispositivo sembra sbagliata. Controllala."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Aggiorna"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Accedi"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Accedi con Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-iw/common_strings.xml b/google-play-services_lib/res/values-iw/common_strings.xml new file mode 100644 index 0000000..0ee6661 --- /dev/null +++ b/google-play-services_lib/res/values-iw/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"שגיאה בשירותי Google Play"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"קיימת אפליקציה המחייבת התקנה של שירותי Google Play."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"קיימת אפליקציה המחייבת עדכון עבור שירותי Google Play."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"קיימת אפליקציה המחייבת הפעלה של שירותי Google Play."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"התבקשה על ידי <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"קבל את שירותי Google Play"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"אפליקציה זו לא תפעל ללא שירותי Google Play, החסרים בטלפון שלך."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"אפליקציה זו לא תפעל ללא שירותי Google Play, החסרים בטאבלט שלך."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"קבל את שירותי Google Play"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"הפעלת שירותי Google Play"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"אפליקציה זו לא תעבוד אם לא תפעיל את שירותי Google Play."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"הפעל את שירותי Google Play"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"עדכון שירותי Google Play"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"אפליקציה זו לא תפעל אם לא תעדכן את שירותי Google Play."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"שגיאת רשת."</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"דרוש חיבור נתונים כדי להתחבר לשירותי Google Play."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"חשבון לא חוקי"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"החשבון שצוין לא קיים במכשיר זה. בחר חשבון אחר."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"בעיה לא ידועה בשירותי Google Play."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"שירותי Google Play"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"שירותי Google Play, שחלק מהאפליקציות שלך מתבססות עליהם, אינם נתמכים על ידי המכשיר שברשותך. צור קשר עם היצרן לקבלת סיוע."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"נראה שהתאריך במכשיר שגוי. בדוק את התאריך במכשיר."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"עדכן"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"היכנס"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"היכנס באמצעות Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-ja/common_strings.xml b/google-play-services_lib/res/values-ja/common_strings.xml new file mode 100644 index 0000000..d2e1c6a --- /dev/null +++ b/google-play-services_lib/res/values-ja/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Google Play開発者サービスのエラー"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"アプリではGoogle Play開発者サービスをインストールする必要があります"</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"アプリではGoogle Play開発者サービスを更新する必要があります"</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"アプリではGoogle Play開発者サービスを有効にする必要があります"</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"<xliff:g id="APP_NAME">%1$s</xliff:g>によるリクエスト"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Play開発者サービスの入手"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"このアプリの実行にはGoogle Play開発者サービスが必要ですが、お使いの携帯端末にはインストールされていません。"</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"このアプリの実行にはGoogle Play開発者サービスが必要ですが、お使いのタブレットにはインストールされていません。"</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Play開発者サービスの入手"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Play開発者サービスの有効化"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"このアプリの実行には、Google Play開発者サービスの有効化が必要です。"</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Play開発者サービスの有効化"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Play開発者サービスの更新"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"このアプリの実行には、Google Play開発者サービスの更新が必要です。"</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"ネットワークエラー"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"Google Play開発者サービスに接続するには、データ接続が必要です。"</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"無効なアカウント"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"指定したアカウントはこの端末上に存在しません。別のアカウントを選択してください。"</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Google Play開発者サービスで原因不明の問題が発生しました。"</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Google Play開発者サービス"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"一部のアプリが使用しているGoogle Play開発者サービスは、お使いの端末ではサポートされていません。詳しくは、端末メーカーまでお問い合わせください。"</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"端末上の日付が正しくないようです。端末上の日付をご確認ください。"</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"更新"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"ログイン"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Googleでログイン"</string> +</resources> diff --git a/google-play-services_lib/res/values-ka-rGE/common_strings.xml b/google-play-services_lib/res/values-ka-rGE/common_strings.xml new file mode 100644 index 0000000..a7faf54 --- /dev/null +++ b/google-play-services_lib/res/values-ka-rGE/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Google Play Services-ის შეცდომა"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"აპლიკაცია საჭიროება Google Play Services-ის ინსტალაციას."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"აპლიკაცია საჭიროებს Google Play Services-ის განახლებას."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"აპლიკაცია საჭიროებს გააქტიურებულ Google Play Services."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"მომთხოვნი: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Google Play სერვისების მიღება"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"ეს აპი ვერ გაეშვება Google Play სერვისების გარეშე, რაც თქვენს ტელეფონზე ვერ იძებნება."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"ეს აპი ვერ გაეშვება Google Play სერვისების გარეშე, რაც თქვენს ტელეფონზე ვერ იძებნება."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Google Play სერვისების მიღება"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Google Play სერვისების გააქტიურება"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"ეს აპი არ იმუშავებს, თუ არ გაააქტიურებთ Google Play სერვისებს."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Google Play სერვისების გააქტიურება"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Google Play სერვისების განახლება"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"ეს აპი ვერ გაეშვება, თუ Google Play სერვისებს არ განაახლებთ."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"ქსელის შეცდომა"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"Google Play Services-თან დასაკავშირებლად მონაცემთა გადაცემა აუცილებელია."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"ანგარიში არასწორია"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"მითითებული ანგარიში ამ მოწყობილობაზე არ არსებობს. გთხოვთ, აირჩიოთ სხვა ანგარიში."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Google Play სერვისებთან დაკავშირებით უცნობი შეფერხება წარმოიშვა."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Google Play სერვისები"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Google Play სერვისები, რაც თქვენს ზოგიერთ აპს ჭირდება, თქვენს მოწყობილობაზე მხარდაჭერილი არ არის. გთხოვთ, დაუკავშირდეთ მწარმოებელს დახმარებისათვის."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"როგორც ჩანს, მოწყობილობის თარიღი არასწორია. გთხოვთ, შეამოწმოთ მოწყობილობის თარიღი."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"განახლება"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"შესვლა"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Google-ით შესვლა"</string> +</resources> diff --git a/google-play-services_lib/res/values-km-rKH/common_strings.xml b/google-play-services_lib/res/values-km-rKH/common_strings.xml new file mode 100644 index 0000000..b047edd --- /dev/null +++ b/google-play-services_lib/res/values-km-rKH/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"កំហុសសេវាកម្ម Google កម្សាន្ត"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"កម្មវិធីទាមទារឲ្យដំឡើងសេវាកម្ម Google កម្សាន្ត។"</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"កម្មវិធីទាមទារធ្វើបច្ចុប្បន្នភាពសេវាកម្ម Google កម្សាន្ត។"</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"កម្មវិធីទាមទារឲ្យបើកសេវាកម្ម Google កម្សាន្ត។"</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"បានស្នើដោយ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"ទទួលសេវាកម្មកម្សាន្ត Google"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"កម្មវិធីនេះនឹងមិនដំណើរការទេបើគ្មានសេវាកម្មកម្សាន្ត Google ដែលទូរស័ព្ទរបស់អ្នកមិនមាន។"</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"កម្មវិធីនេះនឹងមិនដំណើរការទេបើគ្មានសេវាកម្មកម្សាន្ត Google ដែលកុំព្យូទ័របន្ទះរបស់អ្នកមិនមាន។"</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"ទទួលសេវាកម្មកម្សាន្ត Google"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"បើកសេវាកម្មកម្សាន្ត Google"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"កម្មវិធីនេះនឹងមិនដំណើរការទេ លុះត្រាតែអ្នកបើកសេវាកម្មកម្សាន្ត Google ។"</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"បើកសេវាកម្មកម្សាន្ត Google"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"ធ្វើបច្ចុប្បន្នភាពសេវាកម្មកម្សាន្ត Google"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"កម្មវិធីនេះនឹងមិនដំណើរការទេ លុះត្រាតែអ្នកធ្វើបច្ចុប្បន្នភាពសេវាកម្មកម្សាន្ត Google ។"</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"កំហុសបណ្ដាញ"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"បានទាមទារការតភ្ជាប់ទិន្នន័យ ដើម្បីភ្ជាប់សេវាកម្មឃ្លាំងកម្មវិធី។"</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"គណនីមិនត្រឹមត្រូវ"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"គណនីដែលបានបញ្ជាក់មិនមាននៅលើឧបករណ៍នេះទេ។ សូមជ្រើសគណនីផ្សេង។"</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"មិនស្គាល់បញ្ហាជាមួយសេវាកម្មកម្សាន្ត Google ។"</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"សេវាកម្មកម្សាន្ត Google"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"សេវាកម្មកម្សាន្ត Google អាស្រ័យលើកម្មវិធីរបស់អ្នក មិនត្រូវបានគាំទ្រដោយឧបករណ៍របស់អ្នក។ សូមទាក់ទងក្រុមហ៊ុនផលិតសម្រាប់ជំនួយ។"</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"កាលបរិច្ឆេទលើឧបករណ៍បង្ហាញថាមិនត្រឹមត្រូវ។ សូមពិនិត្យកាលបរិច្ឆេទលើឧបករណ៍។"</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"ធ្វើបច្ចុប្បន្នភាព"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"ចូល"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"ចូលដោយប្រើ Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-ko/common_strings.xml b/google-play-services_lib/res/values-ko/common_strings.xml new file mode 100644 index 0000000..045c6f5 --- /dev/null +++ b/google-play-services_lib/res/values-ko/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Google Play 서비스 오류"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"Google Play 서비스를 설치해야 하는 애플리케이션입니다."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"Google Play 서비스를 업데이트해야 하는 애플리케이션입니다."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"Google Play 서비스를 사용 설정해야 하는 애플리케이션입니다."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"<xliff:g id="APP_NAME">%1$s</xliff:g>에서 요청"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Google Play 서비스 설치"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"휴대전화에 Google Play 서비스가 설치되어 있어야 이 앱이 실행됩니다."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"태블릿에 Google Play 서비스가 설치되어 있어야 이 앱이 실행됩니다."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Google Play 서비스 설치"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Google Play 서비스 사용"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Google Play 서비스를 사용하도록 설정해야 이 앱이 작동합니다."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Google Play 서비스 사용"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Google Play 서비스 업데이트"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Google Play 서비스를 업데이트해야만 이 앱이 실행됩니다."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"네트워크 오류"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"Google Play 서비스에 연결하려면 데이터 연결이 필요합니다."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"올바르지 않은 계정"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"지정한 계정이 이 기기에 존재하지 않습니다. 다른 계정을 선택하세요."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Google Play 서비스에 알 수 없는 문제가 발생했습니다."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Google Play 서비스"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"일부 사용자 애플리케이션에 필요한 Google Play 서비스가 사용자 기기에서 지원되지 않습니다. 기기 제조업체에 문의하시기 바랍니다."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"기기의 날짜가 잘못된 것 같습니다. 기기의 날짜를 확인해 주세요."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"업데이트"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"로그인"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Google 계정으로 로그인"</string> +</resources> diff --git a/google-play-services_lib/res/values-lo-rLA/common_strings.xml b/google-play-services_lib/res/values-lo-rLA/common_strings.xml new file mode 100644 index 0000000..395cb92 --- /dev/null +++ b/google-play-services_lib/res/values-lo-rLA/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Google Play Services ເກີດຄວາມຜິດພາດ"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"ແອັບພລິເຄຊັນຕ້ອງການໃຫ້ຕິດຕັ້ງບໍລິການ Google Play ກ່ອນ."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"ແອັບພລິເຄຊັນຕ້ອງການໃຫ້ອັບເດດບໍລິການ Google Play ກ່ອນ."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"ແອັບພລິເຄຊັນຕ້ອງການນຳໃຊ້ Google Play Services."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"ຮ້ອງຂໍໂດຍ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"ຕິດຕັ້ງບໍລິການ Google Play"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"ແອັບຯນີ້ຈະບໍ່ສາມາດເຮັດວຽກໄດ້ໂດຍທີ່ບໍ່ມີບໍລິການ Google Play ເຊິ່ງຂາດຫາຍໄປໃນໂທລະສັບຂອງທ່ານ."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"ແອັບຯນີ້ຈະບໍ່ສາມາດເຮັດວຽກໄດ້ໂດຍທີ່ບໍ່ມີບໍລິການ Google Play ເຊິ່ງຂາດຫາຍໄປໃນແທັບເລັດຂອງທ່ານ."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"ຕິດຕັ້ງບໍລິການ Google Play"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"ເປີດໃຊ້ບໍລິການ Google Play"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"ແອັບຯນີ້ຈະບໍ່ສາມາດເຮັດວຽກໄດ້ຈົນກວ່າທ່ານຈະເປີດໃຊ້ບໍລິການ Google Play"</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"ເປີດໃຊ້ບໍລິການ Google Play"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"ອັບເດດບໍລິການ Google Play"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"ແອັບຯນີ້ຈະບໍ່ສາມາດເຮັດວຽກໄດ້ຈົນກວ່າທ່ານຈະອັບເດດບໍລິການ Google Play."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"ເຄືອຂ່າຍຜິດພາດ"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"ຕ້ອງໃຊ້ການເຊື່ອມຕໍ່ອິນເຕີເນັດເພື່ອໃຊ້ Google Play Services."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"ບັນຊີບໍ່ຖືກຕ້ອງ"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"ບັນຊີທີ່ເລືອກບໍ່ມີໃນອຸປະກອນນີ້. ກະລຸນາເລືອກບັນຊີອື່ນ."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"ມີປັນຫາທີ່ບໍ່ຄາດຄິດໃນບໍລິການ Google Play."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"ບໍລິການ Google Play"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"ບໍລິການ Google Play ທີ່ບາງແອັບພລິເຄຊັນຂອງທ່ານຕ້ອງອາໄສນັ້ນ ບໍ່ຖືກຮອງຮັບໃນອຸປະກອນຂອງທ່ານ. ກະລຸນາຕິດຕໍ່ຜູ້ຜະລິດສຳລັບການແນະນຳ."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"ວັນທີຂອງອຸປະກອນບໍ່ຖືກຕ້ອງ. ກະລຸນາກວດສອບວັນທີຂອງອຸປະກອນຂອງທ່ານ."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"ອັບເດດ"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"ເຂົ້າສູ່ລະບົບ"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"ເຂົ້າສູ່ລະບົບດ້ວຍ Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-lt/common_strings.xml b/google-play-services_lib/res/values-lt/common_strings.xml new file mode 100644 index 0000000..593ff35 --- /dev/null +++ b/google-play-services_lib/res/values-lt/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"„Google Play“ paslaugų klaida"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"Norint naudoti programą būtina įdiegti „Google Play“ paslaugas."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"Norint naudoti programą būtina atnaujinti „Google Play“ paslaugas."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"Norint naudoti programą būtina įgalinti „Google Play“ paslaugas."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Užklausą pateikė „<xliff:g id="APP_NAME">%1$s</xliff:g>“"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Gauti „Google Play“ paslaugų"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Ši programa neveiks be „Google Play“ paslaugų, kurios neįdiegtos telefone."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Ši programa neveiks be „Google Play“ paslaugų, kurios neįdiegtos planšetiniame kompiuteryje."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Gauti „Google Play“ paslaugų"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Įgalinti „Google Play“ paslaugas"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Ši programa neveiks, jei neįgalinsite „Google Play“ paslaugų."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Įgal. „Google Play“ paslaugas"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Atnaujinti „Google Play“ paslaugas"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Ši programa neveiks, jei neatnaujinsite „Google Play“ paslaugų."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Tinklo klaida"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"Norint prisijungti prie „Google Play“ paslaugų reikia duomenų ryšio."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Netinkama paskyra"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"Nurodytos paskyros šiame įrenginyje nėra. Pasirinkite kitą paskyrą."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Nežinoma „Google Play“ paslaugų problema."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"„Google Play“ paslaugos"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Jūsų įrenginys nepalaiko „Google Play“ paslaugų, kuriomis remiasi kai kurios programos. Jei reikia pagalbos, susisiekite su gamintoju."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"Įrenginyje nurodyta data neteisinga. Patikrinkite įrenginyje nurodytą datą."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Atnaujinti"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Prisij."</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Prisij. naud. „Google“"</string> +</resources> diff --git a/google-play-services_lib/res/values-lv/common_strings.xml b/google-play-services_lib/res/values-lv/common_strings.xml new file mode 100644 index 0000000..c0abaec --- /dev/null +++ b/google-play-services_lib/res/values-lv/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Google Play pakalpojumu kļūda"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"Lai lietojumprogramma darbotos, jāinstalē Google Play pakalpojumi."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"Lai lietojumprogramma darbotos, jāatjaunina Google Play pakalpojumi."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"Lai lietojumprogramma darbotos, jāiespējo Google Play pakalpojumi."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Pieprasījums no lietotnes <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Google Play pakalpojumu iegūšana"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Lai šī lietotne darbotos, tālrunī ir jāinstalē Google Play pakalpojumi."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Lai šī lietotne darbotos, planšetdatorā ir jāinstalē Google Play pakalpojumi."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Iegūt Google Play pakalpojumus"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Google Play pakalpojumu iespējošana"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Lai šī lietotne darbotos, iespējojiet Google Play pakalpojumus."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Iespējot Google Play pakalpojumus"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Google Play pakalpojumu atjaunināšana"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Lai šī lietotne darbotos, atjauniniet Google Play pakalpojumus."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Tīkla kļūda"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"Lai izveidotu savienojumu ar Google Play pakalpojumiem, ir nepieciešams datu savienojums."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Nederīgs konts"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"Norādītais konts šajā ierīcē nepastāv. Lūdzu, izvēlieties citu kontu."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Nezināma problēma ar Google Play pakalpojumiem."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Google Play pakalpojumi"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Jūsu ierīce neatbalsta Google Play pakalpojumus, kuri nepieciešami dažu jūsu lietojumprogrammu darbībai. Lūdzu, sazinieties ar ražotāju, lai saņemtu palīdzību."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"Šķiet, ka ierīcē ir iestatīts nepareizs datums. Lūdzu, pārbaudiet ierīces datumu."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Atjaunināt"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Pierakst."</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Pierakstīties Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-mn-rMN/common_strings.xml b/google-play-services_lib/res/values-mn-rMN/common_strings.xml new file mode 100644 index 0000000..bb1f101 --- /dev/null +++ b/google-play-services_lib/res/values-mn-rMN/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Google Наадаан үйлчилгээний алдаа"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"Аппликешн Google Наадаан Үйлчилгээг суулгахыг шаардана."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"Аппликешн Google Наадаан Үйлчилгээг шинэчлэхийг шаардана."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"Аппликешн Google Наадаан Үйлчилгээг идэвхжүүлсэн байхыг шаардана."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"<xliff:g id="APP_NAME">%1$s</xliff:g> хүсэлт гаргасан"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Google Play үйлчилгээ авах"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Таны утсанд байхгүй байгаа Google Play үйлчилгээг идэвхжүүлж байж энэ апп-г ажиллуулах боломжтой."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Таны таблетэд байхгүй Google Play үйлчилгээг идэвхжүүлж байж энэ апп-г ажиллуулах боломжтой."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Google Play үйлчилгээ авах"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Google Play үйлчилгээг идэвхжүүлэх"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Та Google Play үйлчилгээг идэвхжүүлж байж энэ апп-г ажиллуулах боломжтой."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Google Play үйлчилгээг идэвхжүүлэх"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Google Play үйлчилгээг шинэчлэх"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Та Google Play үйлчилгээг шинэчлэхгүй бол энэ апп ажиллах боломжгүй."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Сүлжээний алдаа"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"Google Play үйлчилгээнд холбогдохын тулд дата холболт шаардлагатай."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Буруу акаунт"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"Заасан акаунт энэ төхөөрөмж дээр байхгүй байна. Өөр акаунт сонгоно уу."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Google Play үйлчилгээтэй холбоотой тодорхойгүй алдаа."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Google Play үйлчилгээ"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Таны зарим аппликешнүүдийн хамаардаг Google Play үйлчилгээ таны төхөөрөмжид дэмжигдэхгүй байна. Тусламж авахын тулд үйлдвэрлэгчтэй холбоо барина уу."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"Төхөөрөмжийн огноо буруу байгаа бололтой. Төхөөрөмжийн огноог шалгана уу."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Шинэчлэх"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Нэвтрэх"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Google-р нэвтрэх:"</string> +</resources> diff --git a/google-play-services_lib/res/values-ms-rMY/common_strings.xml b/google-play-services_lib/res/values-ms-rMY/common_strings.xml new file mode 100644 index 0000000..28dec3c --- /dev/null +++ b/google-play-services_lib/res/values-ms-rMY/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Ralat perkhidmatan Google Play"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"Perkhidmatan Google Play perlu dipasang utk menggunakan aplikasi."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"Perkhidmatan Google Play perlu dikemas kini utk menggunakan aplikasi."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"Perkhidmatan Google Play perlu didayakan untuk menggunakan aplikasi."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Diminta oleh <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Dapatkan perkhidmatan Google Play"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Apl ini tidak akan berfungsi tanpa perkhidmatan Google Play dan apl ini tiada pada telefon anda."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Apl ini tidak akan berfungsi tanpa perkhidmatan Google Play dan apl ini tiada pada tablet anda."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Dapatkan perkhidmatan Google Play"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Dayakan perkhidmatan Google Play"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Apl ini tidak akan berfungsi kecuali anda mendayakan perkhidmatan Google Play."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Dayakan perkhidmatan Google Play"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Kemas kini perkhidmatan Google Play"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Apl ini tidak akan berfungsi kecuali anda mengemas kini perkhidmatan Google Play."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Ralat Rangkaian"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"Sambungan data diperlukan untuk menyambung ke perkhidmatan Google Play."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Akaun Tidak Sah"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"Akaun yang dinyatakan tidak wujud pada peranti ini. Sila pilih akaun yang lain."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Isu tidak diketahui dengan perkhidmatan Google Play."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Perkhidmatan Google Play"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Peranti anda tidak menyokong perkhidmatan Google Play, sedangkan sesetengah aplikasi anda memerlukannya. Sila hubungi pengilang untuk bantuan."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"Tarikh pada peranti kelihatan tidak betul. Sila semak tarikh pada peranti."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Kemas kini"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Log masuk"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Log masuk dengan Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-nb/common_strings.xml b/google-play-services_lib/res/values-nb/common_strings.xml new file mode 100644 index 0000000..e8eb375 --- /dev/null +++ b/google-play-services_lib/res/values-nb/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Google Play Tjenester-feil"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"En app krever installasjon av Google Play Tjenester."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"En app krever at Google Play Tjenester oppdateres."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"En app krever Google Play Tjenester for å aktiveres."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Forespurt av <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Installer Google Play Tjenester"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Denne appen kan ikke kjøres uten Google Play Tjenester, som ikke er installert på telefonen din."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Denne appen kan ikke kjøres uten Google Play Tjenester, som ikke er installert på nettbrettet ditt."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Installer Google Play Tjenester"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Aktiver Google Play Tjenester"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Denne appen fungerer ikke med mindre du aktiverer Google Play Tjenester."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Aktiver Google Play Tjenester"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Oppdater Google Play Tjenester"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Denne appen kan ikke kjøres før du oppdaterer Google Play Tjenester."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Nettverksfeil"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"Du må ha datatilkobling for å koble deg til Google Play-tjenester."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Ugyldig konto"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"Den angitte kontoen finnes ikke på enheten. Velg en annen konto."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Det oppsto et ukjent problem med Google Play Tjenester."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Google Play-tjenester"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Google Play Tjenester, som noen av appene er avhengige av, støttes ikke av enheten. Ta kontakt med produsenten for å få hjelp."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"Datoen på enheten ser ut til å være feil. Sjekk datoen på enheten."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Oppdater"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Logg på"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Logg inn med Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-nl/common_strings.xml b/google-play-services_lib/res/values-nl/common_strings.xml new file mode 100644 index 0000000..4295986 --- /dev/null +++ b/google-play-services_lib/res/values-nl/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Fout met Google Play-services"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"Google Play-services moet zijn geïnstalleerd voor een app."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"Google Play-services moet worden bijgewerkt voor een app."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"Google Play-services moet zijn ingeschakeld voor een app."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Aangevraagd door <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Google Play-services ophalen"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Deze app kan niet worden uitgevoerd zonder Google Play-services die ontbreken op uw telefoon."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Deze app kan niet worden uitgevoerd zonder Google Play-services die ontbreken op uw tablet."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Google Play-services ophalen"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Google Play-services inschakelen"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Deze app werkt niet, tenzij u Google Play-services inschakelt."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Google Play-services inschak."</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Google Play-services bijwerken"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Deze app kan niet worden uitgevoerd, tenzij u Google Play-services bijwerkt."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Netwerkfout"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"Er is een gegevensverbinding nodig om verbinding te kunnen maken met Google Play-services."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Ongeldig account"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"Het gespecificeerde account bestaat niet op dit apparaat. Kies een ander account."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Onbekend probleem met Google Play-services."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Google Play-services"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Google Play-services, dat vereist is voor een aantal van uw applicaties, wordt niet ondersteund door uw apparaat. Neem contact op met de fabrikant voor ondersteuning."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"De datum op het apparaat lijkt onjuist. Controleer de datum op het apparaat."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Bijwerken"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Inloggen"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Inloggen met Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-pl/common_strings.xml b/google-play-services_lib/res/values-pl/common_strings.xml new file mode 100644 index 0000000..201b4b7 --- /dev/null +++ b/google-play-services_lib/res/values-pl/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Błąd Usług Google Play"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"Aplikacja wymaga zainstalowania Usług Google Play."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"Aplikacja wymaga zaktualizowania Usług Google Play."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"Aplikacja wymaga włączenia Usług Google Play."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Żądanie z aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Pobierz Usługi Google Play"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Ta aplikacja nie będzie działać bez Usług Google Play, których nie masz na telefonie."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Ta aplikacja nie będzie działać bez Usług Google Play, których nie masz na tablecie."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Pobierz Usługi Google Play"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Włącz Usługi Google Play"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Ta aplikacja nie będzie działać, jeśli nie włączysz Usług Google Play."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Włącz Usługi Google Play"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Aktualizuj Usługi Google Play"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Ta aplikacja nie będzie działać, jeśli nie zaktualizujesz Usług Google Play."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Błąd sieci"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"Korzystanie z usług Google Play wymaga połączenia z internetem."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Nieprawidłowe konto"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"Podanego konta nie ma na tym urządzeniu. Wybierz inne konto."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Nieznany problem z Usługami Google Play."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Usługi Google Play"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Usługi Google Play, od których zależy działanie niektórych aplikacji, nie są obsługiwane na Twoim urządzeniu. Skontaktuj się z producentem, by uzyskać pomoc."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"Data ustawiona na urządzeniu wydaje się nieprawidłowa. Sprawdź datę ustawioną na urządzeniu."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Aktualizuj"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Zaloguj się"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Zaloguj się przez Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-pt-rBR/common_strings.xml b/google-play-services_lib/res/values-pt-rBR/common_strings.xml new file mode 100644 index 0000000..5d129fb --- /dev/null +++ b/google-play-services_lib/res/values-pt-rBR/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Erro do Google Play Services"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"Um aplicativo requer a instalação do Google Play Services."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"Um aplicativo requer a atualização do Google Play Services."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"Um aplicativo requer a ativação do Google Play Services."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Solicitado por <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Instale o Google Play Services"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Este aplicativo não funciona sem o Google Play Services, que não está instalado em seu telefone."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Este aplicativo não funciona sem o Google Play Services, que não está instalado em seu tablet."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Instalar o Google Play Services"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Ative o Google Play Services"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Este aplicativo só funciona com o Google Play Services ativado."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Ativar o Google Play Services"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Atualize o Google Play Services"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Este aplicativo só funciona com uma versão atualizada do Google Play Services."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Erro na rede"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"É necessária uma conexão de dados para conectar ao Google Play Services."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Conta inválida"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"A conta especificada não existe no dispositivo. Escolha outra conta."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Problema desconhecido com o Google Play Services."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Play Services"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"O Google Play Services, necessário para alguns dos aplicativos, não é compatível com seu dispositivo. Entre em contato com o fabricante para obter assistência."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"A data no dispositivo parece incorreta. Verifique a data no dispositivo."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Atualizar"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Login"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Fazer login com o Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-pt-rPT/common_strings.xml b/google-play-services_lib/res/values-pt-rPT/common_strings.xml new file mode 100644 index 0000000..11dc641 --- /dev/null +++ b/google-play-services_lib/res/values-pt-rPT/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Erro dos Serviços do Google Play"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"Uma aplicação necessita da instalação dos Serviços do Google Play."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"Uma aplicação necessita da atualização dos Serviços do Google Play."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"Uma aplicação necessita da ativação dos Serviços do Google Play."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Pedida por <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Obter serviços do Google Play"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Esta aplicação não será executada sem os serviços do Google Play, que estão em falta no seu telemóvel."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Esta aplicação não será executada sem os serviços do Google Play, que estão em falta no seu tablet."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Obter serviços do Google Play"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Ativar serviços do Google Play"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Esta aplicação não funcionará enquanto não ativar os serviços do Google Play."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Ativar serviços do Google Play"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Atualizar serviços do Google Play"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Esta aplicação não será executada enquanto não atualizar os serviços do Google Play."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Erro de Rede"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"É necessária uma ligação de dados para se ligar aos Serviços do Google Play."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Conta Inválida"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"A conta especificada não existe neste dispositivo. Escolha uma conta diferente."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Problema desconhecido nos serviços do Google Play."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Serviços do Google Play"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Os serviços do Google Play, dos quais dependem algumas das suas aplicações, não são suportados pelo seu dispositivo. Contacte o fabricante para obter assistência."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"A data no dispositivo parece estar incorreta. Verifique a data no dispositivo."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Atualizar"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Inic. ses."</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Inic. sessão com o Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-pt/common_strings.xml b/google-play-services_lib/res/values-pt/common_strings.xml new file mode 100644 index 0000000..5d129fb --- /dev/null +++ b/google-play-services_lib/res/values-pt/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Erro do Google Play Services"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"Um aplicativo requer a instalação do Google Play Services."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"Um aplicativo requer a atualização do Google Play Services."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"Um aplicativo requer a ativação do Google Play Services."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Solicitado por <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Instale o Google Play Services"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Este aplicativo não funciona sem o Google Play Services, que não está instalado em seu telefone."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Este aplicativo não funciona sem o Google Play Services, que não está instalado em seu tablet."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Instalar o Google Play Services"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Ative o Google Play Services"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Este aplicativo só funciona com o Google Play Services ativado."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Ativar o Google Play Services"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Atualize o Google Play Services"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Este aplicativo só funciona com uma versão atualizada do Google Play Services."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Erro na rede"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"É necessária uma conexão de dados para conectar ao Google Play Services."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Conta inválida"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"A conta especificada não existe no dispositivo. Escolha outra conta."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Problema desconhecido com o Google Play Services."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Play Services"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"O Google Play Services, necessário para alguns dos aplicativos, não é compatível com seu dispositivo. Entre em contato com o fabricante para obter assistência."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"A data no dispositivo parece incorreta. Verifique a data no dispositivo."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Atualizar"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Login"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Fazer login com o Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-ro/common_strings.xml b/google-play-services_lib/res/values-ro/common_strings.xml new file mode 100644 index 0000000..ae3c157 --- /dev/null +++ b/google-play-services_lib/res/values-ro/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Eroare a serviciilor Google Play"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"O aplicație necesită instalarea serviciilor Google Play."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"O aplicație necesită o actualizare pentru serviciile Google Play."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"O aplicație necesită activarea serviciilor Google Play."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Solicitată de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Descărcaţi Servicii Google Play"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Această aplicaţie nu poate rula fără Servicii Google Play, care lipsesc de pe telefon."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Această aplicaţie nu poate rula fără Servicii Google Play, care lipsesc de pe tabletă."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Obţineţi Servicii Google Play"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Activaţi Servicii Google Play"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Această aplicaţie nu va funcţiona decât dacă activaţi Servicii Google Play."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Activaţi Servicii Google Play"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Actualizaţi Servicii Google Play"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Această aplicaţie nu poate rula decât dacă actualizaţi Servicii Google Play."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Eroare de reţea"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"Este necesară o conexiune de date pentru a vă conecta la serviciile Google Play."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Cont nevalid"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"Contul menționat nu există pe acest dispozitiv. Alegeți alt cont."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Problemă necunoscută privind Servicii Google Play."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Servicii Google Play"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Gadgetul nu acceptă serviciile Google Play, pe care se bazează unele dintre aplicații. Pentru asistență, contactați producătorul gadgetului."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"Data de pe dispozitiv pare să fie incorectă. Verificați data de pe dispozitiv."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Actualizaţi"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Conectați"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Conectați-vă cu Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-ru/common_strings.xml b/google-play-services_lib/res/values-ru/common_strings.xml new file mode 100644 index 0000000..8ec20f0 --- /dev/null +++ b/google-play-services_lib/res/values-ru/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Ошибка сервисов Google Play"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"Для работы приложения требуется установить сервисы Google Play"</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"Для работы приложения требуется обновить сервисы Google Play"</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"Для работы приложения требуется включить сервисы Google Play"</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Источник запроса: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Установите Сервисы Google Play"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Для работы этого приложения требуется установить Сервисы Google Play."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Для работы этого приложения требуется установить Сервисы Google Play."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Установить"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Включите Сервисы Google Play"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Для работы этого приложения требуется включить Сервисы Google Play."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Включить"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Обновите Сервисы Google Play"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Для работы этого приложения требуется обновить Сервисы Google Play."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Ошибка сети"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"Для работы с Google Play требуется подключение к сети."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Недействительный аккаунт"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"Этого аккаунта нет на устройстве. Выберите другой."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Неизвестная ошибка с Сервисами Google Play."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Сервисы Google Play"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Сервисы Google Play, необходимые для работы некоторых приложений, не поддерживаются на вашем устройстве. Обратитесь к производителю."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"Проверьте правильность даты, указанной на устройстве."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Обновить"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Войти"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Войти в аккаунт Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-sk/common_strings.xml b/google-play-services_lib/res/values-sk/common_strings.xml new file mode 100644 index 0000000..fc41ae7 --- /dev/null +++ b/google-play-services_lib/res/values-sk/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Chyba služieb Google Play"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"Aplikácia vyžaduje inštaláciu služieb Google Play."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"Aplikácia vyžaduje aktualizáciu služieb Google Play."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"Aplikácia vyžaduje povolenie služieb Google Play."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Vyžiadané aplikáciou <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Inštalovať služby Google Play"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Na spustenie tejto aplikácie sa vyžadujú služby Google Play, ktoré v telefóne nemáte."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Na spustenie tejto aplikácie sa vyžadujú služby Google Play, ktoré v tablete nemáte."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Inštalovať služby Google Play"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Povoliť služby Google Play"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Táto aplikácia bude fungovať až po povolení služieb Google Play."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Povoliť služby Google Play"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Aktualizovať služby Google Play"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Túto aplikáciu bude možné spustiť až po aktualizácii služieb Google Play."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Chyba siete"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"Pripojenie k službám Google Play si vyžaduje dátové pripojenie."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Neplatný účet"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"Zadaný účet v tomto zariadení neexistuje. Vyberte iný účet."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Neznámy problém so službami Google Play."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Služby Google Play"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Niektoré vaše aplikácie vyžadujú služby Google Play, ktoré vo vašom zariadení nie sú podporované. Ak potrebujete pomoc, kontaktujte výrobcu."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"Dátum nastavený v zariadení sa zdá byť nesprávny. Skontrolujte ho."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Aktualizovať"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Prihlásiť sa"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Prihlásiť sa do účtu Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-sl/common_strings.xml b/google-play-services_lib/res/values-sl/common_strings.xml new file mode 100644 index 0000000..175abd1 --- /dev/null +++ b/google-play-services_lib/res/values-sl/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Napaka storitev Google Play"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"Za delovanje aplikacije morate namestiti storitve Google Play."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"Za delovanje aplikacije morate posodobiti storitve Google Play."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"Za delovanje aplikacije morate omogočiti storitve Google Play."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Zahteva aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Namestite storitve Google Play"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Ta aplikacija ne deluje brez storitev Google Play, ki jih ni v telefonu."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Ta aplikacija ne deluje brez storitev Google Play, ki jih ni v tabličnem računalniku."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Namestite storitve Google Play"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Omogočite storitve Google Play"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Aplikacija ne bo delovala, če ne omogočite storitev Google Play."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Omogočite storitve Google Play"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Posodobite storitve Google Play"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Ta aplikacija ne deluje, če ne posodobite storitev Google Play."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Omrežna napaka"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"Za povezavo s storitvami Google Play potrebujete internetno povezavo."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Neveljaven račun"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"V tej napravi ne obstaja navedeni račun. Izberite drugega."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Neznana težava s storitvami Google Play."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Storitve Google Play"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Vaša naprava na podpira storitev Google Play, ki jih potrebujejo nekatere od vaših aplikacij. Za pomoč se obrnite na izdelovalca."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"Videti je, da je datum v napravi napačen. Preverite ga."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Posodobi"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Prijava"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Prijavite se v Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-sr/common_strings.xml b/google-play-services_lib/res/values-sr/common_strings.xml new file mode 100644 index 0000000..db89318 --- /dev/null +++ b/google-play-services_lib/res/values-sr/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Грешка Google Play услуга"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"Апликација захтева инсталацију Google Play услуга."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"Апликација захтева ажурирање Google Play услуга."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"Апликација захтева да Google Play услуге буду омогућене."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Захтева <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Преузимање Google Play услуга"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Ова апликација не може да се покрене без Google Play услуга, које недостају на телефону."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Ова апликација не може да се покрене без Google Play услуга, које недостају на таблету."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Преузми Google Play услуге"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Омогућавање Google Play услуга"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Ова апликација неће функционисати ако не омогућите Google Play услуге."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Омогући Google Play услуге"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Ажурирање Google Play услуга"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Ова апликација не може да се покрене ако не ажурирате Google Play услуге."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Грешка на мрежи"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"За повезивање са Google Play услугама потребна је веза за пренос података."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Неважећи налог"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"Наведени налог не постоји на овом уређају. Одаберите други налог."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Непознат проблем са Google Play услугама."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Google Play услуге"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Google Play услуге, које су потребне за функционисање неких од апликација, нису подржане на уређају. Контактирајте произвођача да бисте добили помоћ."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"Изгледа да су подаци на уређају нетачни. Проверите датум на уређају."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Ажурирај"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Пријави ме"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Пријави ме преко Google-а"</string> +</resources> diff --git a/google-play-services_lib/res/values-sv/common_strings.xml b/google-play-services_lib/res/values-sv/common_strings.xml new file mode 100644 index 0000000..5092a5d --- /dev/null +++ b/google-play-services_lib/res/values-sv/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Fel på Google Play-tjänster"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"Google Play-tjänster måste installeras för att en app ska fungera."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"Google Play-tjänster måste uppdateras för en app ska fungera."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"Google Play-tjänster måste aktiveras för att en app ska fungera."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Begärdes av <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Hämta Google Play Tjänster"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Den här appen kan inte köras utan Google Play Tjänster, som saknas på mobilen."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Den här appen kan inte köras utan Google Play Tjänster, som saknas på surfplattan."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Hämta Google Play Tjänster"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Aktivera Google Play Tjänster"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Du måste aktivera Google Play Tjänster för att den här appen ska fungera."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Aktivera Google Play Tjänster"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Uppdatera Google Play Tjänster"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Du måste uppdatera Google Play Tjänster innan du kan köra den här appen."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Nätverksfel"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"En dataanslutning krävs för att ansluta till Google Plays tjänster."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Ogiltigt konto"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"Det angivna kontot finns inte på den här enheten. Välj ett annat konto."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Okänt problem med Google Play Tjänster"</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Google Play-tjänster"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Några av dina appar använder Google Play-tjänster som inte stöds av din enhet. Kontakta tillverkaren om du vill ha hjälp."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"Datumet på enheten verkar inte vara rätt. Kontrollera datumet på enheten."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Uppdatera"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Logga in"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Logga in med Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-sw/common_strings.xml b/google-play-services_lib/res/values-sw/common_strings.xml new file mode 100644 index 0000000..9fc6808 --- /dev/null +++ b/google-play-services_lib/res/values-sw/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Hitilafu kwenye huduma za Google Play"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"Programu inahitaji usakinishaji wa huduma za Google Play."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"Programu inahitaji toleo jipya la huduma za Google Play."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"Programu inahitaji huduma za Google Play ili iwashwe."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Imeombwa na <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Pata huduma za Google Play"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Programu hii haiwezi kuendeshwa bila huduma za Google Play, ambazo hazipo kwenye simu yako."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Programu hii haiwezi kufanya kazi bila huduma za Google Play, ambazo hazipatikani kwenye kompyuta kibao yako."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Pata huduma za Google Play"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Wezesha huduma za Google Play"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Programu hii haitafanya kazi mpaka utakapowezesha huduma za Google Play."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Wezesha huduma za Google Play"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Sasisha huduma za Google Play"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Programu hii haiwezi kuendeshwa mpaka utakaposasisha huduma za Google Play."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Hitilafu ya Mtandao"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"Muunganisho wa data unahitajika ili kuunganisha kwenye huduma za Google Play."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Akaunti Batili"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"Akaunti iliyobainishwa haipo kwenye kifaa hiki. Tafadhali chagua akaunti tofauti."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Suala lisilojulikana na huduma za Google Play."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Huduma za Google Play"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Huduma za Google Play, ambazo baadhi ya programu zako zinategemea, si linganifu na kifaa chako. Tafadhali wasiliana na mtengenezaji kwa usaidizi."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"Inaeonekana tarehe ya kifaa sio sahihi. Tafadhali angalia tarehe ya kifaa."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Sasisha"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Ingia"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Ingia ukitumia Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-th/common_strings.xml b/google-play-services_lib/res/values-th/common_strings.xml new file mode 100644 index 0000000..06ab727 --- /dev/null +++ b/google-play-services_lib/res/values-th/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"ข้อผิดพลาดของบริการ Google Play"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"แอปพลิเคชันหนึ่งจำเป็นต้องมีการติดตั้งบริการ Google Play"</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"แอปพลิเคชันหนึ่งจำเป็นต้องมีการอัปเดตสำหรับบริการ Google Play"</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"แอปพลิเคชันหนึ่งจำเป็นต้องมีบริการ Google Play เพื่อเปิดใช้งาน"</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"ขอโดย <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"รับบริการ Google Play"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"แอปพลิเคชันนี้จะไม่ทำงานหากไม่มีบริการ Google Play ซึ่งไม่มีในโทรศัพท์ของคุณ"</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"แอปพลิเคชันนี้จะไม่ทำงานหากไม่มีบริการ Google Play ซึ่งไม่มีในแท็บเล็ตของคุณ"</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"รับบริการ Google Play"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"เปิดใช้งานบริการ Google Play"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"แอปพลิเคชันนี้จะไม่ทำงานจนกว่าคุณจะเปิดใช้งานบริการ Google Play"</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"เปิดใช้งานบริการ Google Play"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"อัปเดตบริการ Google Play"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"แอปพลิเคชันนี้จะไม่ทำงานจนกว่าคุณจะอัปเดตบริการ Google Play"</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"ข้อผิดพลาดของเครือข่าย"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"ต้องมีการเขื่อมต่อข้อมูลเพื่อเชื่อมต่อกับบริการ Google Play"</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"บัญชีไม่ถูกต้อง"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"บัญชีที่ระบุไม่มีอยู่บนอุปกรณ์นี้ โปรดเลือกบัญชีอื่น"</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"ปัญหาที่ไม่รู้จักของบริการ Google Play"</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"บริการ Google Play"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"บริการ Google Play ซึ่งใช้งานในบางแอปพลิเคชัน ไม่ได้รับการสนับสนุนโดยอุปกรณ์ของคุณ โปรดติดต่อผู้ผลิตเพื่อขอรับความช่วยเหลือ"</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"วันที่บนอุปกรณ์ไม่ถูกต้อง โปรดตรวจสอบวันที่บนอุปกรณ์"</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"อัปเดต"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"ลงชื่อใช้"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"ลงชื่อเข้าใช้ด้วย Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-tl/common_strings.xml b/google-play-services_lib/res/values-tl/common_strings.xml new file mode 100644 index 0000000..be5c90e --- /dev/null +++ b/google-play-services_lib/res/values-tl/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Error sa Mga Serbisyo ng Google Play"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"Kailangan ng application na i-install ang Mga Serbisyo ng Google Play."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"Kailangan ng application ng update sa Mga Serbisyo ng Google Play."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"Kailangan ng application na na-enable ang Mga Serbisyo ng Google Play."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Hiniling ng <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Kumuha ng mga serbisyo ng Google Play"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Hindi tatakbo ang app na ito nang wala ang mga serbisyo ng Google Play, na wala sa iyong telepono."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Hindi gagana ang app na ito nang wala ang mga serbisyo ng Google Play, na wala sa iyong tablet."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Kumuha ng Google Play services"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Paganahin ang Google Play services"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Hindi gagana ang app na ito maliban kung papaganahin mo ang mga serbisyo ng Google Play."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Enable Google Play services"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"I-update ang mga serbisyo ng Google Play"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Hindi gagana ang app na ito maliban kung i-a-update mo ang mga serbisyo ng Google Play."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"May Error sa Network"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"Kailangan ng koneksyon ng data upang makakonekta sa mga serbisyo ng Google Play."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Di-wasto ang Account"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"Hindi umiiral ang tinukoy na account sa device na ito. Mangyaring pumili ng ibang account."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"May hindi alam na isyu sa mga serbisyo ng Google Play."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Mga serbisyo ng Google Play"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Ang mga serbisyo ng Google Play, kung saan nakadepende ang ilan sa iyong mga application, ay hindi sinusuportahan ng iyong device. Mangyaring makipag-ugnay sa manufacturer para sa tulong."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"Mukhang hindi tama ang petsa sa device. Pakisuri ang petsa sa device."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"I-update"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Sign in"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Mag-sign in sa Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-tr/common_strings.xml b/google-play-services_lib/res/values-tr/common_strings.xml new file mode 100644 index 0000000..b17e5f4 --- /dev/null +++ b/google-play-services_lib/res/values-tr/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Google Play Hizmetleri hatası"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"Bir uygulama, Google Play hizmetlerinin yüklenmesini gerektiriyor."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"Bir uygulama, Google Play Hizmetleri için bir güncelleme gerektiriyor."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"Bir uygulama, Google Play Hizmetleri\'nin etkin olmasını gerektiriyor."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"İstekte bulunan: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Google Play hizmetlerini edinin"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Google Play Hizmetleri telefonunuzda yok ve bu uygulama Google Play Hizmetleri olmadan çalışmaz."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Google Play Hizmetleri tabletinizde yok ve bu uygulama Google Play Hizmetleri olmadan çalışmaz."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Google Play hizmetlerini edin"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Google Play hizmetlerini etkinleştir"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Bu uygulama, Google Play Hizmetleri etkinleştirilmeden çalışmaz"</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Google Play hizmetlerini etkinleştir"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Google Play hizmetlerini güncelle"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Bu uygulama Google Play Hizmetleri güncellenmeden çalışmaz."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Ağ Hatası"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"Google Play hizmetlerine bağlanmak için bir veri bağlantısı gerekiyor."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Geçersiz Hesap"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"Belirtilen hesap bu cihazda mevcut değil. Lütfen farklı bir hesap seçin."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Google Play hizmetleriyle ilgili bilinmeyen sorun."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Google Play hizmetleri"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Cihazınız, uygulamalarınızdan bazıları için gerekli olan Google Play hizmetlerini desteklemiyor. Lütfen yardım için üreticiyle iletişim kurun."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"Cihazdaki tarih doğru görünmüyor. Lütfen cihazda ayarlı tarihi kontrol edin."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Güncelle"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Oturum aç"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Google\'da oturum aç"</string> +</resources> diff --git a/google-play-services_lib/res/values-uk/common_strings.xml b/google-play-services_lib/res/values-uk/common_strings.xml new file mode 100644 index 0000000..a5f46b2 --- /dev/null +++ b/google-play-services_lib/res/values-uk/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Помилка сервісів Google Play"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"Щоб додаток працював, потрібно встановити сервіси Google Play."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"Щоб додаток працював, потрібно оновити сервіси Google Play."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"Щоб додаток працював, потрібно ввімкнути сервіси Google Play."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Запит від додатка <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Установити Google Play Послуги"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Ця програма не запуститься без Google Play Послуг, яких немає у вашому телефоні."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Ця програма не запуститься без Google Play Послуг, яких немає на вашому планшетному ПК."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Установити Google Play Послуги"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Увімкнути Google Play Послуги"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Ця програма не працюватиме, поки ви не ввімкнете Google Play Послуги."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Увімкнути Google Play Послуги"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Оновити Google Play Послуги"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Ця програма не запуститься, поки ви не оновите Google Play Послуги."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Помилка мережі"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"Для під’єднання до сервісів Google Play потрібне з’єднання з мережею."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Недійсний обліковий запис"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"Указаний обліковий запис не існує на цьому пристрої. Виберіть інший обліковий запис."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Google Play Послуги – невідома проблема."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Сервіси Google Play"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Ваш пристрій не підтримує Сервіси Google Play, від яких залежить робота деяких програм. Зверніться по допомогу до виробника."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"Схоже, на пристрої вказано неправильну дату. Перевірте її."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Оновити"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Увійти"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Увійти в обл.запис Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-vi/common_strings.xml b/google-play-services_lib/res/values-vi/common_strings.xml new file mode 100644 index 0000000..cf431d3 --- /dev/null +++ b/google-play-services_lib/res/values-vi/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Lỗi dịch vụ của Google Play"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"Một ứng dụng yêu cầu cài đặt các dịch vụ của Google Play."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"Một ứng dụng yêu cầu cập nhật đối với các dịch vụ của Google Play."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"Một ứng dụng yêu cầu bật các dịch vụ của Google Play."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Được yêu cầu bởi <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Cài đặt dịch vụ của Google Play"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Ứng dụng này sẽ không chạy nếu không có dịch vụ của Google Play. Điện thoại của bạn bị thiếu dịch vụ này."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Ứng dụng này sẽ không chạy nếu không có dịch vụ của Google Play. Máy tính bảng của bạn bị thiếu dịch vụ này."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Cài đặt dịch vụ của Google Play"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Bật dịch vụ của Google Play"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Ứng dụng này sẽ không hoạt động trừ khi bạn bật dịch vụ của Google Play."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Bật dịch vụ của Google Play"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Cập nhật dịch vụ của Google Play"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Ứng dụng này sẽ không chạy trừ khi bạn cập nhật dịch vụ của Google Play."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Lỗi mạng"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"Cần có kết nối dữ liệu để kết nối với các dịch vụ của Google Play."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"Tài khoản không hợp lệ"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"Tài khoản đã chỉ định không tồn tại trên thiết bị này. Vui lòng chọn một tài khoản khác."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Sự cố không xác định với dịch vụ của Google Play."</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Dịch vụ của Google Play"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Các dịch vụ của Google Play mà một số ứng dụng của bạn dựa vào không được thiết bị của bạn hỗ trợ. Vui lòng liên hệ với nhà sản xuất để được hỗ trợ."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"Ngày trên thiết bị có vẻ không chính xác. Vui lòng kiểm tra ngày trên thiết bị."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Cập nhật"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Đăng nhập"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Đăng nhập bằng Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-zh-rCN/common_strings.xml b/google-play-services_lib/res/values-zh-rCN/common_strings.xml new file mode 100644 index 0000000..40161bf --- /dev/null +++ b/google-play-services_lib/res/values-zh-rCN/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Google Play服务出错"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"安装Google Play服务后才能运行应用。"</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"更新Google Play服务后才能运行应用。"</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"启用Google Play服务后才能运行应用。"</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"由“<xliff:g id="APP_NAME">%1$s</xliff:g>”发出"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"获取 Google Play 服务"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"您的手机中没有 Google Play 服务,您必须先安装该服务才能运行此应用。"</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"您的平板电脑中没有 Google Play 服务,您必须先安装该服务才能运行此应用。"</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"获取 Google Play 服务"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"启用 Google Play 服务"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"您必须先启用 Google Play 服务才能运行此应用。"</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"启用 Google Play 服务"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"更新 Google Play 服务"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"您必须先更新 Google Play 服务才能运行此应用。"</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"网络错误"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"您必须有数据网络连接才能接入 Google Play 服务。"</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"无效帐户"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"此设备上不存在指定的帐户,请选择其他帐户。"</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Google Play 服务出现未知问题。"</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Google Play 服务"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"您的设备不支持部分应用所依赖的 Google Play 服务。请与设备制造商联系,以寻求帮助。"</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"设备上的日期似乎不正确,请在设备上检查日期。"</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"更新"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"登录"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"使用 Google 帐户登录"</string> +</resources> diff --git a/google-play-services_lib/res/values-zh-rHK/common_strings.xml b/google-play-services_lib/res/values-zh-rHK/common_strings.xml new file mode 100644 index 0000000..e28f2e1 --- /dev/null +++ b/google-play-services_lib/res/values-zh-rHK/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Google Play 服務錯誤"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"必須安裝「Google Play 服務」,才能使用應用程式。"</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"必須更新「Google Play 服務」,才能使用應用程式。"</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"必須啟用「Google Play 服務」,才能使用應用程式。"</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」提出要求"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"取得 Google Play 服務"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"您的手機未安裝 Google Play 服務,安裝後才能執行這個應用程式。"</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"您的平板電腦未安裝 Google Play 服務,安裝後才能執行這個應用程式。"</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"取得 Google Play 服務"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"啟用 Google Play 服務"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"您必須啟用 Google Play 服務,才能執行這個應用程式。"</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"啟用 Google Play 服務"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"更新 Google Play 服務"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"您必須更新 Google Play 服務,才能執行這個應用程式。"</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"網絡錯誤"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"要連接 Google Play 服務,必需數據連線。"</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"無效的帳戶"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"這個裝置上沒有您指定的帳戶,請選擇其他帳戶。"</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Google Play 服務出現不明問題。"</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Google Play 服務"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"您的裝置不支援部分應用程式所需的 Google Play 服務。如需協助,請與您的裝置製造商聯絡。"</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"裝置上的日期看來不正確,請檢查裝置上的日期。"</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"更新"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"登入"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"登入 Google"</string> +</resources> diff --git a/google-play-services_lib/res/values-zh-rTW/common_strings.xml b/google-play-services_lib/res/values-zh-rTW/common_strings.xml new file mode 100644 index 0000000..0990b71 --- /dev/null +++ b/google-play-services_lib/res/values-zh-rTW/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Google Play 服務發生錯誤"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"應用程式要求安裝 Google Play 服務。"</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"應用程式要求更新 Google Play 服務。"</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"應用程式要求啟用 Google Play 服務。"</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」提出要求"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"取得 Google Play 服務"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"您的手機並未安裝 Google Play 服務,所以無法執行這個應用程式。"</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"您的平板電腦並未安裝 Google Play 服務,所以無法執行這個應用程式。"</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"取得 Google Play 服務"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"啟用 Google Play 服務"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"您必須啟用 Google Play 服務,這個應用程式才能運作。"</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"啟用 Google Play 服務"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"更新 Google Play 服務"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"您必須更新 Google Play 服務,才能執行這個應用程式。"</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"網路錯誤"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"需要數據連線才能連上 Google Play 服務。"</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"無效的帳戶"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"這個裝置上沒有您所指定的帳戶,請選擇其他帳戶。"</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Google Play 服務發生不明問題。"</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Google Play 服務"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"您的裝置不支援部分應用程式所需的 Google Play 服務。如需協助,請與您的裝置製造商聯絡。"</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"裝置上的日期似乎不正確,請檢查裝置上的日期。"</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"更新"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"登入"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"使用 Google 帳戶登入"</string> +</resources> diff --git a/google-play-services_lib/res/values-zu/common_strings.xml b/google-play-services_lib/res/values-zu/common_strings.xml new file mode 100644 index 0000000..1e39af2 --- /dev/null +++ b/google-play-services_lib/res/values-zu/common_strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="common_google_play_services_notification_ticker" msgid="1852570676146674985">"Iphutha lamasevisi we-Google Play"</string> + <string name="common_google_play_services_notification_needs_installation_title" msgid="8120534356798772974">"Uhlelo lokusebenza ludinga ukufakwa kwamasevisi we-Google Play."</string> + <string name="common_google_play_services_notification_needs_update_title" msgid="1388129345631079938">"Uhlelo lokusebenza ludinga isibuyekezo samasevisi we-Google Play."</string> + <string name="common_google_play_services_needs_enabling_title" msgid="2583358409598976717">"Uhlelo lokusebenza ludinga amasevisi we-Google Play ukuze anikwe amandla."</string> + <string name="common_google_play_services_error_notification_requested_by_msg" msgid="2443362625939284971">"Icelwe yi-<xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="common_google_play_services_install_title" msgid="26645092511305524">"Thola amasevisi e-Google Play"</string> + <string name="common_google_play_services_install_text_phone" msgid="8685301130651051380">"Lolu hlelo lokusebenza ngeke lusebenze ngaphandle kwamasevisi e-Google Play, angekho efonini yakho."</string> + <string name="common_google_play_services_install_text_tablet" msgid="1589957570365247855">"Lolu hlelo lokusebenza ngeke lusebenze ngaphandle kwamasevisi e-Google Play, angekho kuthebulethi yakho."</string> + <string name="common_google_play_services_install_button" msgid="8515591849428043265">"Thola amasevisi e-Google Play"</string> + <string name="common_google_play_services_enable_title" msgid="529078775174559253">"Nika amandla amasevisi e-Google Play"</string> + <string name="common_google_play_services_enable_text" msgid="7627896071867667758">"Lolu hlelo lokusebenza ngeke lusebenze ngaphandle nje kokuthi unike amandla amasevisi e-Google Play."</string> + <string name="common_google_play_services_enable_button" msgid="4181637455539816337">"Nika amandla amasevisi e-Google Play"</string> + <string name="common_google_play_services_update_title" msgid="6006316683626838685">"Buyekeza amasevisi e-Google Play"</string> + <string name="common_google_play_services_update_text" msgid="448354684997260580">"Lolu hlelo lokusebenza ngeke lusebenze ngaphandle nje kokuthi ubuyekeze amasevisi e-Google Play."</string> + <string name="common_google_play_services_network_error_title" msgid="3827284619958211114">"Iphutha lenethiwekhi"</string> + <string name="common_google_play_services_network_error_text" msgid="9038847255613537209">"Kudingeka ukuxhumeka kwedatha ukuze kuxhunyekwe kumasevisi we-Google Play."</string> + <string name="common_google_play_services_invalid_account_title" msgid="1066672360770936753">"I-Akhawunti engavumelekile"</string> + <string name="common_google_play_services_invalid_account_text" msgid="4983316348021735578">"I-Akhawunti ecacisiwe ayikho kule divayisi. Sicela ukhethe i-akhawunti ehlukile."</string> + <string name="common_google_play_services_unknown_issue" msgid="4762332809710093730">"Indaba engaziwa yamasevisi we-Google Play"</string> + <string name="common_google_play_services_unsupported_title" msgid="6334768798839376943">"Amasevisi we-Google Play"</string> + <string name="common_google_play_services_unsupported_text" msgid="3542578567569488671">"Amasevisi we-Google Play, okungukuthi ezinye izinhlelo zakho zithembele kuwo, awasekelwe yidivayisi yakho. Sicela uxhumane nomkhiqizi ukuze uthole usizo."</string> + <string name="common_google_play_services_unsupported_date_text" msgid="4725396522367789365">"Idethi kudivayisi ibonakala ingalungile. Sicela uhlole idethi kudivayisi."</string> + <string name="common_google_play_services_update_button" msgid="8932944190611227642">"Isibuyekezo"</string> + <string name="common_signin_button_text" msgid="9071884888741449141">"Ngena ngemvume"</string> + <string name="common_signin_button_text_long" msgid="2429381841831957106">"Ngena ngemvume nge-Google"</string> +</resources> diff --git a/google-play-services_lib/res/values/admob_ads_attrs.xml b/google-play-services_lib/res/values/admob_ads_attrs.xml new file mode 100644 index 0000000..4e97a73 --- /dev/null +++ b/google-play-services_lib/res/values/admob_ads_attrs.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright 2013 Google Inc. All Rights Reserved. --> +<resources> + <declare-styleable name="AdsAttrs"> + <!-- + The size of the ad. It must be one of BANNER, FULL_BANNER, LEADERBOARD, + MEDIUM_RECTANGLE, SMART_BANNER, WIDE_SKYSCRAPER, or + <width>x<height>. + --> + <attr name="adSize" format="string"/> + + <!-- + A comma-separated list of the supported ad sizes. The sizes must be one of + BANNER, FULL_BANNER, LEADERBOARD, MEDIUM_RECTANGLE, SMART_BANNER, + WIDE_SKYSCRAPER, or <width>x<height>. + --> + <attr name="adSizes" format="string"/> + + <!-- The ad unit ID. --> + <attr name="adUnitId" format="string"/> + </declare-styleable> +</resources> diff --git a/google-play-services_lib/res/values/admob_iap_style.xml b/google-play-services_lib/res/values/admob_iap_style.xml new file mode 100644 index 0000000..35b09a9 --- /dev/null +++ b/google-play-services_lib/res/values/admob_iap_style.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <style name="Theme.IAPTheme" parent="android:Theme"> + <item name="android:windowIsTranslucent">true</item> + <item name="android:windowBackground">@android:color/transparent</item> + <item name="android:windowContentOverlay">@null</item> + <item name="android:windowNoTitle">true</item> + <item name="android:windowIsFloating">true</item> + <item name="android:backgroundDimEnabled">false</item> + </style> +</resources> diff --git a/google-play-services_lib/res/values/common_colors.xml b/google-play-services_lib/res/values/common_colors.xml new file mode 100644 index 0000000..6b2740a --- /dev/null +++ b/google-play-services_lib/res/values/common_colors.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources> + <!-- Sign-in Button Colors --> + <color name="common_signin_btn_dark_text_default">@android:color/white</color> + <color name="common_signin_btn_dark_text_pressed">@android:color/white</color> + <color name="common_signin_btn_dark_text_disabled">#FFAAAAAA</color> + <color name="common_signin_btn_dark_text_focused">@android:color/white</color> + <color name="common_signin_btn_light_text_default">#FF737373</color> + <color name="common_signin_btn_light_text_pressed">@android:color/white</color> + <color name="common_signin_btn_light_text_disabled">#FFAAAAAA</color> + <color name="common_signin_btn_light_text_focused">#FF737373</color> + <color name="common_signin_btn_default_background">#FFDD4B39</color> + <color name="common_action_bar_splitter">#d2d2d2</color> +</resources>
\ No newline at end of file diff --git a/google-play-services_lib/res/values/common_strings.xml b/google-play-services_lib/res/values/common_strings.xml new file mode 100644 index 0000000..5d50483 --- /dev/null +++ b/google-play-services_lib/res/values/common_strings.xml @@ -0,0 +1,90 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + + <!-- Title for notification shown when GooglePlayServices is unavailable [CHAR LIMIT=42] --> + <string name="common_google_play_services_notification_ticker">Google Play services error</string> + <!-- Title for notification shown when GooglePlayServices needs to be installed + for an application to work. [CHAR LIMIT=70] --> + <string name="common_google_play_services_notification_needs_installation_title">An application requires installation of Google Play services.</string> + <!-- Title for notification shown when GooglePlayServices needs to be updated for an + application to work. [CHAR LIMIT=70] --> + <string name="common_google_play_services_notification_needs_update_title">An application requires an update for Google Play services.</string> + <!-- Title for notification shown when GooglePlayServices needs to be enabled for an + application to work. [CHAR LIMIT=70] --> + <string name="common_google_play_services_needs_enabling_title">An application requires Google Play services to be enabled.</string> + + <!-- Requested by string saying which app requested the notification. [CHAR LIMIT=42] --> + <string name="common_google_play_services_error_notification_requested_by_msg">Requested by <xliff:g id="app_name">%1$s</xliff:g></string> + + <!-- Title of confirmation dialog informing user that they need to install + Google Play services (from Play Store) [CHAR LIMIT=40] --> + <string name="common_google_play_services_install_title" msgid="7215213145546190223">Get Google Play services</string> + + <!-- (For phones) Message in confirmation dialog informing user that + they need to install Google Play services (from Play Store) [CHAR LIMIT=NONE] --> + <string name="common_google_play_services_install_text_phone" msgid="2122112764540849864">This app won\'t run without Google Play services, which are missing from your phone.</string> + + <!-- (For tablets) Message in confirmation dialog informing user that + they need to install Google Play services (from Play Store) [CHAR LIMIT=NONE] --> + <string name="common_google_play_services_install_text_tablet" msgid="7351599665250191022">This app won\'t run without Google Play services, which are missing from your tablet.</string> + + <!-- Button in confirmation dialog for installing Google Play services [CHAR LIMIT=40] --> + <string name="common_google_play_services_install_button" msgid="7153882981874058840">Get Google Play services</string> + + <!-- Title of confirmation dialog informing user they need to enable + Google Play services in application settings [CHAR LIMIT=40] --> + <string name="common_google_play_services_enable_title" msgid="5122002158466380389">Enable Google Play services</string> + + <!-- Message in confirmation dialog informing user they need to enable + Google Play services in application settings [CHAR LIMIT=NONE] --> + <string name="common_google_play_services_enable_text" msgid="227660514972886228">This app won\'t work unless you enable Google Play services.</string> + + <!-- Button in confirmation dialog to enable Google Play services. Clicking it + will direct user to application settings of Google Play services where they + can enable it [CHAR LIMIT=40] --> + <string name="common_google_play_services_enable_button" msgid="2523291102206661146">Enable Google Play services</string> + + <!-- Title of confirmation dialog informing user that they need to update + Google Play services (from Play Store) [CHAR LIMIT=40] --> + <string name="common_google_play_services_update_title" msgid="1788179980625863495">Update Google Play services</string> + + <!-- Message in confirmation dialog informing user that they need to update + Google Play services (from Play Store) [CHAR LIMIT=NONE] --> + <string name="common_google_play_services_update_text" msgid="9053896323427875356">This app won\'t run unless you update Google Play services.</string> + + <!-- Title of confirmation dialog informing the user that a network error occurred. [CHAR LIMIT=40] --> + <string name="common_google_play_services_network_error_title">Network Error</string> + + <!-- Message in confirmation dialog informing the user that a network error occurred. [CHAR LIMIT=NONE] --> + <string name="common_google_play_services_network_error_text">A data connection is required to connect to Google Play services.</string> + + <!-- Title of confirmation dialog informing the user that they provided an invalid account. [CHAR LIMIT=40] --> + <string name="common_google_play_services_invalid_account_title">Invalid Account</string> + + <!-- Message in confirmation dialog informing the user that they provided an invalid account. [CHAR LIMIT=NONE] --> + <string name="common_google_play_services_invalid_account_text">The specified account does not exist on this device. Please choose a different account.</string> + + <!-- Message in confirmation dialog informing user there is an unknown issue in Google Play + services [CHAR LIMIT=NONE] --> + <string name="common_google_play_services_unknown_issue">Unknown issue with Google Play services.</string> + + <!-- Title of confirmation dialog informing user that Google Play services is not supported on their device [CHAR LIMIT=40] --> + <string name="common_google_play_services_unsupported_title">Google Play services</string> + + <!-- Message in confirmation dialog informing user that Google Play services is not supported on their device [CHAR LIMIT=NONE] --> + <string name="common_google_play_services_unsupported_text">Google Play services, which some of your applications rely on, is not supported by your device. Please contact the manufacturer for assistance.</string> + + <!-- Message in confirmation dialog informing user that date on the device is not correct, + causing certificate checks to fail. [CHAR LIMIT=NONE] --> + <string name="common_google_play_services_unsupported_date_text">The date on the device appears to be incorrect. Please check the date on the device.</string> + + <!-- Button in confirmation dialog for updating Google Play services [CHAR LIMIT=40] --> + <string name="common_google_play_services_update_button" msgid="6556509956452265614">Update</string> + + <!-- Sign-in button text [CHAR LIMIT=15] --> + <string name="common_signin_button_text">Sign in</string> + + <!-- Long form sign-in button text [CHAR LIMIT=30] --> + <string name="common_signin_button_text_long">Sign in with Google</string> + +</resources> diff --git a/google-play-services_lib/res/values/maps_attrs.xml b/google-play-services_lib/res/values/maps_attrs.xml new file mode 100644 index 0000000..aaf65c5 --- /dev/null +++ b/google-play-services_lib/res/values/maps_attrs.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright 2012 Google Inc. All Rights Reserved. --> +<resources> + <declare-styleable name="MapAttrs"> + <attr name="mapType" format="enum"> + <enum name="none" value="0"/> + <enum name="normal" value="1"/> + <enum name="satellite" value="2"/> + <enum name="terrain" value="3"/> + <enum name="hybrid" value="4"/> + </attr> + <attr name="cameraBearing" format="float"/> + <attr name="cameraTargetLat" format="float"/> + <attr name="cameraTargetLng" format="float"/> + <attr name="cameraTilt" format="float"/> + <attr name="cameraZoom" format="float"/> + <attr name="uiCompass" format="boolean"/> + <attr name="uiRotateGestures" format="boolean"/> + <attr name="uiScrollGestures" format="boolean"/> + <attr name="uiTiltGestures" format="boolean"/> + <attr name="uiZoomControls" format="boolean"/> + <attr name="uiZoomGestures" format="boolean"/> + <attr name="useViewLifecycle" format="boolean"/> + <attr name="zOrderOnTop" format="boolean"/> + </declare-styleable> +</resources> diff --git a/google-play-services_lib/res/values/version.xml b/google-play-services_lib/res/values/version.xml new file mode 100644 index 0000000..0b7a4ed --- /dev/null +++ b/google-play-services_lib/res/values/version.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <integer name="google_play_services_version">5089000</integer> +</resources>
\ No newline at end of file diff --git a/google-play-services_lib/res/values/wallet_attrs.xml b/google-play-services_lib/res/values/wallet_attrs.xml new file mode 100644 index 0000000..6a40575 --- /dev/null +++ b/google-play-services_lib/res/values/wallet_attrs.xml @@ -0,0 +1,73 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright 2014 Google Inc. All Rights Reserved. --> +<resources> + <!-- Attributes for the WalletFragment <fragment> tag --> + <declare-styleable name="WalletFragmentOptions"> + <!-- Theme to be used for the Wallet selector --> + <attr name="theme" format="enum"> + <enum name="holo_dark" value="0"/> + <enum name="holo_light" value="1"/> + </attr> + <!-- Google Wallet environment to use --> + <attr name="environment" format="enum"> + <enum name="production" value="1"/> + <enum name="sandbox" value="0"/> + <enum name="strict_sandbox" value="2"/> + </attr> + <!-- A style resource specifing attributes to customize the look and feel of WalletFragment --> + <attr name="fragmentStyle" format="reference"/> + <!-- Fragment mode --> + <attr name="fragmentMode" format="enum"> + <enum name="buyButton" value="1"/> + <enum name="selectionDetails" value="2"/> + </attr> + </declare-styleable> + + <!-- Attributes that may be specified in a style resource to customize the look and feel of + WalletFragment --> + <declare-styleable name="WalletFragmentStyle"> + <!-- Height of the buy button. This includes an 8dp padding (4dp on each side) used for + pressed and focused states of the button. The value can be a specific height, e.g. + "48dp", or special values "match_parent" and "wrap_content". --> + <attr name="buyButtonHeight" format="dimension"> + <enum name="match_parent" value="-1" /> + <enum name="wrap_content" value="-2" /> + </attr> + <!-- Width of the buy button. This includes an 8dp padding (4dp on each side) used for + pressed and focused states of the button. The value can be a specific width, e.g. + "300dp", or special values "match_parent" and "wrap_content". --> + <attr name="buyButtonWidth" format="dimension"> + <enum name="match_parent" value="-1" /> + <enum name="wrap_content" value="-2" /> + </attr> + <!-- Text on the buy button. Must be one of "buy_with_google", "buy_now" and "book_now" --> + <attr name="buyButtonText" format="enum"> + <enum name="buy_with_google" value="1"/> + <enum name="buy_now" value="2"/> + <enum name="book_now" value="3"/> + </attr> + <!-- Appearance of the buy button. Must be one of "classic", "grayscale" and "monochrome" --> + <attr name="buyButtonAppearance" format="enum"> + <enum name="classic" value="1"/> + <enum name="grayscale" value="2"/> + <enum name="monochrome" value="3"/> + </attr> + <!-- TextAppearance for masked wallet details --> + <attr name="maskedWalletDetailsTextAppearance" format="reference"/> + <!-- TextAppearance for headers describing masked wallet details --> + <attr name="maskedWalletDetailsHeaderTextAppearance" format="reference"/> + <!-- Masked wallet details background --> + <attr name="maskedWalletDetailsBackground" format="reference|color"/> + <!-- TextAppearance for the "Change" button in masked wallet details view --> + <attr name="maskedWalletDetailsButtonTextAppearance" format="reference"/> + <!-- "Change" button background in masked wallet details view --> + <attr name="maskedWalletDetailsButtonBackground" format="reference|color"/> + <!-- Color of the Google Wallet logo text in masked wallet details view --> + <attr name="maskedWalletDetailsLogoTextColor" format="color"/> + <!-- Type of the wallet logo image in masked wallet details view --> + <attr name="maskedWalletDetailsLogoImageType" format="enum"> + <enum name="classic" value="1"/> + <enum name="monochrome" value="2"/> + </attr> + </declare-styleable> +</resources> diff --git a/google-play-services_lib/res/values/wallet_colors.xml b/google-play-services_lib/res/values/wallet_colors.xml new file mode 100644 index 0000000..7432875 --- /dev/null +++ b/google-play-services_lib/res/values/wallet_colors.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright 2014 Google Inc. All Rights Reserved. --> +<resources> + <!-- + Wallet colors to support consistent Wallet fragment holo dark UI in client application + regardless of the theme and device type + --> + <color name="wallet_bright_foreground_holo_dark">#fff3f3f3</color> + <color name="wallet_dim_foreground_holo_dark">#bebebe</color> + <color name="wallet_dim_foreground_disabled_holo_dark">#80bebebe</color> + <color name="wallet_dim_foreground_inverse_holo_dark">#323232</color> + <color name="wallet_dim_foreground_inverse_disabled_holo_dark">#80323232</color> + <color name="wallet_bright_foreground_disabled_holo_light">#ffb2b2b2</color> + <color name="wallet_bright_foreground_holo_light">#ff000000</color> + <color name="wallet_hint_foreground_holo_light">#808080</color> + <color name="wallet_hint_foreground_holo_dark">#808080</color> + <color name="wallet_highlighted_text_holo_light">#6633b5e5</color> + <color name="wallet_highlighted_text_holo_dark">#6633b5e5</color> + <color name="wallet_holo_blue_light">#ff33b5e5</color> + <color name="wallet_link_text_light">#0000ee</color> +</resources> diff --git a/google-play-services_lib/res/values/wallet_strings.xml b/google-play-services_lib/res/values/wallet_strings.xml new file mode 100644 index 0000000..8dc227b --- /dev/null +++ b/google-play-services_lib/res/values/wallet_strings.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright 2014 Google Inc. All Rights Reserved. --> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + + <!-- Text on a placeholder buy button when Google Play services is not + available or up-to-date --> + <string + translation_description="Text on a button that allows a user to make a payment with Google Wallet [CHAR LIMIT=30]" + name="wallet_buy_button_place_holder">Buy with Google</string> + +</resources> diff --git a/google-play-services_lib/res/values/wallet_styles.xml b/google-play-services_lib/res/values/wallet_styles.xml new file mode 100644 index 0000000..129e26d --- /dev/null +++ b/google-play-services_lib/res/values/wallet_styles.xml @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright 2014 Google Inc. All Rights Reserved. --> +<resources> + + <style name="WalletFragmentDefaultDetailsTextAppearance"> + <item name="android:textColor">@color/wallet_secondary_text_holo_dark</item> + <item name="android:textColorHighlight">@color/wallet_highlighted_text_holo_dark</item> + <item name="android:textColorHint">@color/wallet_hint_foreground_holo_dark</item> + <item name="android:textColorLink">@color/wallet_holo_blue_light</item> + <item name="android:textSize">14sp</item> + <item name="android:textStyle">normal</item> + </style> + + <style name="WalletFragmentDefaultDetailsHeaderTextAppearance" parent="WalletFragmentDefaultDetailsTextAppearance"> + <item name="android:textStyle">bold</item> + </style> + + <style name="WalletFragmentDefaultButtonTextAppearance"> + <item name="android:textColor">@color/wallet_primary_text_holo_light</item> + <item name="android:textColorHighlight">@color/wallet_highlighted_text_holo_light</item> + <item name="android:textColorHint">@color/wallet_hint_foreground_holo_light</item> + <item name="android:textColorLink">@color/wallet_link_text_light</item> + <item name="android:textSize">18sp</item> + <item name="android:textStyle">normal</item> + </style> + + <!-- + Default style of the wallet fragment that will be used if not set explicitly + when fragment is created + --> + <style name="WalletFragmentDefaultStyle"> + <item name="buyButtonHeight">48dp</item> + <item name="buyButtonWidth">match_parent</item> + <item name="buyButtonText">buy_with_google</item> + <item name="buyButtonAppearance">classic</item> + <item name="maskedWalletDetailsTextAppearance">@style/WalletFragmentDefaultDetailsTextAppearance</item> + <item name="maskedWalletDetailsHeaderTextAppearance">@style/WalletFragmentDefaultDetailsHeaderTextAppearance</item> + <item name="maskedWalletDetailsBackground">@color/wallet_bright_foreground_holo_light</item> + <item name="maskedWalletDetailsButtonBackground">@android:drawable/btn_default</item> + <item name="maskedWalletDetailsButtonTextAppearance">@style/WalletFragmentDefaultButtonTextAppearance</item> + <item name="maskedWalletDetailsLogoTextColor">@color/wallet_bright_foreground_holo_dark</item> + <item name="maskedWalletDetailsLogoImageType">classic</item> + </style> + +</resources> diff --git a/google-play-services_lib/src/android/UnusedStub.java b/google-play-services_lib/src/android/UnusedStub.java new file mode 100644 index 0000000..d546b0b --- /dev/null +++ b/google-play-services_lib/src/android/UnusedStub.java @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * 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 android; + +// Stub java file to make inclusion into some IDE's work. +public final class UnusedStub { + private UnusedStub() { } +} diff --git a/main/AndroidManifest.xml b/main/AndroidManifest.xml index de91a06..1f06bc9 100644 --- a/main/AndroidManifest.xml +++ b/main/AndroidManifest.xml @@ -50,6 +50,9 @@ <meta-data android:name="com.google.android.backup.api_key" android:value="AEdPqrEAAAAIsvD_aUSDMwWOf9NkwwxZ4kJJI_AG2EaxjSu2jw" /> + <meta-data + android:name="com.google.android.gms.version" + android:value="@integer/google_play_services_version" /> <activity android:name=".MainActivity" @@ -511,4 +514,4 @@ android:authorities="cgeo.geocaching.search.SuggestionProvider" /> </application> -</manifest>
\ No newline at end of file +</manifest> diff --git a/main/build.gradle b/main/build.gradle index e4f60fe..f2e4ae6 100644 --- a/main/build.gradle +++ b/main/build.gradle @@ -28,13 +28,16 @@ gradle connectedCheck def AAVersion = '3.0.1' def RXVersion = '0.19.6' +def JacksonCoreVersion = '2.4.1.1' +def JacksonDatabindVersion = '2.4.1.3' +def JacksonAnnotationsVersion = '2.4.1' group = 'cgeo.geocaching' version = '0.0.1' android { compileSdkVersion "Google Inc.:Google APIs:19" //compileSdkVersion 19 - buildToolsVersion "19.1.0" + buildToolsVersion "20" compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 @@ -81,8 +84,8 @@ android { //packageNameSuffix ".debug" //zipAlign = true debuggable true - runProguard false - proguardFiles getDefaultProguardFile('proguard-android.txt'), '../tests/proguard.cfg' + runProguard true + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt', '../tests/proguard.cfg' versionNameSuffix " Debug " + versionProps['betaNumber'] } release { @@ -151,6 +154,7 @@ dependencies { compile files('libs/mapsforge-map-0.3.0-jar-with-dependencies.jar') compile 'com.android.support:appcompat-v7:19.1.0' + compile 'com.google.android.gms:play-services:5.0.89' compile 'com.jakewharton:butterknife:5.1.1' compile 'org.apache.commons:commons-collections4:4.0' @@ -162,6 +166,10 @@ dependencies { compile "com.netflix.rxjava:rxjava-android:$RXVersion" compile "com.netflix.rxjava:rxjava-async-util:$RXVersion" + compile "com.fasterxml.jackson.core:jackson-core:$JacksonCoreVersion" + compile "com.fasterxml.jackson.core:jackson-databind:$JacksonDatabindVersion" + compile "com.fasterxml.jackson.core:jackson-annotations:$JacksonAnnotationsVersion" + //TEST //compile files('compile-libs/androidannotations-3.0.1.jar') //compile files('compile-libs/findbugs-ant.jar') @@ -357,4 +365,4 @@ task addTest { // always do the addtest on prebuild gradle.projectsEvaluated { preBuild.dependsOn(addTest) -}*/
\ No newline at end of file +}*/ diff --git a/main/build.xml b/main/build.xml index 43c37b2..2b2467f 100644 --- a/main/build.xml +++ b/main/build.xml @@ -1,12 +1,12 @@ <?xml version="1.0" encoding="UTF-8"?> <project name="cgeo"> - <!-- The local.properties file is created and updated by the 'android' tool. + <!-- The local.properties file is created and updated by the 'android' tool. It contains the path to the SDK. It should *NOT* be checked into Version Control Systems. --> - <loadproperties srcFile="local.properties" /> + <loadproperties srcFile="local.properties" /> - <!-- The ant.properties file can be created by you. It is only edited by the + <!-- The ant.properties file can be created by you. It is only edited by the 'android' tool to add properties to it. This is the place to change some Ant specific build properties. Here are some properties you may want to change/update: @@ -26,9 +26,9 @@ application and should be checked into Version Control Systems. --> - <property file="ant.properties" /> + <property file="ant.properties" /> - <!-- The project.properties file is created and updated by the 'android' + <!-- The project.properties file is created and updated by the 'android' tool, as well as ADT. This contains project specific properties such as project target, and library @@ -37,36 +37,42 @@ This file is an integral part of the build system for your application and should be checked into Version Control Systems. --> - <loadproperties srcFile="project.properties" /> - - <!-- The private.properties file sets api-keys as well as keystore, + <loadproperties srcFile="project.properties" /> + + <!-- The private.properties file sets api-keys as well as keystore, certificate and passwords (if you want). See /templates/private.properties for more information. --> - <property file="private.properties" /> + <property file="private.properties" /> - <!-- quick check on sdk.dir --> - <fail + <!-- quick check on sdk.dir --> + <fail message="sdk.dir is missing. Make sure to generate local.properties using 'android update project'" unless="sdk.dir" /> - - <!-- Custom targets --> - <target name="install_release" description="Install signed release application" depends="release"> - <exec executable="${sdk.dir}/platform-tools/adb"> - <arg line="-d install -r ./bin/${ant.project.name}-release.apk" /> - </exec> - </target> - - <target name="debugAPI" depends="-pre-build" + + <!-- Custom targets --> + <target name="install_release" description="Install signed release application" depends="release"> + <exec executable="${sdk.dir}/platform-tools/adb"> + <arg line="-d install -r ./bin/${ant.project.name}-release.apk" /> + </exec> + </target> + + <target name="debugAPI" depends="-pre-build" description="Changes API key to debug"> - </target> - + </target> + <taskdef name="findbugs" classname="edu.umd.cs.findbugs.anttask.FindBugsTask"> <classpath> - <pathelement location="./compile-libs/findbugs-ant.jar"/> + <pathelement location="./compile-libs/findbugs-ant.jar"/> </classpath> </taskdef> + <!-- We need to enable ProGuard in debug mode as we otherwise run into the 64 K methods dex limit. + As long as we don't obfuscate, we can even use the same ProGuard config in both builds. --> + <target name="-debug-obfuscation-check"> + <property name="proguard.enabled" value="true"/> + </target> + <target name="findbugs"> <mkdir dir="reports" /> <gettarget @@ -86,62 +92,77 @@ <class location="${out.dir}" /> </findbugs> </target> - + <!-- extension targets. Uncomment the ones where you want to do custom work in between standard targets --> - <target name="-pre-build"> - <condition property="build.mode.release" else="false"> - <equals arg1="${build.target}" arg2="release" /> - </condition> - - <if condition="${build.mode.release}"> - <then> - <filterset id="maps-key"> - <filter token="maps.api.key" value="${maps.api.key.market}"/> - </filterset> - </then> - <else> - <filterset id="maps-key"> - <filter token="maps.api.key" value="${maps.api.key}"/> - </filterset> - </else> - </if> - <copy file="./templates/keys.xml" todir="./res/values/" overwrite="true"> - <filterset refid="maps-key" /> - <filterset> - <filter token="ocde.okapi.consumer.key" value="${ocde.okapi.consumer.key}"/> - <filter token="ocde.okapi.consumer.secret" value="${ocde.okapi.consumer.secret}"/> - <filter token="ocpl.okapi.consumer.key" value="${ocpl.okapi.consumer.key}"/> - <filter token="ocpl.okapi.consumer.secret" value="${ocpl.okapi.consumer.secret}"/> - <filter token="ocus.okapi.consumer.key" value="${ocus.okapi.consumer.key}"/> - <filter token="ocus.okapi.consumer.secret" value="${ocus.okapi.consumer.secret}"/> - <filter token="ocnl.okapi.consumer.key" value="${ocnl.okapi.consumer.key}"/> - <filter token="ocnl.okapi.consumer.secret" value="${ocnl.okapi.consumer.secret}"/> - <filter token="ocro.okapi.consumer.key" value="${ocro.okapi.consumer.key}"/> - <filter token="ocro.okapi.consumer.secret" value="${ocro.okapi.consumer.secret}"/> - <filter token="ocuk.okapi.consumer.key" value="${ocuk.okapi.consumer.key}"/> - <filter token="ocuk.okapi.consumer.secret" value="${ocuk.okapi.consumer.secret}"/> - </filterset> - </copy> - </target> + <target name="-pre-build"> + <!-- Enable ProGuard in debug builds --> + <condition property="proguard.enabled" value="true" else="false"> + <isset property="proguard.config" /> + </condition> + <if condition="${proguard.enabled}"> + <then> + <echo level="info">Proguard.config is enabled</echo> + <!-- Secondary dx input (jar files) is empty since all the jar files will be in the obfuscated jar --> + <path id="out.dex.jar.input.ref" /> + </then> + <else> + <echo level="info">Proguard.config is disabled</echo> + </else> + </if> + + <!-- Add all the keys for Google Maps, Twitter and OKAPI in the build --> + <condition property="build.mode.release" else="false"> + <equals arg1="${build.target}" arg2="release" /> + </condition> + <if condition="${build.mode.release}"> + <then> + <filterset id="maps-key"> + <filter token="maps.api.key" value="${maps.api.key.market}" /> + </filterset> + </then> + <else> + <filterset id="maps-key"> + <filter token="maps.api.key" value="${maps.api.key}"/> + </filterset> + </else> + </if> + <copy file="./templates/keys.xml" todir="./res/values/" overwrite="true"> + <filterset refid="maps-key" /> + <filterset> + <filter token="ocde.okapi.consumer.key" value="${ocde.okapi.consumer.key}"/> + <filter token="ocde.okapi.consumer.secret" value="${ocde.okapi.consumer.secret}"/> + <filter token="ocpl.okapi.consumer.key" value="${ocpl.okapi.consumer.key}"/> + <filter token="ocpl.okapi.consumer.secret" value="${ocpl.okapi.consumer.secret}"/> + <filter token="ocus.okapi.consumer.key" value="${ocus.okapi.consumer.key}"/> + <filter token="ocus.okapi.consumer.secret" value="${ocus.okapi.consumer.secret}"/> + <filter token="ocnl.okapi.consumer.key" value="${ocnl.okapi.consumer.key}"/> + <filter token="ocnl.okapi.consumer.secret" value="${ocnl.okapi.consumer.secret}"/> + <filter token="ocro.okapi.consumer.key" value="${ocro.okapi.consumer.key}"/> + <filter token="ocro.okapi.consumer.secret" value="${ocro.okapi.consumer.secret}"/> + <filter token="ocuk.okapi.consumer.key" value="${ocuk.okapi.consumer.key}"/> + <filter token="ocuk.okapi.consumer.secret" value="${ocuk.okapi.consumer.secret}"/> + </filterset> + </copy> + </target> -<!-- start of modifications for android annotations, see https://github.com/excilys/androidannotations/wiki/Building-Project-Ant --> + <!-- start of modifications for android annotations, see https://github.com/excilys/androidannotations/wiki/Building-Project-Ant --> <property name="generated.dir" value="annotation_gen" /> <property name="generated.absolute.dir" location="${generated.dir}" /> - <property name="java.compilerargs" value="-s '${generated.absolute.dir}'" /> + <property name="java.compilerargs" value="-s '${generated.absolute.dir}'" /> <target name="-pre-compile"> <mkdir dir="${generated.absolute.dir}" /> </target> - <target name="-compile" depends="-pre-build, -build-setup, -code-gen, -pre-compile"> - <do-only-if-manifest-hasCode elseText="hasCode = false. Skipping..."> - <!-- merge the project's own classpath and the tested project's classpath --> - <path id="project.javac.classpath"> - <path refid="project.all.jars.path" /> - <path refid="tested.project.classpath" /> - <path path="${java.compiler.classpath}" /> - <fileset dir="compile-libs" includes="*.jar"/> - </path> - <javac encoding="${java.encoding}" + <target name="-compile" depends="-pre-build, -build-setup, -code-gen, -pre-compile"> + <do-only-if-manifest-hasCode elseText="hasCode = false. Skipping..."> + <!-- merge the project's own classpath and the tested project's classpath --> + <path id="project.javac.classpath"> + <path refid="project.all.jars.path" /> + <path refid="tested.project.classpath" /> + <path path="${java.compiler.classpath}" /> + <fileset dir="compile-libs" includes="*.jar"/> + </path> + <javac encoding="${java.encoding}" source="${java.source}" target="${java.target}" debug="true" extdirs="" includeantruntime="false" destdir="${out.classes.absolute.dir}" @@ -149,77 +170,77 @@ verbose="${verbose}" classpathref="project.javac.classpath" fork="${need.javac.fork}"> - <src path="${source.absolute.dir}" /> - <src path="${gen.absolute.dir}" /> - <compilerarg line="${java.compilerargs}" /> - </javac> - - <!-- if the project is instrumented, intrument the classes --> - <if condition="${build.is.instrumented}"> - <then> - <echo level="info">Instrumenting classes from ${out.absolute.dir}/classes...</echo> - - <!-- build the filter to remove R, Manifest, BuildConfig --> - <getemmafilter + <src path="${source.absolute.dir}" /> + <src path="${gen.absolute.dir}" /> + <compilerarg line="${java.compilerargs}" /> + </javac> + + <!-- if the project is instrumented, intrument the classes --> + <if condition="${build.is.instrumented}"> + <then> + <echo level="info">Instrumenting classes from ${out.absolute.dir}/classes...</echo> + + <!-- build the filter to remove R, Manifest, BuildConfig --> + <getemmafilter appPackage="${project.app.package}" libraryPackagesRefId="project.library.packages" filterOut="emma.default.filter"/> - <!-- define where the .em file is going. This may have been + <!-- define where the .em file is going. This may have been setup already if this is a library --> - <property name="emma.coverage.absolute.file" location="${out.absolute.dir}/coverage.em" /> + <property name="emma.coverage.absolute.file" location="${out.absolute.dir}/coverage.em" /> - <!-- It only instruments class files, not any external libs --> - <emma enabled="true"> - <instr verbosity="${verbosity}" + <!-- It only instruments class files, not any external libs --> + <emma enabled="true"> + <instr verbosity="${verbosity}" mode="overwrite" instrpath="${out.absolute.dir}/classes" outdir="${out.absolute.dir}/classes" metadatafile="${emma.coverage.absolute.file}"> - <filter excludes="${emma.default.filter}" /> - <filter excludes="android.*, com.*, org.*" /> - <filter value="${emma.filter}" /> - </instr> - </emma> - </then> - </if> - - <!-- if the project is a library then we generate a jar file --> - <if condition="${project.is.library}"> - <then> - <echo level="info">Creating library output jar file...</echo> - <property name="out.library.jar.file" location="${out.absolute.dir}/classes.jar" /> - <if> - <condition> - <length string="${android.package.excludes}" trim="true" when="greater" length="0" /> - </condition> - <then> - <echo level="info">Custom jar packaging exclusion: ${android.package.excludes}</echo> - </then> - </if> - - <propertybyreplace name="project.app.package.path" input="${project.app.package}" replace="." with="/" /> - - <jar destfile="${out.library.jar.file}"> - <fileset dir="${out.classes.absolute.dir}" + <filter excludes="${emma.default.filter}" /> + <filter excludes="android.*, com.*, org.*" /> + <filter value="${emma.filter}" /> + </instr> + </emma> + </then> + </if> + + <!-- if the project is a library then we generate a jar file --> + <if condition="${project.is.library}"> + <then> + <echo level="info">Creating library output jar file...</echo> + <property name="out.library.jar.file" location="${out.absolute.dir}/classes.jar" /> + <if> + <condition> + <length string="${android.package.excludes}" trim="true" when="greater" length="0" /> + </condition> + <then> + <echo level="info">Custom jar packaging exclusion: ${android.package.excludes}</echo> + </then> + </if> + + <propertybyreplace name="project.app.package.path" input="${project.app.package}" replace="." with="/" /> + + <jar destfile="${out.library.jar.file}"> + <fileset dir="${out.classes.absolute.dir}" includes="**/*.class" excludes="${project.app.package.path}/R.class ${project.app.package.path}/R$*.class ${project.app.package.path}/BuildConfig.class"/> - <fileset dir="${source.absolute.dir}" excludes="**/*.java ${android.package.excludes}" /> - </jar> - </then> - </if> + <fileset dir="${source.absolute.dir}" excludes="**/*.java ${android.package.excludes}" /> + </jar> + </then> + </if> - </do-only-if-manifest-hasCode> - </target> -<!-- end of modifications for android-annotations --> - - -<!-- + </do-only-if-manifest-hasCode> + </target> + <!-- end of modifications for android-annotations --> + + + <!-- <target name="-post-compile"> </target> --> - <!-- Import the actual build file. + <!-- Import the actual build file. To customize existing targets, there are two options: - Customize only one target: @@ -237,7 +258,7 @@ In all cases you must update the value of version-tag below to read 'custom' instead of an integer, in order to avoid having your file be overridden by tools such as "android update project" --> - <!-- version-tag: custom --> - <import file="${sdk.dir}/tools/ant/build.xml" /> + <!-- version-tag: custom --> + <import file="${sdk.dir}/tools/ant/build.xml" /> </project> diff --git a/main/cgeo.iml b/main/cgeo.iml index c662ceb..1b98d6a 100644 --- a/main/cgeo.iml +++ b/main/cgeo.iml @@ -44,7 +44,7 @@ <jarDirectory url="file://$MODULE_DIR$/compile-libs" recursive="false" type="SOURCES" /> </library> </orderEntry> - <orderEntry type="module-library" exported="" scope="PROVIDED"> + <orderEntry type="module-library" exported=""> <library> <CLASSES> <root url="file://$MODULE_DIR$/libs" /> @@ -56,6 +56,7 @@ </orderEntry> <orderEntry type="module" module-name="mapswithme-api" exported="" /> <orderEntry type="module" module-name="android-support-v7-appcompat" exported="" /> + <orderEntry type="module" module-name="google-play-services_lib" exported="" /> </component> </module> diff --git a/main/libs/jackson-annotations-2.4.1.jar b/main/libs/jackson-annotations-2.4.1.jar Binary files differnew file mode 100644 index 0000000..decd2d1 --- /dev/null +++ b/main/libs/jackson-annotations-2.4.1.jar diff --git a/main/libs/jackson-annotations-2.4.1.jar.properties b/main/libs/jackson-annotations-2.4.1.jar.properties new file mode 100644 index 0000000..710f903 --- /dev/null +++ b/main/libs/jackson-annotations-2.4.1.jar.properties @@ -0,0 +1,2 @@ +src=src/jackson-annotations-2.4.1-sources.jar +doc=src/jackson-annotations-2.4.1-javadoc.jar diff --git a/main/libs/jackson-core-2.4.1.1.jar b/main/libs/jackson-core-2.4.1.1.jar Binary files differnew file mode 100644 index 0000000..5fe10ae --- /dev/null +++ b/main/libs/jackson-core-2.4.1.1.jar diff --git a/main/libs/jackson-core-2.4.1.1.jar.properties b/main/libs/jackson-core-2.4.1.1.jar.properties new file mode 100644 index 0000000..0a3222e --- /dev/null +++ b/main/libs/jackson-core-2.4.1.1.jar.properties @@ -0,0 +1,2 @@ +src=src/jackson-core-2.4.1.1-sources.jar +doc=src/jackson-core-2.4.1.1-javadoc.jar diff --git a/main/libs/jackson-databind-2.4.1.3.jar b/main/libs/jackson-databind-2.4.1.3.jar Binary files differnew file mode 100644 index 0000000..231bd1f --- /dev/null +++ b/main/libs/jackson-databind-2.4.1.3.jar diff --git a/main/libs/jackson-databind-2.4.1.3.jar.properties b/main/libs/jackson-databind-2.4.1.3.jar.properties new file mode 100644 index 0000000..f4cc029 --- /dev/null +++ b/main/libs/jackson-databind-2.4.1.3.jar.properties @@ -0,0 +1,2 @@ +src=src/jackson-databind-2.4.1.3-sources.jar +doc=src/jackson-databind-2.4.1.3-javadoc.jar diff --git a/main/libs/src/jackson-annotations-2.4.1-javadoc.jar b/main/libs/src/jackson-annotations-2.4.1-javadoc.jar Binary files differnew file mode 100644 index 0000000..40bb9d2 --- /dev/null +++ b/main/libs/src/jackson-annotations-2.4.1-javadoc.jar diff --git a/main/libs/src/jackson-annotations-2.4.1-sources.jar b/main/libs/src/jackson-annotations-2.4.1-sources.jar Binary files differnew file mode 100644 index 0000000..f9e50a4 --- /dev/null +++ b/main/libs/src/jackson-annotations-2.4.1-sources.jar diff --git a/main/libs/src/jackson-core-2.4.1.1-javadoc.jar b/main/libs/src/jackson-core-2.4.1.1-javadoc.jar Binary files differnew file mode 100644 index 0000000..cfae85e --- /dev/null +++ b/main/libs/src/jackson-core-2.4.1.1-javadoc.jar diff --git a/main/libs/src/jackson-core-2.4.1.1-sources.jar b/main/libs/src/jackson-core-2.4.1.1-sources.jar Binary files differnew file mode 100644 index 0000000..0647e10 --- /dev/null +++ b/main/libs/src/jackson-core-2.4.1.1-sources.jar diff --git a/main/libs/src/jackson-databind-2.4.1.3-javadoc.jar b/main/libs/src/jackson-databind-2.4.1.3-javadoc.jar Binary files differnew file mode 100644 index 0000000..5bab5af --- /dev/null +++ b/main/libs/src/jackson-databind-2.4.1.3-javadoc.jar diff --git a/main/libs/src/jackson-databind-2.4.1.3-sources.jar b/main/libs/src/jackson-databind-2.4.1.3-sources.jar Binary files differnew file mode 100644 index 0000000..1bab3a5 --- /dev/null +++ b/main/libs/src/jackson-databind-2.4.1.3-sources.jar diff --git a/main/proguard-project.txt b/main/proguard-project.txt index 74b8aa2..bcdfa22 100644 --- a/main/proguard-project.txt +++ b/main/proguard-project.txt @@ -21,9 +21,12 @@ # rxjava internal references sun.misc.Unsafe -dontwarn sun.misc.Unsafe +# jackson internal references +-dontwarn org.w3c.dom.bootstrap.DOMImplementationRegistry + #-dontnote org.apache.commons.logging.** --keep public class cgeo.geocaching.* +-keep class cgeo.geocaching.** { *; } -keep class android.support.v4.os.** { *; } -keep class ch.boye.httpclientandroidlib.conn.scheme.Scheme { *; } @@ -61,3 +64,11 @@ # the sort action provider is only referenced from XML -keep public class cgeo.geocaching.sorting.SortActionProvider { *; } + +# keep Emma code coverage during debug builds +-keep class com.vladium.** { *; } + +# keep some test only utils classes +-keep class org.apache.commons.lang3.StringUtils { *; } +-keep class org.apache.commons.io.IOUtils { *; } +-keep class org.apache.commons.io.FileUtils { *; }
\ No newline at end of file diff --git a/main/project.properties b/main/project.properties index f0fa845..5530267 100644 --- a/main/project.properties +++ b/main/project.properties @@ -8,11 +8,12 @@ # project structure. # # To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): -proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt +proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt:../google-play-services_lib/proguard.txt # Project target. target=Google Inc.:Google APIs:19 android.library.reference.1=../mapswithme-api android.library.reference.2=../android-support-v7-appcompat +android.library.reference.3=../google-play-services_lib java.source=1.7 -java.target=1.7
\ No newline at end of file +java.target=1.7 diff --git a/main/project/libraries/update-libs.sh b/main/project/libraries/update-libs.sh index f2e9ced..bdf25c4 100755 --- a/main/project/libraries/update-libs.sh +++ b/main/project/libraries/update-libs.sh @@ -2,6 +2,9 @@ # RXJAVA=0.19.6 +JACKSONCORE=2.4.1.1 +JACKSONDATABIND=2.4.1.3 +JACKSONANNOTATIONS=2.4.1 cd $(git rev-parse --show-toplevel)/main/libs @@ -31,3 +34,10 @@ updatelib com/netflix/rxjava rxjava-core $RXJAVA updatelib com/netflix/rxjava rxjava-android $RXJAVA updatelib com/netflix/rxjava rxjava-async-util $RXJAVA fixgradle RXVersion $RXJAVA + +updatelib com/fasterxml/jackson/core jackson-core $JACKSONCORE +fixgradle JacksonCoreVersion $JACKSONCORE +updatelib com/fasterxml/jackson/core jackson-databind $JACKSONDATABIND +fixgradle JacksonDatabindVersion $JACKSONDATABIND +updatelib com/fasterxml/jackson/core jackson-annotations $JACKSONANNOTATIONS +fixgradle JacksonAnnotationsVersion $JACKSONANNOTATIONS diff --git a/main/res/values/changelog_master.xml b/main/res/values/changelog_master.xml index 1e3c3d4..9b35112 100644 --- a/main/res/values/changelog_master.xml +++ b/main/res/values/changelog_master.xml @@ -2,5 +2,8 @@ <resources> <!-- changelog for the master branch --> <string name="changelog_master" translatable="false"> + <b>Next feature release:</b>\n + \n + \n </string> </resources> diff --git a/main/res/values/preference_keys.xml b/main/res/values/preference_keys.xml index 72d7c61..5189cc5 100644 --- a/main/res/values/preference_keys.xml +++ b/main/res/values/preference_keys.xml @@ -108,7 +108,6 @@ <string name="pref_cookiestore">cookiestore</string> <string name="pref_lastdetailspage">lastdetailspage</string> <string name="pref_livemapstrategy">livemapstrategy</string> - <string name="pref_hidelivemaphint">hidelivemaphint</string> <string name="pref_livemaphintshowcount">livemaphintshowcount</string> <string name="pref_settingsversion">settingsversion</string> <string name="pref_trackableaction">trackableaction</string> diff --git a/main/res/values/strings.xml b/main/res/values/strings.xml index ade4bf6..a2d1b8f 100644 --- a/main/res/values/strings.xml +++ b/main/res/values/strings.xml @@ -228,6 +228,7 @@ <!-- location service --> <string name="loc_last">Last known</string> <string name="loc_net">Network</string> + <string name="loc_fused">Fused</string> <string name="loc_gps">GPS</string> <string name="loc_sat">Sat</string> <string name="loc_trying">Trying to Locate</string> diff --git a/main/src/cgeo/geocaching/AbstractDialogFragment.java b/main/src/cgeo/geocaching/AbstractDialogFragment.java index 4025347..6f64146 100644 --- a/main/src/cgeo/geocaching/AbstractDialogFragment.java +++ b/main/src/cgeo/geocaching/AbstractDialogFragment.java @@ -42,7 +42,6 @@ import android.widget.ImageView; import android.widget.TextView; public abstract class AbstractDialogFragment extends DialogFragment implements CacheMenuHandler.ActivityInterface, PopupMenu.OnMenuItemClickListener, MenuItem.OnMenuItemClickListener { - protected CgeoApplication app = null; protected Resources res = null; protected String geocode; protected CacheDetailsCreator details; @@ -61,7 +60,6 @@ public abstract class AbstractDialogFragment extends DialogFragment implements C public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); res = getResources(); - app = (CgeoApplication) getActivity().getApplication(); setHasOptionsMenu(true); } diff --git a/main/src/cgeo/geocaching/CacheDetailActivity.java b/main/src/cgeo/geocaching/CacheDetailActivity.java index dff8e09..7d13cf4 100644 --- a/main/src/cgeo/geocaching/CacheDetailActivity.java +++ b/main/src/cgeo/geocaching/CacheDetailActivity.java @@ -617,13 +617,6 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc } /** - * Wrapper for the referenced method in the xml-layout. - */ - public void goDefaultNavigation(@SuppressWarnings("unused") final View view) { - startDefaultNavigation(); - } - - /** * referenced from XML view */ public void showNavigationMenu(@SuppressWarnings("unused") final View view) { @@ -893,9 +886,9 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc public void call(final Integer selectedListId) { storeCache(selectedListId, new StoreCacheHandler(CacheDetailActivity.this, progress)); } - }, true, StoredList.TEMPORARY_LIST_ID); + }, true, StoredList.TEMPORARY_LIST.id); } else { - storeCache(StoredList.TEMPORARY_LIST_ID, new StoreCacheHandler(this, progress)); + storeCache(StoredList.TEMPORARY_LIST.id, new StoreCacheHandler(this, progress)); } } diff --git a/main/src/cgeo/geocaching/CacheListActivity.java b/main/src/cgeo/geocaching/CacheListActivity.java index 9d15e47..0ef587b 100644 --- a/main/src/cgeo/geocaching/CacheListActivity.java +++ b/main/src/cgeo/geocaching/CacheListActivity.java @@ -130,7 +130,7 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA private int detailTotal = 0; private int detailProgress = 0; private long detailProgressTime = 0L; - private int listId = StoredList.TEMPORARY_LIST_ID; // Only meaningful for the OFFLINE type + private int listId = StoredList.TEMPORARY_LIST.id; // Only meaningful for the OFFLINE type private final GeoDirHandler geoDirHandler = new GeoDirHandler() { @Override @@ -1080,11 +1080,11 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA } refreshStoredInternal(caches); } - }, true, StoredList.TEMPORARY_LIST_ID, newListName); + }, true, StoredList.TEMPORARY_LIST.id, newListName); } else { if (type != CacheListType.OFFLINE) { for (final Geocache geocache : caches) { - if (geocache.getListId() == StoredList.TEMPORARY_LIST_ID) { + if (geocache.getListId() == StoredList.TEMPORARY_LIST.id) { geocache.setListId(StoredList.STANDARD_LIST_ID); } } @@ -1592,7 +1592,7 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA } if (listId == PseudoList.ALL_LIST.id) { title = res.getString(R.string.list_all_lists); - } else if (listId <= StoredList.TEMPORARY_LIST_ID) { + } else if (listId <= StoredList.TEMPORARY_LIST.id) { listId = StoredList.STANDARD_LIST_ID; title = res.getString(R.string.stored_caches_button); } else { diff --git a/main/src/cgeo/geocaching/CachePopupFragment.java b/main/src/cgeo/geocaching/CachePopupFragment.java index b2af12c..995fea2 100644 --- a/main/src/cgeo/geocaching/CachePopupFragment.java +++ b/main/src/cgeo/geocaching/CachePopupFragment.java @@ -17,8 +17,6 @@ import rx.functions.Action0; import rx.functions.Action1; import rx.schedulers.Schedulers; -import android.content.Context; -import android.content.Intent; import android.content.res.Configuration; import android.os.Bundle; import android.os.Handler; @@ -135,9 +133,9 @@ public class CachePopupFragment extends AbstractDialogFragment { public void call(final Integer selectedListId) { storeCache(selectedListId); } - }, true, StoredList.TEMPORARY_LIST_ID); + }, true, StoredList.TEMPORARY_LIST.id); } else { - storeCache(StoredList.TEMPORARY_LIST_ID); + storeCache(StoredList.TEMPORARY_LIST.id); } } @@ -212,12 +210,6 @@ public class CachePopupFragment extends AbstractDialogFragment { getActivity().finish(); } - public static void startActivity(final Context context, final String geocode) { - final Intent popupIntent = new Intent(context, CachePopup.class); - popupIntent.putExtra(Intents.EXTRA_GEOCODE, geocode); - context.startActivity(popupIntent); - } - @Override protected Geopoint getCoordinates() { if (cache == null) { diff --git a/main/src/cgeo/geocaching/CgeoApplication.java b/main/src/cgeo/geocaching/CgeoApplication.java index 863dcdd..1b3cb05 100644 --- a/main/src/cgeo/geocaching/CgeoApplication.java +++ b/main/src/cgeo/geocaching/CgeoApplication.java @@ -2,10 +2,15 @@ package cgeo.geocaching; import cgeo.geocaching.sensors.DirectionProvider; import cgeo.geocaching.sensors.GeoDataProvider; +import cgeo.geocaching.sensors.GpsStatusProvider; +import cgeo.geocaching.sensors.GpsStatusProvider.Status; import cgeo.geocaching.sensors.IGeoData; import cgeo.geocaching.utils.Log; import cgeo.geocaching.utils.OOMDumpingUncaughtExceptionHandler; +import com.google.android.gms.common.ConnectionResult; +import com.google.android.gms.common.GooglePlayServicesUtil; + import rx.Observable; import rx.functions.Action1; import rx.observables.ConnectableObservable; @@ -23,8 +28,10 @@ public class CgeoApplication extends Application { private static CgeoApplication instance; private Observable<IGeoData> geoDataObservable; private Observable<Float> directionObservable; + private Observable<Status> gpsStatusObservable; private volatile IGeoData currentGeo = null; private volatile float currentDirection = 0.0f; + private boolean isGooglePlayServicesAvailable = false; public static void dumpOnOutOfMemory(final boolean enable) { @@ -59,15 +66,15 @@ public class CgeoApplication extends Application { final Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey"); menuKeyField.setAccessible(true); menuKeyField.setBoolean(config, false); - } catch (final IllegalArgumentException e) { - // ignore - } catch (final NoSuchFieldException e) { - // ignore - } catch (final IllegalAccessException e) { - // ignore + } catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException ignore) { } // ensure initialization of lists DataStore.getLists(); + // Check if Google Play services is available + if (GooglePlayServicesUtil.isGooglePlayServicesAvailable(this) == ConnectionResult.SUCCESS) { + isGooglePlayServicesAvailable = true; + } + Log.i("Google Play services are " + (isGooglePlayServicesAvailable ? "" : "not ") + "available"); } @Override @@ -104,6 +111,14 @@ public class CgeoApplication extends Application { return directionObservable; } + public synchronized Observable<Status> gpsStatusObservable() { + if (gpsStatusObservable == null) { + final ConnectableObservable<Status> onDemand = GpsStatusProvider.create(this).replay(1); + gpsStatusObservable = onDemand.refCount(); + } + return gpsStatusObservable; + } + public IGeoData currentGeo() { return currentGeo != null ? currentGeo : geoDataObservable().toBlocking().first(); } @@ -138,4 +153,8 @@ public class CgeoApplication extends Application { forceRelog = true; } + public boolean isGooglePlayServicesAvailable() { + return isGooglePlayServicesAvailable; + } + } diff --git a/main/src/cgeo/geocaching/CompassActivity.java b/main/src/cgeo/geocaching/CompassActivity.java index 025d938..7b5ae35 100644 --- a/main/src/cgeo/geocaching/CompassActivity.java +++ b/main/src/cgeo/geocaching/CompassActivity.java @@ -10,6 +10,7 @@ import cgeo.geocaching.geopoint.Units; import cgeo.geocaching.maps.CGeoMap; import cgeo.geocaching.sensors.DirectionProvider; import cgeo.geocaching.sensors.GeoDirHandler; +import cgeo.geocaching.sensors.GpsStatusProvider.Status; import cgeo.geocaching.sensors.IGeoData; import cgeo.geocaching.settings.Settings; import cgeo.geocaching.speech.SpeechService; @@ -21,6 +22,9 @@ import cgeo.geocaching.utils.Log; import org.apache.commons.lang3.StringUtils; import org.eclipse.jdt.annotation.Nullable; +import rx.android.schedulers.AndroidSchedulers; +import rx.functions.Action1; + import android.content.Context; import android.content.Intent; import android.content.res.Configuration; @@ -118,7 +122,8 @@ public class CompassActivity extends AbstractActionBarActivity { @Override public void onResume() { - super.onResume(geoDirHandler.start(GeoDirHandler.UPDATE_GEODIR)); + super.onResume(geoDirHandler.start(GeoDirHandler.UPDATE_GEODIR), + app.gpsStatusObservable().observeOn(AndroidSchedulers.mainThread()).subscribe(gpsStatusHandler)); } @Override @@ -259,16 +264,22 @@ public class CompassActivity extends AbstractActionBarActivity { headingView.setText(Math.round(cacheHeading) + "°"); } + private final Action1<Status> gpsStatusHandler = new Action1<Status>() { + @Override + public void call(final Status gpsStatus) { + if (gpsStatus.satellitesVisible >= 0) { + navSatellites.setText(res.getString(R.string.loc_sat) + ": " + gpsStatus.satellitesFixed + "/" + gpsStatus.satellitesVisible); + } else { + navSatellites.setText(""); + } + } + }; + private final GeoDirHandler geoDirHandler = new GeoDirHandler() { @Override public void updateGeoDir(final IGeoData geo, final float dir) { try { if (geo.getCoords() != null) { - if (geo.getSatellitesVisible() >= 0) { - navSatellites.setText(res.getString(R.string.loc_sat) + ": " + geo.getSatellitesFixed() + "/" + geo.getSatellitesVisible()); - } else { - navSatellites.setText(""); - } navType.setText(res.getString(geo.getLocationProvider().resourceId)); if (geo.getAccuracy() >= 0) { diff --git a/main/src/cgeo/geocaching/DataStore.java b/main/src/cgeo/geocaching/DataStore.java index e236f8f..4f4eaec 100644 --- a/main/src/cgeo/geocaching/DataStore.java +++ b/main/src/cgeo/geocaching/DataStore.java @@ -58,6 +58,7 @@ import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.Date; +import java.util.EnumMap; import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; @@ -1009,7 +1010,7 @@ public class DataStore { } synchronized (listId) { listId.bindString(1, value); - return listId.simpleQueryForLong() != StoredList.TEMPORARY_LIST_ID; + return listId.simpleQueryForLong() != StoredList.TEMPORARY_LIST.id; } } catch (final SQLiteDoneException e) { // Do nothing, it only means we have no information on the cache @@ -1041,27 +1042,6 @@ public class DataStore { return null; } - public static String getCacheidForGeocode(final String geocode) { - if (StringUtils.isBlank(geocode)) { - return null; - } - init(); - - try { - final SQLiteStatement description = PreparedStatements.getCacheIdOfGeocode(); - synchronized (description) { - description.bindString(1, geocode); - return description.simpleQueryForString(); - } - } catch (final SQLiteDoneException e) { - // Do nothing, it only means we have no information on the cache - } catch (final Exception e) { - Log.e("DataStore.getCacheidForGeocode", e); - } - - return null; - } - /** * Save/store a cache to the CacheCache * @@ -1970,7 +1950,7 @@ public class DataStore { init(); - final Map<LogType, Integer> logCounts = new HashMap<>(); + final Map<LogType, Integer> logCounts = new EnumMap<>(LogType.class); final Cursor cursor = database.query( dbTableLogCount, @@ -3003,10 +2983,6 @@ public class DataStore { return getStatement("listFromGeocode", "SELECT reason FROM " + dbTableCaches + " WHERE guid = ?"); } - private static SQLiteStatement getCacheIdOfGeocode() { - return getStatement("cacheIdFromGeocode", "SELECT cacheid FROM " + dbTableCaches + " WHERE geocode = ?"); - } - private static SQLiteStatement getGeocodeOfGuid() { return getStatement("geocodeFromGuid", "SELECT geocode FROM " + dbTableCaches + " WHERE guid = ?"); } @@ -3018,7 +2994,7 @@ public class DataStore { } public static void markDropped(final List<Geocache> caches) { - moveToList(caches, StoredList.TEMPORARY_LIST_ID); + moveToList(caches, StoredList.TEMPORARY_LIST.id); } public static Viewport getBounds(final String geocode) { diff --git a/main/src/cgeo/geocaching/Geocache.java b/main/src/cgeo/geocaching/Geocache.java index e0daae1..19082d9 100644 --- a/main/src/cgeo/geocaching/Geocache.java +++ b/main/src/cgeo/geocaching/Geocache.java @@ -12,11 +12,9 @@ import cgeo.geocaching.connector.gc.GCConnector; import cgeo.geocaching.connector.gc.GCConstants; import cgeo.geocaching.connector.gc.Tile; import cgeo.geocaching.connector.gc.UncertainProperty; -import cgeo.geocaching.enumerations.CacheAttribute; import cgeo.geocaching.enumerations.CacheSize; import cgeo.geocaching.enumerations.CacheType; import cgeo.geocaching.enumerations.LoadFlags; -import cgeo.geocaching.enumerations.LoadFlags.LoadFlag; import cgeo.geocaching.enumerations.LoadFlags.RemoveFlag; import cgeo.geocaching.enumerations.LoadFlags.SaveFlag; import cgeo.geocaching.enumerations.LogType; @@ -69,8 +67,8 @@ import java.util.Calendar; import java.util.Collection; import java.util.Collections; import java.util.Date; +import java.util.EnumMap; import java.util.EnumSet; -import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.LinkedList; @@ -88,7 +86,7 @@ public class Geocache implements ICache, IWaypoint { private long updated = 0; private long detailedUpdate = 0; private long visitedDate = 0; - private int listId = StoredList.TEMPORARY_LIST_ID; + private int listId = StoredList.TEMPORARY_LIST.id; private boolean detailed = false; private String geocode = ""; private String cacheId = ""; @@ -149,7 +147,7 @@ public class Geocache implements ICache, IWaypoint { private List<Image> spoilers = null; private List<Trackable> inventory = null; - private Map<LogType, Integer> logCounts = new HashMap<>(); + private Map<LogType, Integer> logCounts = new EnumMap<>(LogType.class); private boolean userModifiedCoords = false; // temporary values private boolean statusChecked = false; @@ -165,7 +163,7 @@ public class Geocache implements ICache, IWaypoint { // Images whose URL contains one of those patterns will not be available on the Images tab // for opening into an external application. - private final String[] NO_EXTERNAL = new String[]{"geocheck.org"}; + private final static String[] NO_EXTERNAL = new String[]{"geocheck.org"}; /** * Create a new cache. To be used everywhere except for the GPX parser @@ -251,7 +249,7 @@ public class Geocache implements ICache, IWaypoint { if (visitedDate == 0) { visitedDate = other.visitedDate; } - if (listId == StoredList.TEMPORARY_LIST_ID) { + if (listId == StoredList.TEMPORARY_LIST.id) { listId = other.listId; } if (StringUtils.isBlank(geocode)) { @@ -1432,7 +1430,7 @@ public class Geocache implements ICache, IWaypoint { } public void store(final CancellableHandler handler) { - store(StoredList.TEMPORARY_LIST_ID, handler); + store(StoredList.TEMPORARY_LIST.id, handler); } public void store(final int listId, final CancellableHandler handler) { @@ -1627,7 +1625,7 @@ public class Geocache implements ICache, IWaypoint { return null; } - if (!forceReload && listId == StoredList.TEMPORARY_LIST_ID && (DataStore.isOffline(geocode, guid) || DataStore.isThere(geocode, guid, true, true))) { + if (!forceReload && listId == StoredList.TEMPORARY_LIST.id && (DataStore.isOffline(geocode, guid) || DataStore.isThere(geocode, guid, true, true))) { final SearchResult search = new SearchResult(); final String realGeocode = StringUtils.isNotBlank(geocode) ? geocode : DataStore.getGeocodeForGuid(guid); search.addGeocode(realGeocode); @@ -1693,22 +1691,6 @@ public class Geocache implements ICache, IWaypoint { return null; } - /** - * check whether the cache has a given attribute - * - * @param attribute - * @param yes - * true if we are looking for the attribute_yes version, false for the attribute_no version - * @return - */ - public boolean hasAttribute(final CacheAttribute attribute, final boolean yes) { - Geocache fullCache = DataStore.loadCache(getGeocode(), EnumSet.of(LoadFlag.ATTRIBUTES)); - if (fullCache == null) { - fullCache = this; - } - return fullCache.getAttributes().contains(attribute.getAttributeName(yes)); - } - public boolean hasStaticMap() { return StaticMapsProvider.hasStaticMap(this); } diff --git a/main/src/cgeo/geocaching/GpxFileListActivity.java b/main/src/cgeo/geocaching/GpxFileListActivity.java index dae52c4..3da4927 100644 --- a/main/src/cgeo/geocaching/GpxFileListActivity.java +++ b/main/src/cgeo/geocaching/GpxFileListActivity.java @@ -1,63 +1,63 @@ -package cgeo.geocaching;
-
-import cgeo.geocaching.connector.ConnectorFactory;
-import cgeo.geocaching.connector.IConnector;
-import cgeo.geocaching.files.AbstractFileListActivity;
-import cgeo.geocaching.files.GPXImporter;
-import cgeo.geocaching.list.StoredList;
-import cgeo.geocaching.settings.Settings;
-import cgeo.geocaching.ui.GPXListAdapter;
-
-import org.apache.commons.lang3.StringUtils;
-
-import android.app.Activity;
-import android.content.Intent;
-
-import java.io.File;
-import java.util.Collections;
-import java.util.List;
-
-public class GpxFileListActivity extends AbstractFileListActivity<GPXListAdapter> {
-
- public GpxFileListActivity() {
- super(new String[] { "gpx", "loc", "zip" });
- }
-
- @Override
- protected GPXListAdapter getAdapter(List<File> files) {
- return new GPXListAdapter(this, files);
- }
-
- @Override
- protected List<File> getBaseFolders() {
- return Collections.singletonList(new File(Settings.getGpxImportDir()));
- }
-
- public static void startSubActivity(Activity fromActivity, int listId) {
- final Intent intent = new Intent(fromActivity, GpxFileListActivity.class);
- intent.putExtra(Intents.EXTRA_LIST_ID, StoredList.getConcreteList(listId));
- fromActivity.startActivityForResult(intent, 0);
- }
-
- @Override
- protected boolean filenameBelongsToList(final String filename) {
- if (super.filenameBelongsToList(filename)) {
- if (StringUtils.endsWithIgnoreCase(filename, GPXImporter.ZIP_FILE_EXTENSION)) {
- for (IConnector connector : ConnectorFactory.getConnectors()) {
- if (connector.isZippedGPXFile(filename)) {
- return true;
- }
- }
- return false;
- }
- // filter out waypoint files
- return !StringUtils.containsIgnoreCase(filename, GPXImporter.WAYPOINTS_FILE_SUFFIX);
- }
- return false;
- }
-
- public int getListId() {
- return listId;
- }
-
-}
+package cgeo.geocaching; + +import cgeo.geocaching.connector.ConnectorFactory; +import cgeo.geocaching.connector.IConnector; +import cgeo.geocaching.files.AbstractFileListActivity; +import cgeo.geocaching.files.GPXImporter; +import cgeo.geocaching.list.StoredList; +import cgeo.geocaching.settings.Settings; +import cgeo.geocaching.ui.GPXListAdapter; + +import org.apache.commons.lang3.StringUtils; + +import android.app.Activity; +import android.content.Intent; + +import java.io.File; +import java.util.Collections; +import java.util.List; + +public class GpxFileListActivity extends AbstractFileListActivity<GPXListAdapter> { + + public GpxFileListActivity() { + super(new String[] { "gpx", "loc", "zip" }); + } + + @Override + protected GPXListAdapter getAdapter(List<File> files) { + return new GPXListAdapter(this, files); + } + + @Override + protected List<File> getBaseFolders() { + return Collections.singletonList(new File(Settings.getGpxImportDir())); + } + + public static void startSubActivity(Activity fromActivity, int listId) { + final Intent intent = new Intent(fromActivity, GpxFileListActivity.class); + intent.putExtra(Intents.EXTRA_LIST_ID, StoredList.getConcreteList(listId)); + fromActivity.startActivityForResult(intent, 0); + } + + @Override + protected boolean filenameBelongsToList(final String filename) { + if (super.filenameBelongsToList(filename)) { + if (StringUtils.endsWithIgnoreCase(filename, GPXImporter.ZIP_FILE_EXTENSION)) { + for (IConnector connector : ConnectorFactory.getConnectors()) { + if (connector.isZippedGPXFile(filename)) { + return true; + } + } + return false; + } + // filter out waypoint files + return !StringUtils.containsIgnoreCase(filename, GPXImporter.WAYPOINTS_FILE_SUFFIX); + } + return false; + } + + public int getListId() { + return listId; + } + +} diff --git a/main/src/cgeo/geocaching/MainActivity.java b/main/src/cgeo/geocaching/MainActivity.java index 2d6e9f0..9d9b48c 100644 --- a/main/src/cgeo/geocaching/MainActivity.java +++ b/main/src/cgeo/geocaching/MainActivity.java @@ -6,8 +6,6 @@ import butterknife.InjectView; import cgeo.geocaching.activity.AbstractActionBarActivity; import cgeo.geocaching.connector.ConnectorFactory; import cgeo.geocaching.connector.capability.ILogin; -import cgeo.geocaching.connector.gc.GCConnector; -import cgeo.geocaching.connector.gc.GCLogin; import cgeo.geocaching.enumerations.CacheType; import cgeo.geocaching.enumerations.StatusCode; import cgeo.geocaching.geopoint.Geopoint; @@ -16,6 +14,8 @@ import cgeo.geocaching.list.PseudoList; import cgeo.geocaching.list.StoredList; import cgeo.geocaching.maps.CGeoMap; import cgeo.geocaching.sensors.GeoDirHandler; +import cgeo.geocaching.sensors.GpsStatusProvider; +import cgeo.geocaching.sensors.GpsStatusProvider.Status; import cgeo.geocaching.sensors.IGeoData; import cgeo.geocaching.settings.Settings; import cgeo.geocaching.settings.SettingsActivity; @@ -36,8 +36,8 @@ import rx.Observable; import rx.Observable.OnSubscribe; import rx.Subscriber; import rx.android.observables.AndroidObservable; +import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action1; -import rx.subscriptions.Subscriptions; import android.app.AlertDialog; import android.app.AlertDialog.Builder; @@ -145,37 +145,16 @@ public class MainActivity extends AbstractActionBarActivity { return StringUtils.join(addressParts, ", "); } - private class SatellitesHandler extends GeoDirHandler { - - private boolean gpsEnabled = false; - private int satellitesFixed = 0; - private int satellitesVisible = 0; - + private final Action1<GpsStatusProvider.Status> satellitesHandler = new Action1<Status>() { @Override - public void updateGeoData(final IGeoData data) { - if (data.getGpsEnabled() == gpsEnabled && - data.getSatellitesFixed() == satellitesFixed && - data.getSatellitesVisible() == satellitesVisible) { - return; - } - gpsEnabled = data.getGpsEnabled(); - satellitesFixed = data.getSatellitesFixed(); - satellitesVisible = data.getSatellitesVisible(); - - if (gpsEnabled) { - if (satellitesFixed > 0) { - navSatellites.setText(res.getString(R.string.loc_sat) + ": " + satellitesFixed + '/' + satellitesVisible); - } else if (satellitesVisible >= 0) { - navSatellites.setText(res.getString(R.string.loc_sat) + ": 0/" + satellitesVisible); - } + public void call(final Status gpsStatus) { + if (gpsStatus.gpsEnabled) { + navSatellites.setText(res.getString(R.string.loc_sat) + ": " + gpsStatus.satellitesFixed + '/' + gpsStatus.satellitesVisible); } else { navSatellites.setText(res.getString(R.string.loc_gps_disabled)); } } - - } - - private final SatellitesHandler satellitesHandler = new SatellitesHandler(); + }; private final Handler firstLoginHandler = new Handler() { @@ -229,7 +208,8 @@ public class MainActivity extends AbstractActionBarActivity { @Override public void onResume() { - super.onResume(Subscriptions.from(locationUpdater.start(GeoDirHandler.UPDATE_GEODATA), satellitesHandler.start(GeoDirHandler.UPDATE_GEODATA))); + super.onResume(locationUpdater.start(GeoDirHandler.UPDATE_GEODATA), + app.gpsStatusObservable().observeOn(AndroidSchedulers.mainThread()).subscribe(satellitesHandler)); updateUserInfoHandler.sendEmptyMessage(-1); startBackgroundLogin(); init(); @@ -245,9 +225,9 @@ public class MainActivity extends AbstractActionBarActivity { new Thread() { @Override public void run() { - if (mustLogin && conn == GCConnector.getInstance()) { + if (mustLogin) { // Properly log out from geocaching.com - GCLogin.getInstance().logout(); + conn.logout(); } conn.login(firstLoginHandler, MainActivity.this); updateUserInfoHandler.sendEmptyMessage(-1); @@ -733,12 +713,18 @@ public class MainActivity extends AbstractActionBarActivity { } private void checkShowChangelog() { - final long lastChecksum = Settings.getLastChangelogChecksum(); - final long checksum = TextUtils.checksum(getString(R.string.changelog_master) + getString(R.string.changelog_release)); - Settings.setLastChangelogChecksum(checksum); - // don't show change log after new install... - if (lastChecksum > 0 && lastChecksum != checksum) { - AboutActivity.showChangeLog(this); + // temporary workaround for #4143 + //TODO: understand and avoid if possible + try { + final long lastChecksum = Settings.getLastChangelogChecksum(); + final long checksum = TextUtils.checksum(getString(R.string.changelog_master) + getString(R.string.changelog_release)); + Settings.setLastChangelogChecksum(checksum); + // don't show change log after new install... + if (lastChecksum > 0 && lastChecksum != checksum) { + AboutActivity.showChangeLog(this); + } + } catch (final Exception ex) { + Log.e("Error checking/showing changelog!", ex); } } diff --git a/main/src/cgeo/geocaching/SelectMapfileActivity.java b/main/src/cgeo/geocaching/SelectMapfileActivity.java index dc898d7..da41250 100644 --- a/main/src/cgeo/geocaching/SelectMapfileActivity.java +++ b/main/src/cgeo/geocaching/SelectMapfileActivity.java @@ -33,7 +33,7 @@ public class SelectMapfileActivity extends AbstractFileListActivity<FileSelectio private String mapFile; - private static int REQUEST_DIRECTORY = 1; + private final static int REQUEST_DIRECTORY = 1; @Override public void onCreate(Bundle savedInstanceState) { @@ -98,8 +98,8 @@ public class SelectMapfileActivity extends AbstractFileListActivity<FileSelectio } @Override - public void setCurrentFile(String newFile) { - mapFile = newFile; + public void setCurrentFile(String name) { + mapFile = name; } @Override diff --git a/main/src/cgeo/geocaching/activity/AbstractActivity.java b/main/src/cgeo/geocaching/activity/AbstractActivity.java index e3df1f7..a28fcfa 100644 --- a/main/src/cgeo/geocaching/activity/AbstractActivity.java +++ b/main/src/cgeo/geocaching/activity/AbstractActivity.java @@ -86,9 +86,9 @@ public abstract class AbstractActivity extends ActionBarActivity implements IAbs return super.onOptionsItemSelected(item); } - public void onResume(final Subscription resumeSubscription) { + public void onResume(final Subscription... resumeSubscriptions) { super.onResume(); - this.resumeSubscription = resumeSubscription; + this.resumeSubscription = Subscriptions.from(resumeSubscriptions); } @Override diff --git a/main/src/cgeo/geocaching/apps/cache/navi/PebbleApp.java b/main/src/cgeo/geocaching/apps/cache/navi/PebbleApp.java index ac83085..5012195 100644 --- a/main/src/cgeo/geocaching/apps/cache/navi/PebbleApp.java +++ b/main/src/cgeo/geocaching/apps/cache/navi/PebbleApp.java @@ -1,26 +1,26 @@ -package cgeo.geocaching.apps.cache.navi;
-
-import cgeo.geocaching.R;
-import cgeo.geocaching.geopoint.Geopoint;
-
-import android.content.Intent;
-
-/**
- * Application for communication with the Pebble watch.
- *
- */
-class PebbleApp extends AbstractRadarApp {
-
- private static final String INTENT = "com.webmajstr.pebble_gc.NAVIGATE_TO";
- private static final String PACKAGE_NAME = "com.webmajstr.pebble_gc";
-
- PebbleApp() {
- super(getString(R.string.cache_menu_pebble), R.id.cache_app_pebble, INTENT, PACKAGE_NAME);
- }
-
- @Override
- protected void addCoordinates(final Intent intent, final Geopoint coords) {
- intent.putExtra("latitude", coords.getLatitude());
- intent.putExtra("longitude", coords.getLongitude());
- }
+package cgeo.geocaching.apps.cache.navi; + +import cgeo.geocaching.R; +import cgeo.geocaching.geopoint.Geopoint; + +import android.content.Intent; + +/** + * Application for communication with the Pebble watch. + * + */ +class PebbleApp extends AbstractRadarApp { + + private static final String INTENT = "com.webmajstr.pebble_gc.NAVIGATE_TO"; + private static final String PACKAGE_NAME = "com.webmajstr.pebble_gc"; + + PebbleApp() { + super(getString(R.string.cache_menu_pebble), R.id.cache_app_pebble, INTENT, PACKAGE_NAME); + } + + @Override + protected void addCoordinates(final Intent intent, final Geopoint coords) { + intent.putExtra("latitude", coords.getLatitude()); + intent.putExtra("longitude", coords.getLongitude()); + } }
\ No newline at end of file diff --git a/main/src/cgeo/geocaching/concurrent/BlockingThreadPool.java b/main/src/cgeo/geocaching/concurrent/BlockingThreadPool.java deleted file mode 100644 index a6d7e9b..0000000 --- a/main/src/cgeo/geocaching/concurrent/BlockingThreadPool.java +++ /dev/null @@ -1,57 +0,0 @@ -package cgeo.geocaching.concurrent; - - -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -/** - * BlockingThreadPool restricts the amount of parallel threads executing Runnables. - */ -public class BlockingThreadPool { - /** The queue holding the Runnable. **/ - private BlockingQueue<Runnable> queue = null; - /** The Executor. **/ - private ThreadPoolExecutor executor; - - /** - * Creates a ThreadPool with a given maximum of parallel threads running. - * Idle threads will be stopped until new threads are added. - * - * @param poolSize - * Maximum amout of parallel Threads - * @param priority - * The Thread priority e.g. Thread.MIN_PRIORITY - */ - public BlockingThreadPool(int poolSize, int priority) { - ThreadFactory threadFactory = new PriorityThreadFactory(priority); - this.queue = new ArrayBlockingQueue<>(poolSize, true); - this.executor = new ThreadPoolExecutor(0, poolSize, 5, TimeUnit.SECONDS, this.queue); - this.executor.setThreadFactory(threadFactory); - } - - /** - * Add a runnable to the pool. This will start the core threads in the underlying - * executor and try to add the Runnable to the pool. This method waits until timeout - * if no free thread is available. - * - * @param task - * The Runnable to add to the pool - * @param timeout - * The timeout to wait for a free thread - * @param unit - * The timeout unit - * @return true/false successful added - * @throws InterruptedException - * Operation was interrupted - */ - public boolean add(Runnable task, int timeout, TimeUnit unit) throws InterruptedException { - this.executor.setCorePoolSize(this.executor.getMaximumPoolSize()); - this.executor.prestartAllCoreThreads(); - boolean successfull = this.queue.offer(task, timeout, unit); - this.executor.setCorePoolSize(0); - return successfull; - } -} diff --git a/main/src/cgeo/geocaching/concurrent/PriorityThreadFactory.java b/main/src/cgeo/geocaching/concurrent/PriorityThreadFactory.java deleted file mode 100644 index 0da198b..0000000 --- a/main/src/cgeo/geocaching/concurrent/PriorityThreadFactory.java +++ /dev/null @@ -1,25 +0,0 @@ -package cgeo.geocaching.concurrent; - -import org.eclipse.jdt.annotation.NonNull; - -import java.util.concurrent.ThreadFactory; - -/** - * Helper class for setting Thread priority in ThreadPool. - */ -public class PriorityThreadFactory implements ThreadFactory { - private int priority; - - public PriorityThreadFactory(int priority) { - this.priority = priority; - } - - @NonNull - @Override - public Thread newThread(Runnable r) { - Thread result = new Thread(r); - result.setPriority(this.priority); - return result; - } - -} diff --git a/main/src/cgeo/geocaching/connector/AbstractConnector.java b/main/src/cgeo/geocaching/connector/AbstractConnector.java index 7e1ca13..8138e96 100644 --- a/main/src/cgeo/geocaching/connector/AbstractConnector.java +++ b/main/src/cgeo/geocaching/connector/AbstractConnector.java @@ -105,9 +105,9 @@ public abstract class AbstractConnector implements IConnector { return null; } - protected static boolean isNumericId(final String string) { + protected static boolean isNumericId(final String str) { try { - return Integer.parseInt(string) > 0; + return Integer.parseInt(str) > 0; } catch (NumberFormatException e) { } return false; @@ -295,4 +295,6 @@ public abstract class AbstractConnector implements IConnector { return actions; } + public void logout() { + } } diff --git a/main/src/cgeo/geocaching/connector/capability/ILogin.java b/main/src/cgeo/geocaching/connector/capability/ILogin.java index 4a839c8..b8b4975 100644 --- a/main/src/cgeo/geocaching/connector/capability/ILogin.java +++ b/main/src/cgeo/geocaching/connector/capability/ILogin.java @@ -23,6 +23,11 @@ public interface ILogin extends IConnector { boolean login(Handler handler, Context fromActivity); /** + * Log out of the connector if possible. + */ + void logout(); + + /** * Returns the status of the last {@link}login() request * * @return diff --git a/main/src/cgeo/geocaching/connector/ec/ECApi.java b/main/src/cgeo/geocaching/connector/ec/ECApi.java index 421d112..ae266fa 100644 --- a/main/src/cgeo/geocaching/connector/ec/ECApi.java +++ b/main/src/cgeo/geocaching/connector/ec/ECApi.java @@ -14,22 +14,24 @@ import cgeo.geocaching.geopoint.Viewport; import cgeo.geocaching.list.StoredList; import cgeo.geocaching.network.Network; import cgeo.geocaching.network.Parameters; +import cgeo.geocaching.utils.JsonUtils; import cgeo.geocaching.utils.Log; import cgeo.geocaching.utils.SynchronizedDateFormat; import ch.boye.httpclientandroidlib.HttpResponse; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ArrayNode; + import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import java.util.ArrayList; +import java.io.IOException; import java.util.Calendar; import java.util.Collection; import java.util.Collections; import java.util.EnumSet; +import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -161,7 +163,7 @@ public class ECApi { } try { - return new GPX10Parser(StoredList.TEMPORARY_LIST_ID).parse(response.getEntity().getContent(), null); + return new GPX10Parser(StoredList.TEMPORARY_LIST.id).parse(response.getEntity().getContent(), null); } catch (Exception e) { Log.e("Error importing gpx from extremcaching.com", e); return Collections.emptyList(); @@ -175,42 +177,41 @@ public class ECApi { if (StringUtils.isBlank(data) || StringUtils.equals(data, "[]")) { return Collections.emptyList(); } - final JSONArray json = new JSONArray(data); - final int len = json.length(); - final List<Geocache> caches = new ArrayList<>(len); - for (int i = 0; i < len; i++) { - final Geocache cache = parseCache(json.getJSONObject(i)); + final ArrayNode json = (ArrayNode) JsonUtils.reader.readTree(data); + final List<Geocache> caches = new LinkedList<>(); + for (final JsonNode node: json) { + final Geocache cache = parseCache(node); if (cache != null) { caches.add(cache); } } return caches; - } catch (final JSONException e) { - Log.w("JSONResult", e); + } catch (IOException | ClassCastException e) { + Log.w("importCachesFromJSON", e); } } return Collections.emptyList(); } - private static Geocache parseCache(final JSONObject response) { - final Geocache cache = new Geocache(); - cache.setReliableLatLon(true); + private static Geocache parseCache(final JsonNode response) { try { - cache.setGeocode("EC" + response.getString("cache_id")); - cache.setName(response.getString("title")); - cache.setCoords(new Geopoint(response.getString("lat"), response.getString("lon"))); - cache.setType(getCacheType(response.getString("type"))); - cache.setDifficulty((float) response.getDouble("difficulty")); - cache.setTerrain((float) response.getDouble("terrain")); - cache.setSize(CacheSize.getById(response.getString("size"))); - cache.setFound(response.getInt("found") == 1); + final Geocache cache = new Geocache(); + cache.setReliableLatLon(true); + cache.setGeocode("EC" + response.get("cache_id").asText()); + cache.setName(response.get("title").asText()); + cache.setCoords(new Geopoint(response.get("lat").asText(), response.get("lon").asText())); + cache.setType(getCacheType(response.get("type").asText())); + cache.setDifficulty((float) response.get("difficulty").asDouble()); + cache.setTerrain((float) response.get("terrain").asDouble()); + cache.setSize(CacheSize.getById(response.get("size").asText())); + cache.setFound(response.get("found").asInt() == 1); DataStore.saveCache(cache, EnumSet.of(SaveFlag.CACHE)); - } catch (final JSONException e) { + return cache; + } catch (final NullPointerException e) { Log.e("ECApi.parseCache", e); return null; } - return cache; } private static CacheType getCacheType(final String cacheType) { diff --git a/main/src/cgeo/geocaching/connector/ec/ECLogin.java b/main/src/cgeo/geocaching/connector/ec/ECLogin.java index 012bdc9..35c2db4 100644 --- a/main/src/cgeo/geocaching/connector/ec/ECLogin.java +++ b/main/src/cgeo/geocaching/connector/ec/ECLogin.java @@ -7,14 +7,18 @@ import cgeo.geocaching.enumerations.StatusCode; import cgeo.geocaching.network.Network; import cgeo.geocaching.network.Parameters; import cgeo.geocaching.settings.Settings; +import cgeo.geocaching.utils.JsonUtils; import cgeo.geocaching.utils.Log; import ch.boye.httpclientandroidlib.HttpResponse; + +import com.fasterxml.jackson.databind.JsonNode; + import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; import org.eclipse.jdt.annotation.Nullable; -import org.json.JSONException; -import org.json.JSONObject; + +import java.io.IOException; public class ECLogin extends AbstractLogin { @@ -26,7 +30,7 @@ public class ECLogin extends AbstractLogin { } private static class SingletonHolder { - private static ECLogin INSTANCE = new ECLogin(); + private final static ECLogin INSTANCE = new ECLogin(); } public static ECLogin getInstance() { @@ -93,18 +97,18 @@ public class ECLogin extends AbstractLogin { setActualStatus(app.getString(R.string.init_login_popup_ok)); try { - final JSONObject json = new JSONObject(data); + final JsonNode json = JsonUtils.reader.readTree(data); - final String sid = json.getString("sid"); + final String sid = json.get("sid").asText(); if (!StringUtils.isBlank(sid)) { sessionId = sid; setActualLoginStatus(true); - setActualUserName(json.getString("username")); - setActualCachesFound(json.getInt("found")); + setActualUserName(json.get("username").asText()); + setActualCachesFound(json.get("found").asInt()); return true; } resetLoginStatus(); - } catch (final JSONException e) { + } catch (IOException | NullPointerException e) { Log.e("ECLogin.getLoginStatus", e); } diff --git a/main/src/cgeo/geocaching/connector/gc/GCConnector.java b/main/src/cgeo/geocaching/connector/gc/GCConnector.java index 294e969..ad00718 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCConnector.java +++ b/main/src/cgeo/geocaching/connector/gc/GCConnector.java @@ -342,6 +342,11 @@ public class GCConnector extends AbstractConnector implements ISearchByGeocode, } @Override + public void logout() { + GCLogin.getInstance().logout(); + } + + @Override public String getUserName() { return GCLogin.getInstance().getActualUserName(); } diff --git a/main/src/cgeo/geocaching/connector/gc/GCConstants.java b/main/src/cgeo/geocaching/connector/gc/GCConstants.java index 7cf43dc..fe47a91 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCConstants.java +++ b/main/src/cgeo/geocaching/connector/gc/GCConstants.java @@ -45,7 +45,6 @@ public final class GCConstants { public final static Pattern PATTERN_OWNER_USERID = Pattern.compile("other caches <a href=\"/seek/nearest\\.aspx\\?u=(.*?)\">hidden</a> or"); public final static Pattern PATTERN_FOUND = Pattern.compile("ctl00_ContentBody_GeoNav_logText\">(Found It|Attended)"); public final static Pattern PATTERN_FOUND_ALTERNATIVE = Pattern.compile("<div class=\"StatusInformationWidget FavoriteWidget\""); - public final static Pattern PATTERN_FOUND_DATE = Pattern.compile(">Logged on: ([^<]+?)<"); public final static Pattern PATTERN_OWNER_DISPLAYNAME = Pattern.compile("<div id=\"ctl00_ContentBody_mcd1\">[^<]+<a href=\"[^\"]+\">([^<]+)</a>"); public final static Pattern PATTERN_TYPE = Pattern.compile("<a href=\"/seek/nearest.aspx\\?tx=([0-9a-f-]+)"); public final static Pattern PATTERN_HIDDEN = Pattern.compile("<div id=\"ctl00_ContentBody_mcd2\">\\W*Hidden[\\s:]*([^<]+?)</div>"); diff --git a/main/src/cgeo/geocaching/connector/gc/GCLogin.java b/main/src/cgeo/geocaching/connector/gc/GCLogin.java index e84851e..e99cdf6 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCLogin.java +++ b/main/src/cgeo/geocaching/connector/gc/GCLogin.java @@ -177,6 +177,9 @@ public class GCLogin extends AbstractLogin { return StatusCode.NO_ERROR; } + private static String removeDotAndComma(final String str) { + return StringUtils.replaceChars(str, ".,", null); + } /** * Check if the user has been logged in when he retrieved the data. @@ -203,7 +206,7 @@ public class GCLogin extends AbstractLogin { setActualUserName(TextUtils.getMatch(page, GCConstants.PATTERN_LOGIN_NAME, true, "???")); int cachesCount = 0; try { - cachesCount = Integer.parseInt(TextUtils.getMatch(page, GCConstants.PATTERN_CACHES_FOUND, true, "0").replaceAll("[,.]", "")); + cachesCount = Integer.parseInt(removeDotAndComma(TextUtils.getMatch(page, GCConstants.PATTERN_CACHES_FOUND, true, "0"))); } catch (final NumberFormatException e) { Log.e("getLoginStatus: bad cache count", e); } @@ -268,7 +271,7 @@ public class GCLogin extends AbstractLogin { Settings.setGCMemberStatus(GCConstants.MEMBER_STATUS_PM); } - setActualCachesFound(Integer.parseInt(TextUtils.getMatch(profile, GCConstants.PATTERN_CACHES_FOUND, true, "-1").replaceAll("[,.]", ""))); + setActualCachesFound(Integer.parseInt(removeDotAndComma(TextUtils.getMatch(profile, GCConstants.PATTERN_CACHES_FOUND, true, "-1")))); final String avatarURL = TextUtils.getMatch(profile, GCConstants.PATTERN_AVATAR_IMAGE_PROFILE_PAGE, false, null); if (null != avatarURL) { diff --git a/main/src/cgeo/geocaching/connector/gc/GCMap.java b/main/src/cgeo/geocaching/connector/gc/GCMap.java index 27ce06e..bacaddb 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCMap.java +++ b/main/src/cgeo/geocaching/connector/gc/GCMap.java @@ -9,6 +9,7 @@ import cgeo.geocaching.enumerations.CacheType; import cgeo.geocaching.enumerations.LiveMapStrategy.Strategy; import cgeo.geocaching.enumerations.LiveMapStrategy.StrategyFlag; import cgeo.geocaching.enumerations.StatusCode; +import cgeo.geocaching.files.ParserException; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.GeopointFormatter.Format; import cgeo.geocaching.geopoint.Units; @@ -16,20 +17,23 @@ import cgeo.geocaching.geopoint.Viewport; import cgeo.geocaching.network.Parameters; import cgeo.geocaching.settings.Settings; import cgeo.geocaching.utils.Formatter; +import cgeo.geocaching.utils.JsonUtils; import cgeo.geocaching.utils.LeastRecentlyUsedMap; import cgeo.geocaching.utils.Log; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; + import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; import rx.Observable; import rx.functions.Func2; import android.graphics.Bitmap; +import java.io.IOException; import java.text.ParseException; import java.util.ArrayList; import java.util.Arrays; @@ -60,53 +64,41 @@ public class GCMap { // {"name":"HP: Hannover - Sahlkamp","gc":"GC2Q97X","g":"a09149ca-00e0-4aa2-b332-db2b4dfb18d2","available":true,"archived":false,"subrOnly":false,"li":false,"fp":"0","difficulty":{"text":1.0,"value":"1"},"terrain":{"text":1.5,"value":"1_5"},"hidden":"5/29/2011","container":{"text":"Small","value":"small.gif"},"type":{"text":"Traditional Cache","value":2},"owner":{"text":"GeoM@n","value":"1deaa69e-6bcc-421d-95a1-7d32b468cb82"}}] // } - final JSONObject json = new JSONObject(data); - final String status = json.getString("status"); + final ObjectNode json = (ObjectNode) JsonUtils.reader.readTree(data); + final String status = json.path("status").asText(); if (StringUtils.isBlank(status)) { - - throw new JSONException("No status inside JSON"); + throw new ParserException("No status inside JSON"); } if ("success".compareTo(status) != 0) { - throw new JSONException("Wrong status inside JSON"); + throw new ParserException("Wrong status inside JSON"); } - final JSONArray dataArray = json.getJSONArray("data"); + final ArrayNode dataArray = (ArrayNode) json.get("data"); if (dataArray == null) { - throw new JSONException("No data inside JSON"); + throw new ParserException("No data inside JSON"); } final ArrayList<Geocache> caches = new ArrayList<>(); - for (int j = 0; j < dataArray.length(); j++) { + for (final JsonNode dataObject: dataArray) { final Geocache cache = new Geocache(); - - JSONObject dataObject = dataArray.getJSONObject(j); - cache.setName(dataObject.getString("name")); - cache.setGeocode(dataObject.getString("gc")); - cache.setGuid(dataObject.getString("g")); // 34c2e609-5246-4f91-9029-d6c02b0f2a82" - cache.setDisabled(!dataObject.getBoolean("available")); - cache.setArchived(dataObject.getBoolean("archived")); - cache.setPremiumMembersOnly(dataObject.getBoolean("subrOnly")); + cache.setName(dataObject.path("name").asText()); + cache.setGeocode(dataObject.path("gc").asText()); + cache.setGuid(dataObject.path("g").asText()); // 34c2e609-5246-4f91-9029-d6c02b0f2a82" + cache.setDisabled(!dataObject.path("available").asBoolean()); + cache.setArchived(dataObject.path("archived").asBoolean()); + cache.setPremiumMembersOnly(dataObject.path("subrOnly").asBoolean()); // "li" seems to be "false" always - cache.setFavoritePoints(Integer.parseInt(dataObject.getString("fp"))); - JSONObject difficultyObj = dataObject.getJSONObject("difficulty"); - cache.setDifficulty(Float.parseFloat(difficultyObj.getString("text"))); // 3.5 - JSONObject terrainObj = dataObject.getJSONObject("terrain"); - cache.setTerrain(Float.parseFloat(terrainObj.getString("text"))); // 1.5 - cache.setHidden(GCLogin.parseGcCustomDate(dataObject.getString("hidden"), "MM/dd/yyyy")); // 7/23/2001 - JSONObject containerObj = dataObject.getJSONObject("container"); - cache.setSize(CacheSize.getById(containerObj.getString("text"))); // Regular - JSONObject typeObj = dataObject.getJSONObject("type"); - cache.setType(CacheType.getByPattern(typeObj.getString("text"))); // Traditional Cache - JSONObject ownerObj = dataObject.getJSONObject("owner"); - cache.setOwnerDisplayName(ownerObj.getString("text")); + cache.setFavoritePoints(Integer.parseInt(dataObject.path("fp").asText())); + cache.setDifficulty(Float.parseFloat(dataObject.path("difficulty").path("text").asText())); // 3.5 + cache.setTerrain(Float.parseFloat(dataObject.path("terrain").path("text").asText())); // 1.5 + cache.setHidden(GCLogin.parseGcCustomDate(dataObject.path("hidden").asText(), "MM/dd/yyyy")); // 7/23/2001 + cache.setSize(CacheSize.getById(dataObject.path("container").path("text").asText())); // Regular + cache.setType(CacheType.getByPattern(dataObject.path("type").path("text").asText())); // Traditional Cache + cache.setOwnerDisplayName(dataObject.path("owner").path("text").asText()); caches.add(cache); } result.addAndPutInCache(caches); - } catch (JSONException e) { - result.setError(StatusCode.UNKNOWN_ERROR); - } catch (ParseException e) { - result.setError(StatusCode.UNKNOWN_ERROR); - } catch (NumberFormatException e) { + } catch (ParserException | ParseException | IOException | NumberFormatException ignore) { result.setError(StatusCode.UNKNOWN_ERROR); } return result; @@ -125,7 +117,7 @@ public class GCMap { final LeastRecentlyUsedMap<String, String> nameCache = new LeastRecentlyUsedMap.LruCache<>(2000); // JSON id, cache name if (StringUtils.isEmpty(data)) { - throw new JSONException("No page given"); + throw new ParserException("No page given"); } // Example JSON information @@ -134,34 +126,33 @@ public class GCMap { // "data":{"55_55":[{"i":"gEaR","n":"Spiel & Sport"}],"55_54":[{"i":"gEaR","n":"Spiel & Sport"}],"17_25":[{"i":"Rkzt","n":"EDSSW: Rathaus "}],"55_53":[{"i":"gEaR","n":"Spiel & Sport"}],"17_27":[{"i":"Rkzt","n":"EDSSW: Rathaus "}],"17_26":[{"i":"Rkzt","n":"EDSSW: Rathaus "}],"57_53":[{"i":"gEaR","n":"Spiel & Sport"}],"57_55":[{"i":"gEaR","n":"Spiel & Sport"}],"3_62":[{"i":"gOWz","n":"Baumarktserie - Wer Wo Was -"}],"3_61":[{"i":"gOWz","n":"Baumarktserie - Wer Wo Was -"}],"57_54":[{"i":"gEaR","n":"Spiel & Sport"}],"3_60":[{"i":"gOWz","n":"Baumarktserie - Wer Wo Was -"}],"15_27":[{"i":"Rkzt","n":"EDSSW: Rathaus "}],"15_26":[{"i":"Rkzt","n":"EDSSW: Rathaus "}],"15_25":[{"i":"Rkzt","n":"EDSSW: Rathaus "}],"4_60":[{"i":"gOWz","n":"Baumarktserie - Wer Wo Was -"}],"4_61":[{"i":"gOWz","n":"Baumarktserie - Wer Wo Was -"}],"4_62":[{"i":"gOWz","n":"Baumarktserie - Wer Wo Was -"}],"16_25":[{"i":"Rkzt","n":"EDSSW: Rathaus "}],"16_26":[{"i":"Rkzt","n":"EDSSW: Rathaus "}],"16_27":[{"i":"Rkzt","n":"EDSSW: Rathaus "}],"2_62":[{"i":"gOWz","n":"Baumarktserie - Wer Wo Was -"}],"2_60":[{"i":"gOWz","n":"Baumarktserie - Wer Wo Was -"}],"2_61":[{"i":"gOWz","n":"Baumarktserie - Wer Wo Was -"}],"56_53":[{"i":"gEaR","n":"Spiel & Sport"}],"56_54":[{"i":"gEaR","n":"Spiel & Sport"}],"56_55":[{"i":"gEaR","n":"Spiel & Sport"}]} // } - final JSONObject json = new JSONObject(data); + final ObjectNode json = (ObjectNode) JsonUtils.reader.readTree(data); - final JSONArray grid = json.getJSONArray("grid"); - if (grid == null || grid.length() != (UTFGrid.GRID_MAXY + 1)) { - throw new JSONException("No grid inside JSON"); + final ArrayNode grid = (ArrayNode) json.get("grid"); + if (grid == null || grid.size() != (UTFGrid.GRID_MAXY + 1)) { + throw new ParserException("No grid inside JSON"); } - final JSONArray keys = json.getJSONArray("keys"); + final ArrayNode keys = (ArrayNode) json.get("keys"); if (keys == null) { - throw new JSONException("No keys inside JSON"); + throw new ParserException("No keys inside JSON"); } - final JSONObject dataObject = json.getJSONObject("data"); + final ObjectNode dataObject = (ObjectNode) json.get("data"); if (dataObject == null) { - throw new JSONException("No data inside JSON"); + throw new ParserException("No data inside JSON"); } // iterate over the data and construct all caches in this tile Map<String, List<UTFGridPosition>> positions = new HashMap<>(); // JSON id as key Map<String, List<UTFGridPosition>> singlePositions = new HashMap<>(); // JSON id as key - for (int i = 1; i < keys.length(); i++) { // index 0 is empty - String key = keys.getString(i); - if (StringUtils.isNotBlank(key)) { + for (final JsonNode rawKey: keys) { + final String key = rawKey.asText(); + if (StringUtils.isNotBlank(key)) { // index 0 is empty UTFGridPosition pos = UTFGridPosition.fromString(key); - JSONArray dataForKey = dataObject.getJSONArray(key); - for (int j = 0; j < dataForKey.length(); j++) { - JSONObject cacheInfo = dataForKey.getJSONObject(j); - String id = cacheInfo.getString("i"); - nameCache.put(id, cacheInfo.getString("n")); + final ArrayNode dataForKey = (ArrayNode) dataObject.get(key); + for (final JsonNode cacheInfo: dataForKey) { + final String id = cacheInfo.get("i").asText(); + nameCache.put(id, cacheInfo.get("n").asText()); List<UTFGridPosition> listOfPositions = positions.get(id); List<UTFGridPosition> singleListOfPositions = singlePositions.get(id); @@ -174,7 +165,7 @@ public class GCMap { } listOfPositions.add(pos); - if (dataForKey.length() == 1) { + if (dataForKey.size() == 1) { singleListOfPositions.add(pos); } @@ -220,9 +211,7 @@ public class GCMap { searchResult.addAndPutInCache(caches); Log.d("Retrieved " + searchResult.getCount() + " caches for tile " + tile.toString()); - } catch (RuntimeException e) { - Log.e("GCMap.parseMapJSON", e); - } catch (JSONException e) { + } catch (RuntimeException | ParserException | IOException e) { Log.e("GCMap.parseMapJSON", e); } diff --git a/main/src/cgeo/geocaching/connector/gc/GCParser.java b/main/src/cgeo/geocaching/connector/gc/GCParser.java index 60d7856..2b3aa11 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCParser.java +++ b/main/src/cgeo/geocaching/connector/gc/GCParser.java @@ -30,6 +30,7 @@ import cgeo.geocaching.network.Parameters; import cgeo.geocaching.settings.Settings; import cgeo.geocaching.ui.DirectionImage; import cgeo.geocaching.utils.CancellableHandler; +import cgeo.geocaching.utils.JsonUtils; import cgeo.geocaching.utils.Log; import cgeo.geocaching.utils.MatcherWrapper; import cgeo.geocaching.utils.RxUtils; @@ -38,15 +39,16 @@ import cgeo.geocaching.utils.TextUtils; import ch.boye.httpclientandroidlib.HttpResponse; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; + import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringEscapeUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; import rx.Observable; import rx.Observable.OnSubscribe; @@ -59,6 +61,7 @@ import android.net.Uri; import android.text.Html; import java.io.File; +import java.io.IOException; import java.text.ParseException; import java.util.ArrayList; import java.util.Calendar; @@ -125,12 +128,12 @@ public abstract class GCParser { page = page.substring(startPos + 1, endPos - startPos + 1); // cut between <table> and </table> - final String[] rows = page.split("<tr class="); - final int rows_count = rows.length; + final String[] rows = StringUtils.splitByWholeSeparator(page, "<tr class="); + final int rowsCount = rows.length; int excludedCaches = 0; final ArrayList<Geocache> caches = new ArrayList<>(); - for (int z = 1; z < rows_count; z++) { + for (int z = 1; z < rowsCount; z++) { final Geocache cache = new Geocache(); final String row = rows[z]; @@ -161,7 +164,7 @@ public abstract class GCParser { } } catch (final RuntimeException e) { // failed to parse GUID and/or Disabled - Log.w("GCParser.parseSearch: Failed to parse GUID and/or Disabled data"); + Log.w("GCParser.parseSearch: Failed to parse GUID and/or Disabled data", e); } if (Settings.isExcludeDisabledCaches() && (cache.isDisabled() || cache.isArchived())) { @@ -211,12 +214,12 @@ public abstract class GCParser { final String dateHidden = TextUtils.getMatch(row, GCConstants.PATTERN_SEARCH_HIDDEN_DATE, false, 1, null, false); if (StringUtils.isNotBlank(dateHidden)) { try { - Date date = GCLogin.parseGcCustomDate(dateHidden); + final Date date = GCLogin.parseGcCustomDate(dateHidden); if (date != null) { cache.setHidden(date); } - } catch (ParseException e) { - Log.e("Error parsing event date from search"); + } catch (final ParseException e) { + Log.e("Error parsing event date from search", e); } } @@ -266,7 +269,7 @@ public abstract class GCParser { cache.setFavoritePoints(Integer.parseInt(result)); } } catch (final NumberFormatException e) { - Log.w("GCParser.parseSearch: Failed to parse favorite count"); + Log.w("GCParser.parseSearch: Failed to parse favorite count", e); } caches.add(cache); @@ -280,7 +283,7 @@ public abstract class GCParser { searchResult.setTotalCountGC(Integer.parseInt(result) - excludedCaches); } } catch (final NumberFormatException e) { - Log.w("GCParser.parseSearch: Failed to parse cache count"); + Log.w("GCParser.parseSearch: Failed to parse cache count", e); } String recaptchaText = null; @@ -380,10 +383,12 @@ public abstract class GCParser { * Parse cache from text and return either an error code or a cache object in a pair. Note that inline logs are * not parsed nor saved, while the cache itself is. * - * @param pageIn the page text to parse - * @param handler the handler to send the progress notifications to - * @return a pair, with a {@link StatusCode} on the left, and a non-nulll cache objet on the right - * iff the status code is {@link StatusCode.NO_ERROR}. + * @param pageIn + * the page text to parse + * @param handler + * the handler to send the progress notifications to + * @return a pair, with a {@link StatusCode} on the left, and a non-null cache object on the right + * iff the status code is {@link StatusCode.NO_ERROR}. */ static private ImmutablePair<StatusCode, Geocache> parseCacheFromText(final String pageIn, @Nullable final CancellableHandler handler) { CancellableHandler.sendLoadProgressDetail(handler, R.string.cache_dialog_loading_details_status_details); @@ -408,7 +413,7 @@ public abstract class GCParser { // first handle the content with line breaks, then trim everything for easier matching and reduced memory consumption in parsed fields String personalNoteWithLineBreaks = ""; - MatcherWrapper matcher = new MatcherWrapper(GCConstants.PATTERN_PERSONALNOTE, pageIn); + final MatcherWrapper matcher = new MatcherWrapper(GCConstants.PATTERN_PERSONALNOTE, pageIn); if (matcher.find()) { personalNoteWithLineBreaks = matcher.group(1).trim(); } @@ -490,7 +495,7 @@ public abstract class GCParser { } } catch (final ParseException e) { // failed to parse cache hidden date - Log.w("GCParser.parseCache: Failed to parse cache hidden (event) date"); + Log.w("GCParser.parseCache: Failed to parse cache hidden (event) date", e); } // favorite @@ -579,7 +584,7 @@ public abstract class GCParser { } } catch (final RuntimeException e) { // failed to parse cache attributes - Log.w("GCParser.parseCache: Failed to parse cache attributes"); + Log.w("GCParser.parseCache: Failed to parse cache attributes", e); } // cache spoilers @@ -608,7 +613,7 @@ public abstract class GCParser { } } catch (final RuntimeException e) { // failed to parse cache spoilers - Log.w("GCParser.parseCache: Failed to parse cache spoilers"); + Log.w("GCParser.parseCache: Failed to parse cache spoilers", e); } // cache inventory @@ -642,7 +647,7 @@ public abstract class GCParser { } } catch (final RuntimeException e) { // failed to parse cache inventory - Log.w("GCParser.parseCache: Failed to parse cache inventory (2)"); + Log.w("GCParser.parseCache: Failed to parse cache inventory (2)", e); } // cache logs counts @@ -664,7 +669,7 @@ public abstract class GCParser { } } catch (final NumberFormatException e) { // failed to parse logs - Log.w("GCParser.parseCache: Failed to parse cache log count"); + Log.w("GCParser.parseCache: Failed to parse cache log count", e); } // waypoints - reset collection @@ -680,7 +685,7 @@ public abstract class GCParser { cache.addOrChangeWaypoint(waypoint, false); cache.setUserModifiedCoords(true); } - } catch (final Geopoint.GeopointException e) { + } catch (final Geopoint.GeopointException ignored) { } int wpBegin = page.indexOf("<table class=\"Table\" id=\"ctl00_ContentBody_Waypoints\">"); @@ -707,10 +712,10 @@ public abstract class GCParser { wpList = wpList.substring(wpBegin + 7, wpEnd); } - final String[] wpItems = wpList.split("<tr"); + final String[] wpItems = StringUtils.splitByWholeSeparator(wpList, "<tr"); for (int j = 1; j < wpItems.length; j++) { - String[] wp = wpItems[j].split("<td"); + String[] wp = StringUtils.splitByWholeSeparator(wpItems[j], "<td"); // waypoint name // res is null during the unit tests @@ -736,7 +741,7 @@ public abstract class GCParser { j++; if (wpItems.length > j) { - wp = wpItems[j].split("<td"); + wp = StringUtils.splitByWholeSeparator(wpItems[j], "<td"); } // waypoint note @@ -762,7 +767,7 @@ public abstract class GCParser { return StringUtils.replaceChars(numberWithPunctuation, ".,", ""); } - public static SearchResult searchByNextPage(final SearchResult search, boolean showCaptcha, RecaptchaReceiver recaptchaReceiver) { + public static SearchResult searchByNextPage(final SearchResult search, final boolean showCaptcha, final RecaptchaReceiver recaptchaReceiver) { if (search == null) { return null; } @@ -845,7 +850,7 @@ public abstract class GCParser { * @return */ @Nullable - private static SearchResult searchByAny(final CacheType cacheType, final boolean my, final boolean showCaptcha, final Parameters params, RecaptchaReceiver recaptchaReceiver) { + private static SearchResult searchByAny(final CacheType cacheType, final boolean my, final boolean showCaptcha, final Parameters params, final RecaptchaReceiver recaptchaReceiver) { insertCacheType(params, cacheType); final String uri = "http://www.geocaching.com/seek/nearest.aspx"; @@ -871,12 +876,12 @@ public abstract class GCParser { return search; } - public static SearchResult searchByCoords(final @NonNull Geopoint coords, final CacheType cacheType, final boolean showCaptcha, RecaptchaReceiver recaptchaReceiver) { + public static SearchResult searchByCoords(final @NonNull Geopoint coords, final CacheType cacheType, final boolean showCaptcha, final RecaptchaReceiver recaptchaReceiver) { final Parameters params = new Parameters("lat", Double.toString(coords.getLatitude()), "lng", Double.toString(coords.getLongitude())); return searchByAny(cacheType, false, showCaptcha, params, recaptchaReceiver); } - public static SearchResult searchByKeyword(final @NonNull String keyword, final CacheType cacheType, final boolean showCaptcha, RecaptchaReceiver recaptchaReceiver) { + public static SearchResult searchByKeyword(final @NonNull String keyword, final CacheType cacheType, final boolean showCaptcha, final RecaptchaReceiver recaptchaReceiver) { if (StringUtils.isBlank(keyword)) { Log.e("GCParser.searchByKeyword: No keyword given"); return null; @@ -894,7 +899,7 @@ public abstract class GCParser { return false; } - public static SearchResult searchByUsername(final String userName, final CacheType cacheType, final boolean showCaptcha, RecaptchaReceiver recaptchaReceiver) { + public static SearchResult searchByUsername(final String userName, final CacheType cacheType, final boolean showCaptcha, final RecaptchaReceiver recaptchaReceiver) { if (StringUtils.isBlank(userName)) { Log.e("GCParser.searchByUsername: No user name given"); return null; @@ -905,7 +910,7 @@ public abstract class GCParser { return searchByAny(cacheType, isSearchForMyCaches(userName), showCaptcha, params, recaptchaReceiver); } - public static SearchResult searchByPocketQuery(final String pocketGuid, final CacheType cacheType, final boolean showCaptcha, RecaptchaReceiver recaptchaReceiver) { + public static SearchResult searchByPocketQuery(final String pocketGuid, final CacheType cacheType, final boolean showCaptcha, final RecaptchaReceiver recaptchaReceiver) { if (StringUtils.isBlank(pocketGuid)) { Log.e("GCParser.searchByPocket: No guid name given"); return null; @@ -916,7 +921,7 @@ public abstract class GCParser { return searchByAny(cacheType, false, showCaptcha, params, recaptchaReceiver); } - public static SearchResult searchByOwner(final String userName, final CacheType cacheType, final boolean showCaptcha, RecaptchaReceiver recaptchaReceiver) { + public static SearchResult searchByOwner(final String userName, final CacheType cacheType, final boolean showCaptcha, final RecaptchaReceiver recaptchaReceiver) { if (StringUtils.isBlank(userName)) { Log.e("GCParser.searchByOwner: No user name given"); return null; @@ -926,32 +931,28 @@ public abstract class GCParser { return searchByAny(cacheType, isSearchForMyCaches(userName), showCaptcha, params, recaptchaReceiver); } - public static SearchResult searchByAddress(final String address, final CacheType cacheType, final boolean showCaptcha, RecaptchaReceiver recaptchaReceiver) { + public static SearchResult searchByAddress(final String address, final CacheType cacheType, final boolean showCaptcha, final RecaptchaReceiver recaptchaReceiver) { if (StringUtils.isBlank(address)) { Log.e("GCParser.searchByAddress: No address given"); return null; } - try { - final JSONObject response = Network.requestJSON("http://www.geocaching.com/api/geocode", new Parameters("q", address)); - if (response == null) { - return null; - } - if (!StringUtils.equalsIgnoreCase(response.getString("status"), "success")) { - return null; - } - if (!response.has("data")) { - return null; - } - final JSONObject data = response.getJSONObject("data"); - if (data == null) { - return null; - } - return searchByCoords(new Geopoint(data.getDouble("lat"), data.getDouble("lng")), cacheType, showCaptcha, recaptchaReceiver); - } catch (final JSONException e) { - Log.w("GCParser.searchByAddress", e); + + final ObjectNode response = Network.requestJSON("http://www.geocaching.com/api/geocode", new Parameters("q", address)); + if (response == null) { + return null; } - return null; + if (!StringUtils.equalsIgnoreCase(response.path("status").asText(), "success")) { + return null; + } + + final JsonNode data = response.path("data"); + final JsonNode latNode = data.get("lat"); + final JsonNode lngNode = data.get("lng"); + if (latNode == null || lngNode == null) { + return null; + } + return searchByCoords(new Geopoint(latNode.asDouble(), lngNode.asDouble()), cacheType, showCaptcha, recaptchaReceiver); } @Nullable @@ -1001,13 +1002,13 @@ public abstract class GCParser { return null; } - String subPage = StringUtils.substringAfter(page, "class=\"PocketQueryListTable"); + final String subPage = StringUtils.substringAfter(page, "class=\"PocketQueryListTable"); if (StringUtils.isEmpty(subPage)) { Log.e("GCParser.searchPocketQueryList: class \"PocketQueryListTable\" not found on page"); return Collections.emptyList(); } - List<PocketQueryList> list = new ArrayList<>(); + final List<PocketQueryList> list = new ArrayList<>(); final MatcherWrapper matcherPocket = new MatcherWrapper(GCConstants.PATTERN_LIST_PQ, subPage); @@ -1015,7 +1016,7 @@ public abstract class GCParser { int maxCaches; try { maxCaches = Integer.parseInt(matcherPocket.group(1)); - } catch (NumberFormatException e) { + } catch (final NumberFormatException e) { maxCaches = 0; Log.e("GCParser.searchPocketQueryList: Unable to parse max caches", e); } @@ -1029,7 +1030,7 @@ public abstract class GCParser { Collections.sort(list, new Comparator<PocketQueryList>() { @Override - public int compare(PocketQueryList left, PocketQueryList right) { + public int compare(final PocketQueryList left, final PocketQueryList right) { return String.CASE_INSENSITIVE_ORDER.compare(left.getName(), right.getName()); } }); @@ -1483,7 +1484,7 @@ public abstract class GCParser { } } catch (final RuntimeException e) { // failed to parse trackable owner name - Log.w("GCParser.parseTrackable: Failed to parse trackable owner name"); + Log.w("GCParser.parseTrackable: Failed to parse trackable owner name", e); } // trackable origin @@ -1514,7 +1515,7 @@ public abstract class GCParser { } } catch (final RuntimeException e) { // failed to parse trackable last known place - Log.w("GCParser.parseTrackable: Failed to parse trackable last known place"); + Log.w("GCParser.parseTrackable: Failed to parse trackable last known place", e); } // released date - can be missing on the page @@ -1522,12 +1523,12 @@ public abstract class GCParser { if (releaseString != null) { try { trackable.setReleased(dateTbIn1.parse(releaseString)); - } catch (ParseException e) { + } catch (final ParseException ignore) { if (trackable.getReleased() == null) { try { trackable.setReleased(dateTbIn2.parse(releaseString)); - } catch (ParseException e1) { - Log.e("Could not parse trackable release " + releaseString); + } catch (final ParseException e) { + Log.e("Could not parse trackable release " + releaseString, e); } } } @@ -1563,7 +1564,7 @@ public abstract class GCParser { } } catch (final RuntimeException e) { // failed to parse trackable details & image - Log.w("GCParser.parseTrackable: Failed to parse trackable details & image"); + Log.w("GCParser.parseTrackable: Failed to parse trackable details & image", e); } if (StringUtils.isEmpty(trackable.getDetails()) && page.contains(GCConstants.ERROR_TB_NOT_ACTIVATED)) { trackable.setDetails(CgeoApplication.getInstance().getString(R.string.trackable_not_activated)); @@ -1585,7 +1586,7 @@ public abstract class GCParser { long date = 0; try { date = GCLogin.parseGcCustomDate(matcherLogs.group(2)).getTime(); - } catch (final ParseException e) { + } catch (final ParseException ignore) { } final LogEntry logDone = new LogEntry( @@ -1630,7 +1631,7 @@ public abstract class GCParser { return trackable; } - private static String convertLinks(String input) { + private static String convertLinks(final String input) { if (input == null) { return null; } @@ -1657,7 +1658,7 @@ public abstract class GCParser { final String paramName; - SpecialLogs(String paramName) { + SpecialLogs(final String paramName) { this.paramName = paramName; } @@ -1702,7 +1703,7 @@ public abstract class GCParser { Log.e("GCParser.loadLogsFromDetails: error " + statusCode + " when requesting log information"); return Observable.empty(); } - String rawResponse = Network.getResponseData(response); + final String rawResponse = Network.getResponseData(response); if (rawResponse == null) { Log.e("GCParser.loadLogsFromDetails: unable to read whole response"); return Observable.empty(); @@ -1723,56 +1724,51 @@ public abstract class GCParser { } try { - final JSONObject resp = new JSONObject(rawResponse); - if (!resp.getString("status").equals("success")) { - Log.e("GCParser.loadLogsFromDetails: status is " + resp.getString("status")); + final ObjectNode resp = (ObjectNode) JsonUtils.reader.readTree(rawResponse); + if (!resp.path("status").asText().equals("success")) { + Log.e("GCParser.loadLogsFromDetails: status is " + resp.path("status").asText("[absent]")); subscriber.onCompleted(); return; } - final JSONArray data = resp.getJSONArray("data"); - - for (int index = 0; index < data.length(); index++) { - final JSONObject entry = data.getJSONObject(index); - + final ArrayNode data = (ArrayNode) resp.get("data"); + for (final JsonNode entry: data) { // FIXME: use the "LogType" field instead of the "LogTypeImage" one. - final String logIconNameExt = entry.optString("LogTypeImage", ".gif"); + final String logIconNameExt = entry.path("LogTypeImage").asText(".gif"); final String logIconName = logIconNameExt.substring(0, logIconNameExt.length() - 4); long date = 0; try { - date = GCLogin.parseGcCustomDate(entry.getString("Visited")).getTime(); - } catch (final ParseException e) { - Log.e("GCParser.loadLogsFromDetails: failed to parse log date."); + date = GCLogin.parseGcCustomDate(entry.get("Visited").asText()).getTime(); + } catch (ParseException | NullPointerException e) { + Log.e("GCParser.loadLogsFromDetails: failed to parse log date", e); } // TODO: we should update our log data structure to be able to record // proper coordinates, and make them clickable. In the meantime, it is // better to integrate those coordinates into the text rather than not // display them at all. - final String latLon = entry.getString("LatLonString"); - final String logText = (StringUtils.isEmpty(latLon) ? "" : (latLon + "<br/><br/>")) + TextUtils.removeControlCharacters(entry.getString("LogText")); + final String latLon = entry.path("LatLonString").asText(); + final String logText = (StringUtils.isEmpty(latLon) ? "" : (latLon + "<br/><br/>")) + TextUtils.removeControlCharacters(entry.path("LogText").asText()); final LogEntry logDone = new LogEntry( - TextUtils.removeControlCharacters(entry.getString("UserName")), + TextUtils.removeControlCharacters(entry.path("UserName").asText()), date, LogType.getByIconName(logIconName), logText); - logDone.found = entry.getInt("GeocacheFindCount"); + logDone.found = entry.path("GeocacheFindCount").asInt(); logDone.friend = markAsFriendsLog; - final JSONArray images = entry.getJSONArray("Images"); - for (int i = 0; i < images.length(); i++) { - final JSONObject image = images.getJSONObject(i); - final String url = "http://imgcdn.geocaching.com/cache/log/large/" + image.getString("FileName"); - final String title = TextUtils.removeControlCharacters(image.getString("Name")); + final ArrayNode images = (ArrayNode) entry.get("Images"); + for (final JsonNode image: images) { + final String url = "http://imgcdn.geocaching.com/cache/log/large/" + image.path("FileName").asText(); + final String title = TextUtils.removeControlCharacters(image.path("Name").asText()); final Image logImage = new Image(url, title); logDone.addLogImage(logImage); } subscriber.onNext(logDone); } - } catch (final JSONException e) { - // failed to parse logs + } catch (final IOException e) { Log.w("GCParser.loadLogsFromDetails: Failed to parse cache logs", e); } subscriber.onCompleted(); @@ -1781,7 +1777,7 @@ public abstract class GCParser { } @NonNull - public static List<LogType> parseTypes(String page) { + public static List<LogType> parseTypes(final String page) { if (StringUtils.isEmpty(page)) { return Collections.emptyList(); } @@ -1934,75 +1930,62 @@ public abstract class GCParser { } } - public static boolean uploadModifiedCoordinates(Geocache cache, Geopoint wpt) { + public static boolean uploadModifiedCoordinates(final Geocache cache, final Geopoint wpt) { return editModifiedCoordinates(cache, wpt); } - public static boolean deleteModifiedCoordinates(Geocache cache) { + public static boolean deleteModifiedCoordinates(final Geocache cache) { return editModifiedCoordinates(cache, null); } - public static boolean editModifiedCoordinates(Geocache cache, Geopoint wpt) { + public static boolean editModifiedCoordinates(final Geocache cache, final Geopoint wpt) { final String userToken = getUserToken(cache); if (StringUtils.isEmpty(userToken)) { return false; } - try { - JSONObject jo; - if (wpt != null) { - jo = new JSONObject().put("dto", (new JSONObject().put("ut", userToken) - .put("data", new JSONObject() - .put("lat", wpt.getLatitudeE6() / 1E6) - .put("lng", wpt.getLongitudeE6() / 1E6)))); - } else { - jo = new JSONObject().put("dto", (new JSONObject().put("ut", userToken))); - } - - final String uriSuffix = wpt != null ? "SetUserCoordinate" : "ResetUserCoordinate"; + final ObjectNode jo = new ObjectNode(JsonUtils.factory); + final ObjectNode dto = jo.putObject("dto").put("ut", userToken); + if (wpt != null) { + dto.putObject("data").put("lat", wpt.getLatitudeE6() / 1E6).put("lng", wpt.getLongitudeE6() / 1E6); + } - final String uriPrefix = "http://www.geocaching.com/seek/cache_details.aspx/"; - final HttpResponse response = Network.postJsonRequest(uriPrefix + uriSuffix, jo); - Log.i("Sending to " + uriPrefix + uriSuffix + " :" + jo.toString()); + final String uriSuffix = wpt != null ? "SetUserCoordinate" : "ResetUserCoordinate"; - if (response != null && response.getStatusLine().getStatusCode() == 200) { - Log.i("GCParser.editModifiedCoordinates - edited on GC.com"); - return true; - } + final String uriPrefix = "http://www.geocaching.com/seek/cache_details.aspx/"; + final HttpResponse response = Network.postJsonRequest(uriPrefix + uriSuffix, jo); + Log.i("Sending to " + uriPrefix + uriSuffix + " :" + jo.toString()); - } catch (final JSONException e) { - Log.e("Unknown exception with json wrap code", e); + if (response != null && response.getStatusLine().getStatusCode() == 200) { + Log.i("GCParser.editModifiedCoordinates - edited on GC.com"); + return true; } + Log.e("GCParser.deleteModifiedCoordinates - cannot delete modified coords"); return false; } - public static boolean uploadPersonalNote(Geocache cache) { + public static boolean uploadPersonalNote(final Geocache cache) { final String userToken = getUserToken(cache); if (StringUtils.isEmpty(userToken)) { return false; } - try { - final JSONObject jo = new JSONObject() - .put("dto", (new JSONObject() - .put("et", cache.getPersonalNote()) - .put("ut", userToken))); + final ObjectNode jo = new ObjectNode(JsonUtils.factory).putObject("dto") + .put("et", cache.getPersonalNote()) + .put("ut", userToken); - final String uriSuffix = "SetUserCacheNote"; + final String uriSuffix = "SetUserCacheNote"; - final String uriPrefix = "http://www.geocaching.com/seek/cache_details.aspx/"; - final HttpResponse response = Network.postJsonRequest(uriPrefix + uriSuffix, jo); - Log.i("Sending to " + uriPrefix + uriSuffix + " :" + jo.toString()); + final String uriPrefix = "http://www.geocaching.com/seek/cache_details.aspx/"; + final HttpResponse response = Network.postJsonRequest(uriPrefix + uriSuffix, jo); + Log.i("Sending to " + uriPrefix + uriSuffix + " :" + jo.toString()); - if (response != null && response.getStatusLine().getStatusCode() == 200) { - Log.i("GCParser.uploadPersonalNote - uploaded to GC.com"); - return true; - } - - } catch (final JSONException e) { - Log.e("Unknown exception with json wrap code", e); + if (response != null && response.getStatusLine().getStatusCode() == 200) { + Log.i("GCParser.uploadPersonalNote - uploaded to GC.com"); + return true; } + Log.e("GCParser.uploadPersonalNote - cannot upload personal note"); return false; } diff --git a/main/src/cgeo/geocaching/connector/gc/Tile.java b/main/src/cgeo/geocaching/connector/gc/Tile.java index 18fe65c..ff13fe3 100644 --- a/main/src/cgeo/geocaching/connector/gc/Tile.java +++ b/main/src/cgeo/geocaching/connector/gc/Tile.java @@ -56,11 +56,11 @@ public class Tile { private final int zoomLevel; private final Viewport viewPort; - public Tile(Geopoint origin, int zoomlevel) { + public Tile(final Geopoint origin, final int zoomlevel) { this(calcX(origin, clippedZoomlevel(zoomlevel)), calcY(origin, clippedZoomlevel(zoomlevel)), clippedZoomlevel(zoomlevel)); } - private Tile(int tileX, int tileY, int zoomlevel) { + private Tile(final int tileX, final int tileY, final int zoomlevel) { this.zoomLevel = clippedZoomlevel(zoomlevel); @@ -74,7 +74,7 @@ public class Tile { return zoomLevel; } - private static int clippedZoomlevel(int zoomlevel) { + private static int clippedZoomlevel(final int zoomlevel) { return Math.max(Math.min(zoomlevel, ZOOMLEVEL_MAX), ZOOMLEVEL_MIN); } @@ -95,7 +95,7 @@ public class Tile { */ private static int calcY(final Geopoint origin, final int zoomlevel) { // Optimization from Bing - double sinLatRad = Math.sin(Math.toRadians(origin.getLatitude())); + final double sinLatRad = Math.sin(Math.toRadians(origin.getLatitude())); // The cut of the fractional part instead of rounding to the nearest integer is intentional and part of the algorithm return (int) ((0.5 - Math.log((1 + sinLatRad) / (1 - sinLatRad)) / (4 * Math.PI)) * NUMBER_OF_TILES[zoomlevel]); } @@ -115,13 +115,13 @@ public class Tile { * href="http://developers.cloudmade.com/projects/tiles/examples/convert-coordinates-to-tile-numbers">Cloudmade</a> */ @NonNull - public Geopoint getCoord(UTFGridPosition pos) { + public Geopoint getCoord(final UTFGridPosition pos) { - double pixX = tileX * TILE_SIZE + pos.x * 4; - double pixY = tileY * TILE_SIZE + pos.y * 4; + final double pixX = tileX * TILE_SIZE + pos.x * 4; + final double pixY = tileY * TILE_SIZE + pos.y * 4; - double lonDeg = ((360.0 * pixX) / NUMBER_OF_PIXELS[this.zoomLevel]) - 180.0; - double latRad = Math.atan(Math.sinh(Math.PI * (1 - 2 * pixY / NUMBER_OF_PIXELS[this.zoomLevel]))); + final double lonDeg = ((360.0 * pixX) / NUMBER_OF_PIXELS[this.zoomLevel]) - 180.0; + final double latRad = Math.atan(Math.sinh(Math.PI * (1 - 2 * pixY / NUMBER_OF_PIXELS[this.zoomLevel]))); return new Geopoint(Math.toDegrees(latRad), lonDeg); } @@ -153,8 +153,8 @@ public class Tile { / Math.log(2) ); - Tile tileLeft = new Tile(left, zoom); - Tile tileRight = new Tile(right, zoom); + final Tile tileLeft = new Tile(left, zoom); + final Tile tileRight = new Tile(right, zoom); if (Math.abs(tileLeft.tileX - tileRight.tileX) < (numberOfTiles - 1)) { zoom += 1; @@ -190,8 +190,8 @@ public class Tile { ) / Math.log(2) ); - Tile tileBottom = new Tile(bottom, zoom); - Tile tileTop = new Tile(top, zoom); + final Tile tileBottom = new Tile(bottom, zoom); + final Tile tileTop = new Tile(top, zoom); if (Math.abs(tileBottom.tileY - tileTop.tileY) > (numberOfTiles - 1)) { zoom -= 1; @@ -200,7 +200,7 @@ public class Tile { return Math.min(zoom, ZOOMLEVEL_MAX); } - private static double tanGrad(double angleGrad) { + private static double tanGrad(final double angleGrad) { return Math.tan(angleGrad / 180.0 * Math.PI); } @@ -211,12 +211,12 @@ public class Tile { * @param x * @return */ - private static double asinh(double x) { + private static double asinh(final double x) { return Math.log(x + Math.sqrt(x * x + 1.0)); } @Override - public boolean equals(Object o) { + public boolean equals(final Object o) { if (this == o) { return true; } @@ -260,7 +260,7 @@ public class Tile { public Bitmap call() { try { return response != null ? BitmapFactory.decodeStream(response.getEntity().getContent()) : null; - } catch (IOException e) { + } catch (final IOException e) { Log.e("Tile.requestMapTile() ", e); return null; } @@ -298,20 +298,20 @@ public class Tile { * @return */ protected static Set<Tile> getTilesForViewport(final Viewport viewport, final int tilesOnAxis, final int minZoom) { - Set<Tile> tiles = new HashSet<>(); - int zoom = Math.max( + final Set<Tile> tiles = new HashSet<>(); + final int zoom = Math.max( Math.min(Tile.calcZoomLon(viewport.bottomLeft, viewport.topRight, tilesOnAxis), Tile.calcZoomLat(viewport.bottomLeft, viewport.topRight, tilesOnAxis)), minZoom); - Tile tileBottomLeft = new Tile(viewport.bottomLeft, zoom); - Tile tileTopRight = new Tile(viewport.topRight, zoom); + final Tile tileBottomLeft = new Tile(viewport.bottomLeft, zoom); + final Tile tileTopRight = new Tile(viewport.topRight, zoom); - int xLow = Math.min(tileBottomLeft.getX(), tileTopRight.getX()); - int xHigh = Math.max(tileBottomLeft.getX(), tileTopRight.getX()); + final int xLow = Math.min(tileBottomLeft.getX(), tileTopRight.getX()); + final int xHigh = Math.max(tileBottomLeft.getX(), tileTopRight.getX()); - int yLow = Math.min(tileBottomLeft.getY(), tileTopRight.getY()); - int yHigh = Math.max(tileBottomLeft.getY(), tileTopRight.getY()); + final int yLow = Math.min(tileBottomLeft.getY(), tileTopRight.getY()); + final int yHigh = Math.max(tileBottomLeft.getY(), tileTopRight.getY()); for (int xNum = xLow; xNum <= xHigh; xNum++) { for (int yNum = yLow; yNum <= yHigh; yNum++) { @@ -324,8 +324,6 @@ public class Tile { public static class TileCache extends LeastRecentlyUsedSet<Tile> { - private static final long serialVersionUID = -1942301031192719547L; - public TileCache() { super(64); } diff --git a/main/src/cgeo/geocaching/connector/oc/OCApiConnector.java b/main/src/cgeo/geocaching/connector/oc/OCApiConnector.java index 284234e..9e9ec7f 100644 --- a/main/src/cgeo/geocaching/connector/oc/OCApiConnector.java +++ b/main/src/cgeo/geocaching/connector/oc/OCApiConnector.java @@ -31,7 +31,7 @@ public class OCApiConnector extends OCConnector implements ISearchByGeocode { private final ApiSupport apiSupport; private final String licenseString; - public OCApiConnector(String name, String host, String prefix, String cK, String licenseString, ApiSupport apiSupport) { + public OCApiConnector(final String name, final String host, final String prefix, final String cK, final String licenseString, final ApiSupport apiSupport) { super(name, host, prefix); this.cK = cK; this.apiSupport = apiSupport; @@ -39,7 +39,12 @@ public class OCApiConnector extends OCConnector implements ISearchByGeocode { } public void addAuthentication(final Parameters params) { - params.put(CryptUtils.rot13("pbafhzre_xrl"), CryptUtils.rot13(cK)); + final String rotCK = CryptUtils.rot13(cK); + // check that developers are not using the Ant defined properties without any values + if (StringUtils.startsWith(rotCK, "${")) { + throw new IllegalStateException("invalid OKAPI OAuth token " + rotCK); + } + params.put(CryptUtils.rot13("pbafhzre_xrl"), rotCK); } @Override @@ -93,13 +98,13 @@ public class OCApiConnector extends OCConnector implements ISearchByGeocode { /** * Checks if a search based on a user name targets the current user - * + * * @param username * Name of the user the query is searching after * @return True - search target and current is same, False - current user not known or not the same as username */ @SuppressWarnings("static-method") - public boolean isSearchForMyCaches(String username) { + public boolean isSearchForMyCaches(final String username) { return false; } } diff --git a/main/src/cgeo/geocaching/connector/oc/OkapiClient.java b/main/src/cgeo/geocaching/connector/oc/OkapiClient.java index 3df62aa..9a91abd 100644 --- a/main/src/cgeo/geocaching/connector/oc/OkapiClient.java +++ b/main/src/cgeo/geocaching/connector/oc/OkapiClient.java @@ -27,23 +27,27 @@ import cgeo.geocaching.geopoint.GeopointFormatter; import cgeo.geocaching.geopoint.Viewport; import cgeo.geocaching.network.Network; import cgeo.geocaching.network.OAuth; +import cgeo.geocaching.network.OAuthTokens; import cgeo.geocaching.network.Parameters; import cgeo.geocaching.settings.Settings; +import cgeo.geocaching.utils.JsonUtils; import cgeo.geocaching.utils.Log; import cgeo.geocaching.utils.SynchronizedDateFormat; import ch.boye.httpclientandroidlib.HttpResponse; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; + import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.tuple.ImmutablePair; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; import android.net.Uri; +import java.io.IOException; import java.text.ParseException; import java.util.ArrayList; import java.util.Calendar; @@ -56,6 +60,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.TimeZone; +import java.util.regex.Pattern; final class OkapiClient { @@ -131,6 +136,8 @@ final class OkapiClient { private static final String METHOD_SEARCH_NEAREST = "services/caches/search/nearest"; private static final String METHOD_RETRIEVE_CACHES = "services/caches/geocaches"; + private static final Pattern PATTERN_TIMEZONE = Pattern.compile("([+-][01][0-9]):([03])0"); + public static Geocache getCache(final String geoCode) { final Parameters params = new Parameters("cache_code", geoCode); final IConnector connector = ConnectorFactory.getConnector(geoCode); @@ -208,10 +215,15 @@ final class OkapiClient { } addFilterParams(valueMap, connector, my); - params.add("search_params", new JSONObject(valueMap).toString()); + try { + params.add("search_params", JsonUtils.writer.writeValueAsString(valueMap)); + } catch (final JsonProcessingException e) { + Log.e("requestCaches", e); + return Collections.emptyList(); + } addRetrieveParams(params, connector); - final JSONObject data = request(connector, OkapiService.SERVICE_SEARCH_AND_RETRIEVE, params).data; + final ObjectNode data = request(connector, OkapiService.SERVICE_SEARCH_AND_RETRIEVE, params).data; if (data == null) { return Collections.emptyList(); @@ -244,7 +256,7 @@ final class OkapiClient { final Parameters params = new Parameters("cache_code", cache.getGeocode()); params.add("watched", watched ? "true" : "false"); - final JSONObject data = request(connector, OkapiService.SERVICE_MARK_CACHE, params).data; + final ObjectNode data = request(connector, OkapiService.SERVICE_MARK_CACHE, params).data; if (data == null) { return false; @@ -268,68 +280,62 @@ final class OkapiClient { params.add("password", logPassword); } - final JSONObject data = request(connector, OkapiService.SERVICE_SUBMIT_LOG, params).data; + final ObjectNode data = request(connector, OkapiService.SERVICE_SUBMIT_LOG, params).data; if (data == null) { return new LogResult(StatusCode.LOG_POST_ERROR, ""); } try { - if (data.getBoolean("success")) { - return new LogResult(StatusCode.NO_ERROR, data.getString("log_uuid")); + if (data.get("success").asBoolean()) { + return new LogResult(StatusCode.NO_ERROR, data.get("log_uuid").asText()); } return new LogResult(StatusCode.LOG_POST_ERROR, ""); - } catch (final JSONException e) { + } catch (final NullPointerException e) { Log.e("OkapiClient.postLog", e); } return new LogResult(StatusCode.LOG_POST_ERROR, ""); } - private static List<Geocache> parseCaches(final JSONObject response) { + private static List<Geocache> parseCaches(final ObjectNode response) { try { // Check for empty result - final String result = response.getString("results"); + final String result = response.get("results").asText(); if (StringUtils.isBlank(result) || StringUtils.equals(result, "[]")) { return Collections.emptyList(); } // Get and iterate result list - final JSONObject cachesResponse = response.getJSONObject("results"); + final ObjectNode cachesResponse = (ObjectNode) response.get("results"); if (cachesResponse != null) { - final List<Geocache> caches = new ArrayList<>(cachesResponse.length()); - final Iterator<?> keys = cachesResponse.keys(); - while (keys.hasNext()) { - final Object next = keys.next(); - if (next instanceof String) { - final String key = (String) next; - final Geocache cache = parseSmallCache(cachesResponse.getJSONObject(key)); - caches.add(cache); - } + final List<Geocache> caches = new ArrayList<>(cachesResponse.size()); + final Iterator<JsonNode> it = cachesResponse.elements(); + while (it.hasNext()) { + caches.add(parseSmallCache((ObjectNode) it.next())); } return caches; } - } catch (final JSONException e) { + } catch (ClassCastException | NullPointerException e) { Log.e("OkapiClient.parseCachesResult", e); } return Collections.emptyList(); } - private static Geocache parseSmallCache(final JSONObject response) { + private static Geocache parseSmallCache(final ObjectNode response) { final Geocache cache = new Geocache(); cache.setReliableLatLon(true); try { - parseCoreCache(response, cache); - DataStore.saveCache(cache, EnumSet.of(SaveFlag.CACHE)); - } catch (final JSONException e) { + } catch (final NullPointerException e) { + // FIXME: here we may return a partially filled cache Log.e("OkapiClient.parseSmallCache", e); } return cache; } - private static Geocache parseCache(final JSONObject response) { + private static Geocache parseCache(final ObjectNode response) { final Geocache cache = new Geocache(); cache.setReliableLatLon(true); try { @@ -337,28 +343,27 @@ final class OkapiClient { parseCoreCache(response, cache); // not used: url - final JSONObject ownerObject = response.getJSONObject(CACHE_OWNER); - final String owner = parseUser(ownerObject); + final String owner = parseUser(response.get(CACHE_OWNER)); cache.setOwnerDisplayName(owner); // OpenCaching has no distinction between user id and user display name. Set the ID anyway to simplify c:geo workflows. cache.setOwnerUserId(owner); - cache.getLogCounts().put(LogType.FOUND_IT, response.getInt(CACHE_FOUNDS)); - cache.getLogCounts().put(LogType.DIDNT_FIND_IT, response.getInt(CACHE_NOTFOUNDS)); + cache.getLogCounts().put(LogType.FOUND_IT, response.get(CACHE_FOUNDS).asInt()); + cache.getLogCounts().put(LogType.DIDNT_FIND_IT, response.get(CACHE_NOTFOUNDS).asInt()); // only current Api - cache.getLogCounts().put(LogType.WILL_ATTEND, response.optInt(CACHE_WILLATTENDS)); + cache.getLogCounts().put(LogType.WILL_ATTEND, response.path(CACHE_WILLATTENDS).asInt()); - if (!response.isNull(CACHE_RATING)) { - cache.setRating((float) response.getDouble(CACHE_RATING)); + if (response.has(CACHE_RATING)) { + cache.setRating((float) response.get(CACHE_RATING).asDouble()); } - cache.setVotes(response.getInt(CACHE_VOTES)); + cache.setVotes(response.get(CACHE_VOTES).asInt()); - cache.setFavoritePoints(response.getInt(CACHE_RECOMMENDATIONS)); + cache.setFavoritePoints(response.get(CACHE_RECOMMENDATIONS).asInt()); // not used: req_password // Prepend gc-link to description if available final StringBuilder description = new StringBuilder(500); - if (!response.isNull("gc_code")) { - final String gccode = response.getString("gc_code"); + if (response.hasNonNull("gc_code")) { + final String gccode = response.get("gc_code").asText(); description.append(CgeoApplication.getInstance().getResources() .getString(R.string.cache_listed_on, GCConnector.getInstance().getName())) .append(": <a href=\"http://coord.info/") @@ -367,71 +372,70 @@ final class OkapiClient { .append(gccode) .append("</a><br /><br />"); } - description.append(response.getString(CACHE_DESCRIPTION)); + description.append(response.get(CACHE_DESCRIPTION).asText()); cache.setDescription(description.toString()); // currently the hint is delivered as HTML (contrary to OKAPI documentation), so we can store it directly - cache.setHint(response.getString(CACHE_HINT)); + cache.setHint(response.get(CACHE_HINT).asText()); // not used: hints - final JSONArray images = response.getJSONArray(CACHE_IMAGES); + final ArrayNode images = (ArrayNode) response.get(CACHE_IMAGES); if (images != null) { - for (int i = 0; i < images.length(); i++) { - final JSONObject imageResponse = images.getJSONObject(i); - final String title = imageResponse.getString(CACHE_IMAGE_CAPTION); - final String url = absoluteUrl(imageResponse.getString(CACHE_IMAGE_URL), cache.getGeocode()); + for (final JsonNode imageResponse: images) { + final String title = imageResponse.get(CACHE_IMAGE_CAPTION).asText(); + final String url = absoluteUrl(imageResponse.get(CACHE_IMAGE_URL).asText(), cache.getGeocode()); // all images are added as spoiler images, although OKAPI has spoiler and non spoiler images cache.addSpoiler(new Image(url, title)); } } - cache.setAttributes(parseAttributes(response.getJSONArray(CACHE_ATTRNAMES), response.optJSONArray(CACHE_ATTR_ACODES))); + cache.setAttributes(parseAttributes((ArrayNode) response.path(CACHE_ATTRNAMES), (ArrayNode) response.get(CACHE_ATTR_ACODES))); //TODO: Store license per cache //cache.setLicense(response.getString("attribution_note")); - cache.setWaypoints(parseWaypoints(response.getJSONArray(CACHE_WPTS)), false); + cache.setWaypoints(parseWaypoints((ArrayNode) response.path(CACHE_WPTS)), false); - cache.setInventory(parseTrackables(response.getJSONArray(CACHE_TRACKABLES))); + cache.setInventory(parseTrackables((ArrayNode) response.path(CACHE_TRACKABLES))); - if (!response.isNull(CACHE_IS_WATCHED)) { - cache.setOnWatchlist(response.getBoolean(CACHE_IS_WATCHED)); + if (response.has(CACHE_IS_WATCHED)) { + cache.setOnWatchlist(response.get(CACHE_IS_WATCHED).asBoolean()); } - if (!response.isNull(CACHE_MY_NOTES)) { - cache.setPersonalNote(response.getString(CACHE_MY_NOTES)); + if (response.hasNonNull(CACHE_MY_NOTES)) { + cache.setPersonalNote(response.get(CACHE_MY_NOTES).asText()); cache.parseWaypointsFromNote(); } - cache.setLogPasswordRequired(response.getBoolean(CACHE_REQ_PASSWORD)); + cache.setLogPasswordRequired(response.get(CACHE_REQ_PASSWORD).asBoolean()); cache.setDetailedUpdatedNow(); // save full detailed caches DataStore.saveCache(cache, EnumSet.of(SaveFlag.DB)); - DataStore.saveLogsWithoutTransaction(cache.getGeocode(), parseLogs(response.getJSONArray(CACHE_LATEST_LOGS))); - } catch (final JSONException e) { + DataStore.saveLogsWithoutTransaction(cache.getGeocode(), parseLogs((ArrayNode) response.path(CACHE_LATEST_LOGS))); + } catch (ClassCastException | NullPointerException e) { Log.e("OkapiClient.parseCache", e); } return cache; } - private static void parseCoreCache(final JSONObject response, final Geocache cache) throws JSONException { - cache.setGeocode(response.getString(CACHE_CODE)); - cache.setName(response.getString(CACHE_NAME)); + private static void parseCoreCache(final ObjectNode response, final Geocache cache) { + cache.setGeocode(response.get(CACHE_CODE).asText()); + cache.setName(response.get(CACHE_NAME).asText()); // not used: names - setLocation(cache, response.getString(CACHE_LOCATION)); - cache.setType(getCacheType(response.getString(CACHE_TYPE))); + setLocation(cache, response.get(CACHE_LOCATION).asText()); + cache.setType(getCacheType(response.get(CACHE_TYPE).asText())); - final String status = response.getString(CACHE_STATUS); + final String status = response.get(CACHE_STATUS).asText(); cache.setDisabled(status.equalsIgnoreCase(CACHE_STATUS_DISABLED)); cache.setArchived(status.equalsIgnoreCase(CACHE_STATUS_ARCHIVED)); cache.setSize(getCacheSize(response)); - cache.setDifficulty((float) response.getDouble(CACHE_DIFFICULTY)); - cache.setTerrain((float) response.getDouble(CACHE_TERRAIN)); + cache.setDifficulty((float) response.get(CACHE_DIFFICULTY).asDouble()); + cache.setTerrain((float) response.get(CACHE_TERRAIN).asDouble()); - cache.setInventoryItems(response.getInt(CACHE_TRACKABLES_COUNT)); + cache.setInventoryItems(response.get(CACHE_TRACKABLES_COUNT).asInt()); - if (!response.isNull(CACHE_IS_FOUND)) { - cache.setFound(response.getBoolean(CACHE_IS_FOUND)); + if (response.has(CACHE_IS_FOUND)) { + cache.setFound(response.get(CACHE_IS_FOUND).asBoolean()); } - cache.setHidden(parseDate(response.getString(CACHE_HIDDEN))); + cache.setHidden(parseDate(response.get(CACHE_HIDDEN).asText())); } private static String absoluteUrl(final String url, final String geocode) { @@ -447,41 +451,39 @@ final class OkapiClient { return url; } - private static String parseUser(final JSONObject user) throws JSONException { - return user.getString(USER_USERNAME); + private static String parseUser(final JsonNode user) { + return user.get(USER_USERNAME).asText(); } - private static List<LogEntry> parseLogs(final JSONArray logsJSON) { + private static List<LogEntry> parseLogs(final ArrayNode logsJSON) { List<LogEntry> result = null; - for (int i = 0; i < logsJSON.length(); i++) { + for (final JsonNode logResponse: logsJSON) { try { - final JSONObject logResponse = logsJSON.getJSONObject(i); final LogEntry log = new LogEntry( - parseUser(logResponse.getJSONObject(LOG_USER)), - parseDate(logResponse.getString(LOG_DATE)).getTime(), - parseLogType(logResponse.getString(LOG_TYPE)), - logResponse.getString(LOG_COMMENT).trim()); + parseUser(logResponse.get(LOG_USER)), + parseDate(logResponse.get(LOG_DATE).asText()).getTime(), + parseLogType(logResponse.get(LOG_TYPE).asText()), + logResponse.get(LOG_COMMENT).asText().trim()); if (result == null) { result = new ArrayList<>(); } result.add(log); - } catch (final JSONException e) { + } catch (final NullPointerException e) { Log.e("OkapiClient.parseLogs", e); } } return result; } - private static List<Waypoint> parseWaypoints(final JSONArray wptsJson) { + private static List<Waypoint> parseWaypoints(final ArrayNode wptsJson) { List<Waypoint> result = null; - for (int i = 0; i < wptsJson.length(); i++) { + for (final JsonNode wptResponse: wptsJson) { try { - final JSONObject wptResponse = wptsJson.getJSONObject(i); - final Waypoint wpt = new Waypoint(wptResponse.getString(WPT_NAME), - parseWptType(wptResponse.getString(WPT_TYPE)), + final Waypoint wpt = new Waypoint(wptResponse.get(WPT_NAME).asText(), + parseWptType(wptResponse.get(WPT_TYPE).asText()), false); - wpt.setNote(wptResponse.getString(WPT_DESCRIPTION)); - final Geopoint pt = parseCoords(wptResponse.getString(WPT_LOCATION)); + wpt.setNote(wptResponse.get(WPT_DESCRIPTION).asText()); + final Geopoint pt = parseCoords(wptResponse.get(WPT_LOCATION).asText()); if (pt != null) { wpt.setCoords(pt); } @@ -490,26 +492,25 @@ final class OkapiClient { } wpt.setPrefix(wpt.getName()); result.add(wpt); - } catch (final JSONException e) { + } catch (final NullPointerException e) { Log.e("OkapiClient.parseWaypoints", e); } } return result; } - private static List<Trackable> parseTrackables(final JSONArray trackablesJson) { - if (trackablesJson.length() == 0) { + private static List<Trackable> parseTrackables(final ArrayNode trackablesJson) { + if (trackablesJson.size() == 0) { return Collections.emptyList(); } final List<Trackable> result = new ArrayList<>(); - for (int i = 0; i < trackablesJson.length(); i++) { + for (final JsonNode trackableResponse: trackablesJson) { try { - final JSONObject trackableResponse = trackablesJson.getJSONObject(i); final Trackable trk = new Trackable(); - trk.setGeocode(trackableResponse.getString(TRK_GEOCODE)); - trk.setName(trackableResponse.getString(TRK_NAME)); + trk.setGeocode(trackableResponse.get(TRK_GEOCODE).asText()); + trk.setName(trackableResponse.get(TRK_NAME).asText()); result.add(trk); - } catch (final JSONException e) { + } catch (final NullPointerException e) { Log.e("OkapiClient.parseWaypoints", e); // Don't overwrite internal state with possibly partial result return null; @@ -578,7 +579,7 @@ final class OkapiClient { } private static Date parseDate(final String date) { - final String strippedDate = date.replaceAll("\\+0([0-9]){1}\\:00", "+0$100"); + final String strippedDate = PATTERN_TIMEZONE.matcher(date).replaceAll("$1$20"); try { return ISO8601DATEFORMAT.parse(strippedDate); } catch (final ParseException e) { @@ -597,14 +598,14 @@ final class OkapiClient { return null; } - private static List<String> parseAttributes(final JSONArray nameList, final JSONArray acodeList) { + private static List<String> parseAttributes(final ArrayNode nameList, final ArrayNode acodeList) { final List<String> result = new ArrayList<>(); - for (int i = 0; i < nameList.length(); i++) { + for (int i = 0; i < nameList.size(); i++) { try { - final String name = nameList.getString(i); - final int acode = acodeList != null ? Integer.parseInt(acodeList.getString(i).substring(1)) : CacheAttribute.NO_ID; + final String name = nameList.get(i).asText(); + final int acode = acodeList != null ? Integer.parseInt(acodeList.get(i).asText().substring(1)) : CacheAttribute.NO_ID; final CacheAttribute attr = CacheAttribute.getByOcACode(acode); if (attr != null) { @@ -612,7 +613,7 @@ final class OkapiClient { } else { result.add(name); } - } catch (final JSONException e) { + } catch (final NullPointerException e) { Log.e("OkapiClient.parseAttributes", e); } } @@ -626,27 +627,27 @@ final class OkapiClient { cache.setCoords(new Geopoint(latitude, longitude)); } - private static CacheSize getCacheSize(final JSONObject response) { - if (response.isNull(CACHE_SIZE2)) { + private static CacheSize getCacheSize(final ObjectNode response) { + if (!response.has(CACHE_SIZE2)) { return getCacheSizeDeprecated(response); } try { - final String size = response.getString(CACHE_SIZE2); + final String size = response.get(CACHE_SIZE2).asText(); return CacheSize.getById(size); - } catch (final JSONException e) { + } catch (final NullPointerException e) { Log.e("OkapiClient.getCacheSize", e); return getCacheSizeDeprecated(response); } } - private static CacheSize getCacheSizeDeprecated(final JSONObject response) { - if (response.isNull(CACHE_SIZE_DEPRECATED)) { + private static CacheSize getCacheSizeDeprecated(final ObjectNode response) { + if (!response.has(CACHE_SIZE_DEPRECATED)) { return CacheSize.NOT_CHOSEN; } double size = 0; try { - size = response.getDouble(CACHE_SIZE_DEPRECATED); - } catch (final JSONException e) { + size = response.get(CACHE_SIZE_DEPRECATED).asDouble(); + } catch (final NullPointerException e) { Log.e("OkapiClient.getCacheSize", e); } switch ((int) Math.round(size)) { @@ -734,19 +735,22 @@ final class OkapiClient { @NonNull private static JSONResult request(final OCApiConnector connector, final OkapiService service, final Parameters params) { if (connector == null) { - return new JSONResult(null); + return new JSONResult("unknown OKAPI connector"); } final String host = connector.getHost(); if (StringUtils.isBlank(host)) { - return new JSONResult(null); + return new JSONResult("unknown OKAPI connector host"); } params.add("langpref", getPreferredLanguage()); if (connector.getSupportedAuthLevel() == OAuthLevel.Level3) { - final ImmutablePair<String, String> tokens = Settings.getTokenPair(connector.getTokenPublicPrefKeyId(), connector.getTokenSecretPrefKeyId()); - OAuth.signOAuth(host, service.methodName, "GET", false, params, tokens.left, tokens.right, connector.getCK(), connector.getCS()); + final OAuthTokens tokens = new OAuthTokens(connector); + if (!tokens.isValid()) { + return new JSONResult("invalid oauth tokens"); + } + OAuth.signOAuth(host, service.methodName, "GET", false, params, tokens, connector.getCK(), connector.getCS()); } else { connector.addAuthentication(params); } @@ -812,16 +816,7 @@ final class OkapiClient { return null; } - final JSONObject data = result.data; - if (!data.isNull(USER_UUID)) { - try { - return data.getString(USER_UUID); - } catch (final JSONException e) { - Log.e("OkapiClient.getUserUUID - uuid", e); - } - } - - return null; + return result.data.path(USER_UUID).asText(null); } public static UserInfo getUserInfo(final OCApiLiveConnector connector) { @@ -835,31 +830,11 @@ final class OkapiClient { return new UserInfo(StringUtils.EMPTY, 0, UserInfoStatus.getFromOkapiError(error.getResult())); } - final JSONObject data = result.data; - - String name = StringUtils.EMPTY; - boolean successUserName = false; - - if (!data.isNull(USER_USERNAME)) { - try { - name = data.getString(USER_USERNAME); - successUserName = true; - } catch (final JSONException e) { - Log.e("OkapiClient.getUserInfo - name", e); - } - } - - int finds = 0; - boolean successFinds = false; - - if (!data.isNull(USER_CACHES_FOUND)) { - try { - finds = data.getInt(USER_CACHES_FOUND); - successFinds = true; - } catch (final JSONException e) { - Log.e("OkapiClient.getUserInfo - finds", e); - } - } + final ObjectNode data = result.data; + final boolean successUserName = data.has(USER_USERNAME); + final String name = data.path(USER_USERNAME).asText(); + final boolean successFinds = data.has(USER_CACHES_FOUND); + final int finds = data.path(USER_CACHES_FOUND).asInt(); return new UserInfo(name, finds, successUserName && successFinds ? UserInfoStatus.SUCCESSFUL : UserInfoStatus.FAILED); } @@ -876,7 +851,7 @@ final class OkapiClient { if (!result.isSuccess) { return new OkapiError(result.data); } - return new OkapiError(new JSONObject()); + return new OkapiError(new ObjectNode(JsonUtils.factory)); } /** @@ -886,21 +861,26 @@ final class OkapiClient { private static class JSONResult { public final boolean isSuccess; - public final JSONObject data; + public final ObjectNode data; public JSONResult(final @Nullable HttpResponse response) { - final boolean isSuccess = Network.isSuccess(response); + final boolean isRequestSuccessful = Network.isSuccess(response); final String responseData = Network.getResponseDataAlways(response); - JSONObject data = null; + ObjectNode tempData = null; if (responseData != null) { try { - data = new JSONObject(responseData); - } catch (final JSONException e) { + tempData = (ObjectNode) JsonUtils.reader.readTree(responseData); + } catch (IOException | ClassCastException e) { Log.w("JSONResult", e); } } - this.data = data; - this.isSuccess = isSuccess && data != null; + data = tempData; + isSuccess = isRequestSuccessful && tempData != null; + } + + public JSONResult(final @NonNull String errorMessage) { + isSuccess = false; + data = new ObjectNode(JsonUtils.factory).putObject("error").put("developer_message", errorMessage); } } } diff --git a/main/src/cgeo/geocaching/connector/oc/OkapiError.java b/main/src/cgeo/geocaching/connector/oc/OkapiError.java index 7faf2c7..b847207 100644 --- a/main/src/cgeo/geocaching/connector/oc/OkapiError.java +++ b/main/src/cgeo/geocaching/connector/oc/OkapiError.java @@ -2,11 +2,11 @@ package cgeo.geocaching.connector.oc; import cgeo.geocaching.utils.Log; +import com.fasterxml.jackson.databind.node.ObjectNode; + import org.apache.commons.lang3.StringUtils; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import org.json.JSONException; -import org.json.JSONObject; /** * Handles the JSON error response from OKAPI @@ -26,7 +26,7 @@ public class OkapiError { @NonNull private final OkapiErrors state; @NonNull private final String message; - public OkapiError(@Nullable JSONObject data) { + public OkapiError(@Nullable ObjectNode data) { // A null-response is by definition an error (some exception occurred somewhere in the flow) if (data == null) { @@ -39,10 +39,10 @@ public class OkapiError { String localmessage = null; OkapiErrors localstate = OkapiErrors.UNSPECIFIED; try { - JSONObject error = data.getJSONObject("error"); + final ObjectNode error = (ObjectNode) data.get("error"); // Check reason_stack element to look for the specific oauth problems we want to report back if (error.has("reason_stack")) { - String reason = error.getString("reason_stack"); + final String reason = error.get("reason_stack").asText(); if (StringUtils.contains(reason, "invalid_oauth_request")) { if (StringUtils.contains(reason, "invalid_timestamp")) { localstate = OkapiErrors.INVALID_TIMESTAMP; @@ -53,10 +53,10 @@ public class OkapiError { } // Check if we can extract a message as well if (error.has("developer_message")) { - localmessage = error.getString("developer_message"); + localmessage = error.get("developer_message").asText(); assert localmessage != null; // by virtue of defaultString } - } catch (JSONException ex) { + } catch (ClassCastException | NullPointerException ex) { Log.d("OkapiError: Failed to parse JSON", ex); localstate = OkapiErrors.UNSPECIFIED; } diff --git a/main/src/cgeo/geocaching/connector/ox/OpenCachingApi.java b/main/src/cgeo/geocaching/connector/ox/OpenCachingApi.java index b2afff5..21207ec 100644 --- a/main/src/cgeo/geocaching/connector/ox/OpenCachingApi.java +++ b/main/src/cgeo/geocaching/connector/ox/OpenCachingApi.java @@ -39,9 +39,9 @@ public class OpenCachingApi { return null; } - private static HttpResponse getRequest(String string, Parameters parameters) { + private static HttpResponse getRequest(final String uri, final Parameters parameters) { parameters.add("Authorization", DEV_KEY); - return Network.getRequest(string, parameters); + return Network.getRequest(uri, parameters); } private static Collection<Geocache> importCachesFromResponse(final HttpResponse response, final boolean isDetailed) { @@ -50,7 +50,7 @@ public class OpenCachingApi { } Collection<Geocache> caches; try { - caches = new OXGPXParser(StoredList.TEMPORARY_LIST_ID, isDetailed).parse(response.getEntity().getContent(), null); + caches = new OXGPXParser(StoredList.TEMPORARY_LIST.id, isDetailed).parse(response.getEntity().getContent(), null); } catch (Exception e) { Log.e("Error importing from OpenCaching.com", e); return Collections.emptyList(); diff --git a/main/src/cgeo/geocaching/enumerations/LocationProviderType.java b/main/src/cgeo/geocaching/enumerations/LocationProviderType.java index f2c79fe..e6024aa 100644 --- a/main/src/cgeo/geocaching/enumerations/LocationProviderType.java +++ b/main/src/cgeo/geocaching/enumerations/LocationProviderType.java @@ -5,6 +5,7 @@ import cgeo.geocaching.R; public enum LocationProviderType { GPS(R.string.loc_gps), NETWORK(R.string.loc_net), + FUSED(R.string.loc_fused), LAST(R.string.loc_last); public final int resourceId; diff --git a/main/src/cgeo/geocaching/files/AbstractFileListActivity.java b/main/src/cgeo/geocaching/files/AbstractFileListActivity.java index 2a05cbc..fa84df9 100644 --- a/main/src/cgeo/geocaching/files/AbstractFileListActivity.java +++ b/main/src/cgeo/geocaching/files/AbstractFileListActivity.java @@ -38,7 +38,7 @@ public abstract class AbstractFileListActivity<T extends ArrayAdapter<File>> ext private String searchInfo; @Override - public void handleMessage(Message msg) { + public void handleMessage(final Message msg) { if (msg.obj != null && waitDialog != null) { if (searchInfo == null) { searchInfo = res.getString(R.string.file_searching_in) + " "; @@ -52,7 +52,7 @@ public abstract class AbstractFileListActivity<T extends ArrayAdapter<File>> ext private String getDefaultFolders() { final ArrayList<String> names = new ArrayList<>(); - for (File dir : getExistingBaseFolders()) { + for (final File dir : getExistingBaseFolders()) { names.add(dir.getPath()); } return StringUtils.join(names, '\n'); @@ -62,7 +62,7 @@ public abstract class AbstractFileListActivity<T extends ArrayAdapter<File>> ext final private Handler loadFilesHandler = new Handler() { @Override - public void handleMessage(Message msg) { + public void handleMessage(final Message msg) { if (waitDialog != null) { waitDialog.dismiss(); } @@ -76,17 +76,17 @@ public abstract class AbstractFileListActivity<T extends ArrayAdapter<File>> ext }; @Override - public void onCreate(Bundle savedInstanceState) { + public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTheme(); setContentView(R.layout.gpx); - Bundle extras = getIntent().getExtras(); + final Bundle extras = getIntent().getExtras(); if (extras != null) { listId = extras.getInt(Intents.EXTRA_LIST_ID); } - if (listId <= StoredList.TEMPORARY_LIST_ID) { + if (listId <= StoredList.TEMPORARY_LIST.id) { listId = StoredList.STANDARD_LIST_ID; } @@ -100,7 +100,7 @@ public abstract class AbstractFileListActivity<T extends ArrayAdapter<File>> ext true, new DialogInterface.OnCancelListener() { @Override - public void onCancel(DialogInterface arg0) { + public void onCancel(final DialogInterface arg0) { if (searchingThread != null && searchingThread.isAlive()) { searchingThread.notifyEnd(); } @@ -171,7 +171,7 @@ public abstract class AbstractFileListActivity<T extends ArrayAdapter<File>> ext } else { Log.w("No external media mounted."); } - } catch (Exception e) { + } catch (final Exception e) { Log.e("AbstractFileListActivity.loadFiles.run", e); } @@ -181,7 +181,7 @@ public abstract class AbstractFileListActivity<T extends ArrayAdapter<File>> ext Collections.sort(files, new Comparator<File>() { @Override - public int compare(File lhs, File rhs) { + public int compare(final File lhs, final File rhs) { return lhs.getName().compareToIgnoreCase(rhs.getName()); } }); @@ -189,7 +189,7 @@ public abstract class AbstractFileListActivity<T extends ArrayAdapter<File>> ext loadFilesHandler.sendMessage(Message.obtain(loadFilesHandler)); } - private void listDirs(List<File> list, List<File> directories, FileListSelector selector, Handler feedbackHandler) { + private void listDirs(final List<File> list, final List<File> directories, final FileListSelector selector, final Handler feedbackHandler) { for (final File dir : directories) { FileUtils.listDir(list, dir, selector, feedbackHandler); } @@ -204,7 +204,7 @@ public abstract class AbstractFileListActivity<T extends ArrayAdapter<File>> ext * @return <code>true</code> if the filename belongs to the list */ protected boolean filenameBelongsToList(final String filename) { - for (String ext : extensions) { + for (final String ext : extensions) { if (StringUtils.endsWithIgnoreCase(filename, ext)) { return true; } @@ -213,7 +213,7 @@ public abstract class AbstractFileListActivity<T extends ArrayAdapter<File>> ext } protected List<File> getExistingBaseFolders() { - ArrayList<File> result = new ArrayList<>(); + final ArrayList<File> result = new ArrayList<>(); for (final File dir : getBaseFolders()) { if (dir.exists() && dir.isDirectory()) { result.add(dir); @@ -245,7 +245,7 @@ public abstract class AbstractFileListActivity<T extends ArrayAdapter<File>> ext boolean shouldEnd = false; @Override - public boolean isSelected(File file) { + public boolean isSelected(final File file) { return filenameBelongsToList(file.getName()); } @@ -254,7 +254,7 @@ public abstract class AbstractFileListActivity<T extends ArrayAdapter<File>> ext return shouldEnd; } - public synchronized void setShouldEnd(boolean shouldEnd) { + public synchronized void setShouldEnd(final boolean shouldEnd) { this.shouldEnd = shouldEnd; } } diff --git a/main/src/cgeo/geocaching/files/FileTypeDetector.java b/main/src/cgeo/geocaching/files/FileTypeDetector.java index 389b83a..ab0f032 100644 --- a/main/src/cgeo/geocaching/files/FileTypeDetector.java +++ b/main/src/cgeo/geocaching/files/FileTypeDetector.java @@ -10,7 +10,6 @@ import android.content.ContentResolver; import android.net.Uri; import java.io.BufferedReader; -import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -37,8 +36,6 @@ public class FileTypeDetector { reader = new BufferedReader(new InputStreamReader(is)); type = detectHeader(reader); reader.close(); - } catch (FileNotFoundException e) { - Log.e("FileTypeDetector", e); } catch (IOException e) { Log.e("FileTypeDetector", e); } finally { diff --git a/main/src/cgeo/geocaching/files/GPXImporter.java b/main/src/cgeo/geocaching/files/GPXImporter.java index 52f68e1..85d12f7 100644 --- a/main/src/cgeo/geocaching/files/GPXImporter.java +++ b/main/src/cgeo/geocaching/files/GPXImporter.java @@ -139,10 +139,11 @@ public class GPXImporter { final String mimeType) { if (GPX_MIME_TYPES.contains(mimeType)) { return FileType.GPX; - } else if (ZIP_MIME_TYPES.contains(mimeType)) { + } + if (ZIP_MIME_TYPES.contains(mimeType)) { return FileType.ZIP; } - return FileType.UNKNOWN; + return FileType.UNKNOWN; } private ImportThread getImporterFromFileType(Uri uri, diff --git a/main/src/cgeo/geocaching/files/GPXParser.java b/main/src/cgeo/geocaching/files/GPXParser.java index 89ee887..370b8aa 100644 --- a/main/src/cgeo/geocaching/files/GPXParser.java +++ b/main/src/cgeo/geocaching/files/GPXParser.java @@ -454,7 +454,7 @@ public abstract class GPXParser extends FileParser { @Override public void end(String body) { - final String[] content = body.split("\\|"); + final String[] content = StringUtils.split(body, '|'); if (content.length > 0) { type = content[0].toLowerCase(Locale.US).trim(); } diff --git a/main/src/cgeo/geocaching/files/IFileSelectionView.java b/main/src/cgeo/geocaching/files/IFileSelectionView.java index 5bbc1b2..0407ee4 100644 --- a/main/src/cgeo/geocaching/files/IFileSelectionView.java +++ b/main/src/cgeo/geocaching/files/IFileSelectionView.java @@ -8,7 +8,7 @@ public interface IFileSelectionView { String getCurrentFile(); - void setCurrentFile(String string); + void setCurrentFile(final String name); void close(); diff --git a/main/src/cgeo/geocaching/files/InvalidXMLCharacterFilterReader.java b/main/src/cgeo/geocaching/files/InvalidXMLCharacterFilterReader.java index a7a3e1b..8a089d2 100644 --- a/main/src/cgeo/geocaching/files/InvalidXMLCharacterFilterReader.java +++ b/main/src/cgeo/geocaching/files/InvalidXMLCharacterFilterReader.java @@ -1,98 +1,94 @@ -package cgeo.geocaching.files;
-
-import org.apache.commons.lang3.StringUtils;
-
-import java.io.FilterReader;
-import java.io.IOException;
-import java.io.Reader;
-
-/**
- * Filter reader which can filter out invalid XML characters and character references.
- *
- */
-public class InvalidXMLCharacterFilterReader extends FilterReader
-{
-
- public InvalidXMLCharacterFilterReader(Reader in) {
- super(in);
- }
-
- /**
- * Every overload of {@link Reader#read()} method delegates to this one so
- * it is enough to override only this one. <br />
- * To skip invalid characters this method shifts only valid chars to left
- * and returns decreased value of the original read method. So after last
- * valid character there will be some unused chars in the buffer.
- *
- * @return Number of read valid characters or <code>-1</code> if end of the
- * underling reader was reached.
- */
- @Override
- public int read(char[] cbuf, int off, int len) throws IOException {
- int read = super.read(cbuf, off, len);
- // check for end
- if (read == -1) {
- return -1;
- }
- // target position
- int pos = off - 1;
-
- int entityStart = -1;
- for (int readPos = off; readPos < off + read; readPos++) {
- boolean useChar = true;
- switch (cbuf[readPos]) {
- case '&':
- pos++;
- entityStart = readPos;
- break;
- case ';':
- pos++;
- if (entityStart >= 0) {
- int entityLength = readPos - entityStart + 1;
- if (entityLength <= 5) {
- String entity = new String(cbuf, entityStart, entityLength);
- if (StringUtils.startsWith(entity, "&#")) {
- String numberString = StringUtils.substringBetween(entity, "&#", ";");
- final int value;
- if (StringUtils.startsWith(numberString, "x")) {
- value = Integer.parseInt(numberString.substring(1), 16);
- }
- else {
- value = Integer.parseInt(numberString);
- }
- if (!isValidXMLChar((char) value)) {
- pos -= entityLength;
- useChar = false;
- }
- }
- }
- }
- break;
- default:
- if (isValidXMLChar(cbuf[readPos])) {
- pos++;
- } else {
- continue;
- }
- }
- // copy, and skip unwanted characters
- if (pos < readPos && useChar) {
- cbuf[pos] = cbuf[readPos];
- }
- }
- return pos - off + 1;
- }
-
- private static boolean isValidXMLChar(char c) {
- if ((c == 0x9) ||
- (c == 0xA) ||
- (c == 0xD) ||
- ((c >= 0x20) && (c <= 0xD7FF)) ||
- ((c >= 0xE000) && (c <= 0xFFFD)) ||
- ((c >= 0x10000) && (c <= 0x10FFFF)))
- {
- return true;
- }
- return false;
- }
+package cgeo.geocaching.files; + +import org.apache.commons.lang3.StringUtils; + +import java.io.FilterReader; +import java.io.IOException; +import java.io.Reader; + +/** + * Filter reader which can filter out invalid XML characters and character references. + * + */ +public class InvalidXMLCharacterFilterReader extends FilterReader +{ + + public InvalidXMLCharacterFilterReader(Reader in) { + super(in); + } + + /** + * Every overload of {@link Reader#read()} method delegates to this one so + * it is enough to override only this one. <br /> + * To skip invalid characters this method shifts only valid chars to left + * and returns decreased value of the original read method. So after last + * valid character there will be some unused chars in the buffer. + * + * @return Number of read valid characters or <code>-1</code> if end of the + * underling reader was reached. + */ + @Override + public int read(char[] cbuf, int off, int len) throws IOException { + int read = super.read(cbuf, off, len); + // check for end + if (read == -1) { + return -1; + } + // target position + int pos = off - 1; + + int entityStart = -1; + for (int readPos = off; readPos < off + read; readPos++) { + boolean useChar = true; + switch (cbuf[readPos]) { + case '&': + pos++; + entityStart = readPos; + break; + case ';': + pos++; + if (entityStart >= 0) { + int entityLength = readPos - entityStart + 1; + if (entityLength <= 5) { + String entity = new String(cbuf, entityStart, entityLength); + if (StringUtils.startsWith(entity, "&#")) { + String numberString = StringUtils.substringBetween(entity, "&#", ";"); + final int value; + if (StringUtils.startsWith(numberString, "x")) { + value = Integer.parseInt(numberString.substring(1), 16); + } + else { + value = Integer.parseInt(numberString); + } + if (!isValidXMLChar((char) value)) { + pos -= entityLength; + useChar = false; + } + } + } + } + break; + default: + if (isValidXMLChar(cbuf[readPos])) { + pos++; + } else { + continue; + } + } + // copy, and skip unwanted characters + if (pos < readPos && useChar) { + cbuf[pos] = cbuf[readPos]; + } + } + return pos - off + 1; + } + + private static boolean isValidXMLChar(char c) { + return (c == 0x9) || + (c == 0xA) || + (c == 0xD) || + ((c >= 0x20) && (c <= 0xD7FF)) || + ((c >= 0xE000) && (c <= 0xFFFD)) || + ((c >= 0x10000) && (c <= 0x10FFFF)); + } }
\ No newline at end of file diff --git a/main/src/cgeo/geocaching/files/LocParser.java b/main/src/cgeo/geocaching/files/LocParser.java index 2871d77..13f8cca 100644 --- a/main/src/cgeo/geocaching/files/LocParser.java +++ b/main/src/cgeo/geocaching/files/LocParser.java @@ -88,7 +88,7 @@ public final class LocParser extends FileParser { } // >> premium only - final String[] points = fileContent.split("<waypoint>"); + final String[] points = StringUtils.splitByWholeSeparator(fileContent, "<waypoint>"); // parse coordinates for (String pointString : points) { diff --git a/main/src/cgeo/geocaching/files/SimpleDirChooser.java b/main/src/cgeo/geocaching/files/SimpleDirChooser.java index 2aadf16..0139206 100644 --- a/main/src/cgeo/geocaching/files/SimpleDirChooser.java +++ b/main/src/cgeo/geocaching/files/SimpleDirChooser.java @@ -263,7 +263,7 @@ public class SimpleDirChooser extends AbstractListActivity { private boolean checked = false; private boolean writeable = false; - private static Comparator<Option> NAME_COMPARATOR = new Comparator<SimpleDirChooser.Option>() { + private final static Comparator<Option> NAME_COMPARATOR = new Comparator<SimpleDirChooser.Option>() { @Override public int compare(final Option lhs, final Option rhs) { diff --git a/main/src/cgeo/geocaching/filter/PopularityFilter.java b/main/src/cgeo/geocaching/filter/PopularityFilter.java index a0244b9..0fc807d 100644 --- a/main/src/cgeo/geocaching/filter/PopularityFilter.java +++ b/main/src/cgeo/geocaching/filter/PopularityFilter.java @@ -29,8 +29,7 @@ class PopularityFilter extends AbstractFilter { @Override public List<IFilter> getFilters() { final List<IFilter> filters = new ArrayList<>(FAVORITES.length); - for (int i = 0; i < FAVORITES.length; i++) { - final int minRange = FAVORITES[i]; + for (final int minRange : FAVORITES) { final int maxRange = Integer.MAX_VALUE; final String range = "> " + minRange; final String name = CgeoApplication.getInstance().getResources().getQuantityString(R.plurals.favorite_points, minRange, range); diff --git a/main/src/cgeo/geocaching/filter/PopularityRatioFilter.java b/main/src/cgeo/geocaching/filter/PopularityRatioFilter.java index a04f219..ed8c074 100644 --- a/main/src/cgeo/geocaching/filter/PopularityRatioFilter.java +++ b/main/src/cgeo/geocaching/filter/PopularityRatioFilter.java @@ -53,8 +53,7 @@ class PopularityRatioFilter extends AbstractFilter { @Override public List<IFilter> getFilters() { final List<IFilter> filters = new ArrayList<>(RATIOS.length); - for (int i = 0; i < RATIOS.length; i++) { - final int minRange = RATIOS[i]; + for (final int minRange : RATIOS) { final int maxRange = Integer.MAX_VALUE; final String name = "> " + minRange + " " + CgeoApplication.getInstance().getResources().getString(R.string.percent_favorite_points); filters.add(new PopularityRatioFilter(name, minRange, maxRange)); diff --git a/main/src/cgeo/geocaching/gcvote/GCVote.java b/main/src/cgeo/geocaching/gcvote/GCVote.java index 8de3edc..d42bb34 100644 --- a/main/src/cgeo/geocaching/gcvote/GCVote.java +++ b/main/src/cgeo/geocaching/gcvote/GCVote.java @@ -20,7 +20,6 @@ import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; -import java.util.Locale; import java.util.Map; import java.util.regex.Pattern; @@ -275,10 +274,6 @@ public final class GCVote { return rating >= MIN_RATING && rating <= MAX_RATING; } - public static String getRatingText(final float rating) { - return String.format(Locale.getDefault(), "%.1f", rating); - } - public static boolean isVotingPossible(final Geocache cache) { return Settings.isGCvoteLogin() && StringUtils.isNotBlank(cache.getGuid()) && cache.supportsGCVote(); } diff --git a/main/src/cgeo/geocaching/geopoint/Viewport.java b/main/src/cgeo/geocaching/geopoint/Viewport.java index ba0e040..a48b0a1 100644 --- a/main/src/cgeo/geocaching/geopoint/Viewport.java +++ b/main/src/cgeo/geocaching/geopoint/Viewport.java @@ -79,6 +79,22 @@ public final class Viewport { && coords.getLatitudeE6() <= topRight.getLatitudeE6(); } + /** + * Count the number of points present in the viewport. + * + * @param points a collection of (possibly null) points + * @return the number of non-null points in the viewport + */ + public int count(final @NonNull Collection<? extends ICoordinates> points) { + int total = 0; + for (ICoordinates point: points) { + if (point != null && contains(point)) { + total += 1; + } + } + return total; + } + @Override public String toString() { return "(" + bottomLeft.toString() + "," + topRight.toString() + ")"; diff --git a/main/src/cgeo/geocaching/list/AbstractList.java b/main/src/cgeo/geocaching/list/AbstractList.java index 9b57b3a..5a20b9d 100644 --- a/main/src/cgeo/geocaching/list/AbstractList.java +++ b/main/src/cgeo/geocaching/list/AbstractList.java @@ -8,7 +8,7 @@ public abstract class AbstractList { public final int id; public final String title; - private static SparseArray<AbstractList> LISTS = new SparseArray<>(); + private final static SparseArray<AbstractList> LISTS = new SparseArray<>(); public AbstractList(final int id, final String title) { this.id = id; diff --git a/main/src/cgeo/geocaching/list/StoredList.java b/main/src/cgeo/geocaching/list/StoredList.java index 53632a0..abb6af1 100644 --- a/main/src/cgeo/geocaching/list/StoredList.java +++ b/main/src/cgeo/geocaching/list/StoredList.java @@ -24,12 +24,12 @@ import java.util.Comparator; import java.util.List; public final class StoredList extends AbstractList { - public static final int TEMPORARY_LIST_ID = 0; - public static final StoredList TEMPORARY_LIST = new StoredList(TEMPORARY_LIST_ID, "<temporary>", 0); // Never displayed + private static final int TEMPORARY_LIST_ID = 0; + public static final StoredList TEMPORARY_LIST = new StoredList(TEMPORARY_LIST_ID, "<temporary>", 0); // Never displayed public static final int STANDARD_LIST_ID = 1; private final int count; // this value is only valid as long as the list is not changed by other database operations - public StoredList(int id, String title, int count) { + public StoredList(final int id, final String title, final int count) { super(id, title); this.count = count; } @@ -48,7 +48,7 @@ public final class StoredList extends AbstractList { } @Override - public boolean equals(Object obj) { + public boolean equals(final Object obj) { if (this == obj) { return true; } @@ -69,10 +69,6 @@ public final class StoredList extends AbstractList { res = app.getResources(); } - public void promptForListSelection(final int titleId, @NonNull final Action1<Integer> runAfterwards) { - promptForListSelection(titleId, runAfterwards, false, -1); - } - public void promptForListSelection(final int titleId, @NonNull final Action1<Integer> runAfterwards, final boolean onlyConcreteLists, final int exceptListId) { promptForListSelection(titleId, runAfterwards, onlyConcreteLists, exceptListId, StringUtils.EMPTY); } @@ -81,18 +77,18 @@ public final class StoredList extends AbstractList { final List<AbstractList> lists = getMenuLists(onlyConcreteLists, exceptListId); final List<CharSequence> listsTitle = new ArrayList<>(); - for (AbstractList list : lists) { + for (final AbstractList list : lists) { listsTitle.add(list.getTitleAndCount()); } final CharSequence[] items = new CharSequence[listsTitle.size()]; final Activity activity = activityRef.get(); - AlertDialog.Builder builder = new AlertDialog.Builder(activity); + final AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setTitle(res.getString(titleId)); builder.setItems(listsTitle.toArray(items), new DialogInterface.OnClickListener() { @Override - public void onClick(DialogInterface dialogInterface, int itemId) { + public void onClick(final DialogInterface dialogInterface, final int itemId) { final AbstractList list = lists.get(itemId); if (list == PseudoList.NEW_LIST) { // create new list on the fly @@ -106,12 +102,12 @@ public final class StoredList extends AbstractList { builder.create().show(); } - public static List<AbstractList> getMenuLists(boolean onlyConcreteLists, int exceptListId) { + public static List<AbstractList> getMenuLists(final boolean onlyConcreteLists, final int exceptListId) { final List<AbstractList> lists = new ArrayList<>(); lists.addAll(getSortedLists()); - if (exceptListId > StoredList.TEMPORARY_LIST_ID) { - StoredList exceptList = DataStore.getList(exceptListId); + if (exceptListId > StoredList.TEMPORARY_LIST.id) { + final StoredList exceptList = DataStore.getList(exceptListId); if (exceptList != null) { lists.remove(exceptList); } @@ -138,7 +134,7 @@ public final class StoredList extends AbstractList { Collections.sort(lists, new Comparator<StoredList>() { @Override - public int compare(StoredList lhs, StoredList rhs) { + public int compare(final StoredList lhs, final StoredList rhs) { // have the standard list at the top if (lhs.id == STANDARD_LIST_ID) { return -1; @@ -153,7 +149,7 @@ public final class StoredList extends AbstractList { return lists; } - public void promptForListCreation(@NonNull final Action1<Integer> runAfterwards, String newListName) { + public void promptForListCreation(@NonNull final Action1<Integer> runAfterwards, final String newListName) { handleListNameInput(newListName, R.string.list_dialog_create_title, R.string.list_dialog_create, new Action1<String>() { // We need to update the list cache by creating a new StoredList object here. @@ -177,7 +173,7 @@ public final class StoredList extends AbstractList { }); } - private void handleListNameInput(final String defaultValue, int dialogTitle, int buttonTitle, final Action1<String> runnable) { + private void handleListNameInput(final String defaultValue, final int dialogTitle, final int buttonTitle, final Action1<String> runnable) { final Activity activity = activityRef.get(); if (activity == null) { return; @@ -187,7 +183,7 @@ public final class StoredList extends AbstractList { @Override public void call(final String input) { // remove whitespaces added by autocompletion of Android keyboard - String listName = StringUtils.trim(input); + final String listName = StringUtils.trim(input); if (StringUtils.isNotBlank(listName)) { runnable.call(listName); } @@ -225,8 +221,8 @@ public final class StoredList extends AbstractList { /** * Return the given list, if it is a concrete list. Return the default list otherwise. */ - public static int getConcreteList(int listId) { - if (listId == PseudoList.ALL_LIST.id || listId == TEMPORARY_LIST_ID || listId == PseudoList.HISTORY_LIST.id) { + public static int getConcreteList(final int listId) { + if (listId == PseudoList.ALL_LIST.id || listId == TEMPORARY_LIST.id || listId == PseudoList.HISTORY_LIST.id) { return STANDARD_LIST_ID; } return listId; diff --git a/main/src/cgeo/geocaching/maps/CGeoMap.java b/main/src/cgeo/geocaching/maps/CGeoMap.java index 2ca0cfd..4b3132f 100644 --- a/main/src/cgeo/geocaching/maps/CGeoMap.java +++ b/main/src/cgeo/geocaching/maps/CGeoMap.java @@ -204,7 +204,6 @@ public class CGeoMap extends AbstractMap implements ViewFactory { private static BlockingQueue<Runnable> downloadQueue = new ArrayBlockingQueue<>(1); private static ThreadPoolExecutor downloadExecutor = new ThreadPoolExecutor(1, 1, 60, TimeUnit.SECONDS, downloadQueue, new ThreadPoolExecutor.DiscardOldestPolicy()); private static BlockingQueue<Runnable> loadQueue = new ArrayBlockingQueue<>(1); - private static ThreadPoolExecutor loadExecutor = new ThreadPoolExecutor(1, 1, 60, TimeUnit.SECONDS, loadQueue, new ThreadPoolExecutor.DiscardOldestPolicy()); // handlers /** Updates the titles */ @@ -373,21 +372,7 @@ public class CGeoMap extends AbstractMap implements ViewFactory { } protected void countVisibleCaches() { - final List<Geocache> protectedCaches = caches.getAsList(); - - int count = 0; - if (!protectedCaches.isEmpty()) { - final Viewport viewport = mapView.getViewport(); - - for (final Geocache cache : protectedCaches) { - if (cache != null && cache.getCoords() != null) { - if (viewport.contains(cache)) { - count++; - } - } - } - } - cachesCnt = count; + cachesCnt = mapView.getViewport().count(caches.getAsList()); } @Override @@ -506,7 +491,7 @@ public class CGeoMap extends AbstractMap implements ViewFactory { } prepareFilterBar(); - if (!app.isLiveMapHintShownInThisSession() && !Settings.getHideLiveMapHint() && Settings.getLiveMapHintShowCount() <= 3) { + if (!app.isLiveMapHintShownInThisSession() && Settings.getLiveMapHintShowCount() <= 3) { LiveMapInfoDialogBuilder.create(activity).show(); } } @@ -708,7 +693,7 @@ public class CGeoMap extends AbstractMap implements ViewFactory { public void call(final Integer selectedListId) { storeCaches(geocodes, selectedListId); } - }, true, StoredList.TEMPORARY_LIST_ID); + }, true, StoredList.TEMPORARY_LIST.id); } else { storeCaches(geocodes, StoredList.STANDARD_LIST_ID); } @@ -906,7 +891,7 @@ public class CGeoMap extends AbstractMap implements ViewFactory { // Set center of map to my location if appropriate. private void myLocationInMiddle(final IGeoData geo) { - if (followMyLocation && !geo.isPseudoLocation()) { + if (followMyLocation) { centerMap(geo.getCoords()); } } @@ -923,7 +908,6 @@ public class CGeoMap extends AbstractMap implements ViewFactory { private static final float MIN_LOCATION_DELTA = 0.01f; Location currentLocation = new Location(""); - boolean locationValid = false; float currentHeading; private long timeLastPositionOverlayCalculation = 0; @@ -938,15 +922,9 @@ public class CGeoMap extends AbstractMap implements ViewFactory { @Override public void updateGeoDir(final IGeoData geo, final float dir) { - if (geo.isPseudoLocation()) { - locationValid = false; - } else { - locationValid = true; - - currentLocation = geo.getLocation(); - currentHeading = DirectionProvider.getDirectionNow(dir); - repaintPositionOverlay(); - } + currentLocation = geo.getLocation(); + currentHeading = DirectionProvider.getDirectionNow(dir); + repaintPositionOverlay(); } /** @@ -960,16 +938,16 @@ public class CGeoMap extends AbstractMap implements ViewFactory { try { final CGeoMap map = mapRef.get(); if (map != null) { - final boolean needsRepaintForDistance = needsRepaintForDistance(); + final boolean needsRepaintForDistanceOrAccuracy = needsRepaintForDistanceOrAccuracy(); final boolean needsRepaintForHeading = needsRepaintForHeading(); - if (needsRepaintForDistance) { + if (needsRepaintForDistanceOrAccuracy) { if (map.followMyLocation) { map.centerMap(new Geopoint(currentLocation)); } } - if (needsRepaintForDistance || needsRepaintForHeading) { + if (needsRepaintForDistanceOrAccuracy || needsRepaintForHeading) { map.overlayPositionAndScale.setCoordinates(currentLocation); map.overlayPositionAndScale.setHeading(currentHeading); map.mapView.repaintRequired(map.overlayPositionAndScale); @@ -989,11 +967,7 @@ public class CGeoMap extends AbstractMap implements ViewFactory { return Math.abs(AngleUtils.difference(currentHeading, map.overlayPositionAndScale.getHeading())) > MIN_HEADING_DELTA; } - boolean needsRepaintForDistance() { - if (!locationValid) { - return false; - } - + boolean needsRepaintForDistanceOrAccuracy() { final CGeoMap map = mapRef.get(); if (map == null) { return false; @@ -1002,6 +976,9 @@ public class CGeoMap extends AbstractMap implements ViewFactory { float dist = Float.MAX_VALUE; if (lastLocation != null) { + if (lastLocation.getAccuracy() != currentLocation.getAccuracy()) { + return true; + } dist = currentLocation.distanceTo(lastLocation); } @@ -1028,7 +1005,7 @@ public class CGeoMap extends AbstractMap implements ViewFactory { displayPoint(coordsIntent); loadTimer = Subscriptions.empty(); } else { - loadTimer = startLoadTimer(); + loadTimer = Schedulers.newThread().createWorker().schedulePeriodically(new LoadTimerAction(this), 0, 250, TimeUnit.MILLISECONDS); } return loadTimer; } @@ -1085,13 +1062,6 @@ public class CGeoMap extends AbstractMap implements ViewFactory { } /** - * loading timer Triggers every 250ms and checks for viewport change and starts a {@link LoadRunnable}. - */ - private Subscription startLoadTimer() { - return Schedulers.newThread().createWorker().schedulePeriodically(new LoadTimerAction(this), 0, 250, TimeUnit.MILLISECONDS); - } - - /** * get if map is loading something * * @return @@ -1239,9 +1209,6 @@ public class CGeoMap extends AbstractMap implements ViewFactory { //render displayExecutor.execute(new DisplayRunnable(this)); - } catch (final ThreadDeath e) { - Log.d("DownloadThread stopped"); - displayHandler.sendEmptyMessage(UPDATE_TITLE); } finally { showProgressHandler.sendEmptyMessage(HIDE_PROGRESS); // hide progress } @@ -1301,9 +1268,6 @@ public class CGeoMap extends AbstractMap implements ViewFactory { } displayHandler.sendEmptyMessage(UPDATE_TITLE); - } catch (final ThreadDeath e) { - Log.d("DisplayThread stopped"); - displayHandler.sendEmptyMessage(UPDATE_TITLE); } finally { showProgressHandler.sendEmptyMessage(HIDE_PROGRESS); } diff --git a/main/src/cgeo/geocaching/network/HtmlImage.java b/main/src/cgeo/geocaching/network/HtmlImage.java index 31edc9f..4a5c506 100644 --- a/main/src/cgeo/geocaching/network/HtmlImage.java +++ b/main/src/cgeo/geocaching/network/HtmlImage.java @@ -89,7 +89,7 @@ public class HtmlImage implements Html.ImageGetter { final private int maxWidth; final private int maxHeight; final private Resources resources; - final private TextView view; + protected final TextView view; // Background loading final private PublishSubject<Observable<String>> loading = PublishSubject.create(); @@ -208,12 +208,7 @@ public class HtmlImage implements Html.ImageGetter { private Pair<BitmapDrawable, Boolean> loadFromDisk() { final Pair<Bitmap, Boolean> loadResult = loadImageFromStorage(url, pseudoGeocode, shared); - final Bitmap bitmap = loadResult.getLeft(); - return new ImmutablePair<>(bitmap != null ? - ImageUtils.scaleBitmapToFitDisplay(bitmap) : - null, - loadResult.getRight() - ); + return scaleImage(loadResult); } private void downloadAndSave(final Subscriber<? super BitmapDrawable> subscriber) { @@ -254,6 +249,15 @@ public class HtmlImage implements Html.ImageGetter { }); } + @SuppressWarnings("static-method") + protected Pair<BitmapDrawable, Boolean> scaleImage(final Pair<Bitmap, Boolean> loadResult) { + final Bitmap bitmap = loadResult.getLeft(); + return new ImmutablePair<>(bitmap != null ? + ImageUtils.scaleBitmapToFitDisplay(bitmap) : + null, + loadResult.getRight()); + } + public Observable<String> waitForEndObservable(@Nullable final CancellableHandler handler) { if (handler != null) { handler.unsubscribeIfCancelled(subscription); diff --git a/main/src/cgeo/geocaching/network/Network.java b/main/src/cgeo/geocaching/network/Network.java index ec6ec4f..40f7f7e 100644 --- a/main/src/cgeo/geocaching/network/Network.java +++ b/main/src/cgeo/geocaching/network/Network.java @@ -2,6 +2,7 @@ package cgeo.geocaching.network; import cgeo.geocaching.files.LocalStorage; import cgeo.geocaching.settings.Settings; +import cgeo.geocaching.utils.JsonUtils; import cgeo.geocaching.utils.Log; import cgeo.geocaching.utils.TextUtils; @@ -26,11 +27,12 @@ import ch.boye.httpclientandroidlib.params.CoreConnectionPNames; import ch.boye.httpclientandroidlib.params.CoreProtocolPNames; import ch.boye.httpclientandroidlib.params.HttpParams; import ch.boye.httpclientandroidlib.util.EntityUtils; + +import com.fasterxml.jackson.databind.node.ObjectNode; + import org.apache.commons.lang3.CharEncoding; import org.apache.commons.lang3.StringUtils; import org.eclipse.jdt.annotation.Nullable; -import org.json.JSONException; -import org.json.JSONObject; import android.content.Context; import android.net.ConnectivityManager; @@ -43,6 +45,7 @@ import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; +import java.util.regex.Pattern; public abstract class Network { @@ -51,7 +54,7 @@ public abstract class Network { /** Native user agent, taken from a Android 2.2 Nexus **/ private final static String NATIVE_USER_AGENT = "Mozilla/5.0 (Linux; U; Android 2.2; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"; - private static final String PATTERN_PASSWORD = "(?<=[\\?&])[Pp]ass(w(or)?d)?=[^&#$]+"; + private static final Pattern PATTERN_PASSWORD = Pattern.compile("(?<=[\\?&])[Pp]ass(w(or)?d)?=[^&#$]+"); private final static HttpParams clientParams = new BasicHttpParams(); @@ -63,7 +66,7 @@ public abstract class Network { } private static String hidePassword(final String message) { - return message.replaceAll(PATTERN_PASSWORD, "password=***"); + return PATTERN_PASSWORD.matcher(message).replaceAll("password=***"); } private static HttpClient getHttpClient() { @@ -107,14 +110,14 @@ public abstract class Network { * @return the HTTP response, or null in case of an encoding error params */ @Nullable - public static HttpResponse postJsonRequest(final String uri, final JSONObject json) { + public static HttpResponse postJsonRequest(final String uri, final ObjectNode json) { HttpPost request = new HttpPost(uri); request.addHeader("Content-Type", "application/json; charset=utf-8"); if (json != null) { try { request.setEntity(new StringEntity(json.toString(), CharEncoding.UTF_8)); } catch (UnsupportedEncodingException e) { - Log.e("postJsonRequest:JSON Entity: UnsupportedEncodingException"); + Log.e("postJsonRequest:JSON Entity: UnsupportedEncodingException", e); return null; } } @@ -344,14 +347,14 @@ public abstract class Network { * @return a JSON object if the request was successful and the body could be decoded, <code>null</code> otherwise */ @Nullable - public static JSONObject requestJSON(final String uri, @Nullable final Parameters params) { + public static ObjectNode requestJSON(final String uri, @Nullable final Parameters params) { final HttpResponse response = request("GET", uri, params, new Parameters("Accept", "application/json, text/javascript, */*; q=0.01"), null); final String responseData = getResponseData(response, false); if (responseData != null) { try { - return new JSONObject(responseData); - } catch (final JSONException e) { - Log.w("Network.requestJSON", e); + return (ObjectNode) JsonUtils.reader.readTree(responseData); + } catch (final IOException e) { + Log.w("requestJSON", e); } } diff --git a/main/src/cgeo/geocaching/network/OAuth.java b/main/src/cgeo/geocaching/network/OAuth.java index cfc62fc..c23ffbf 100644 --- a/main/src/cgeo/geocaching/network/OAuth.java +++ b/main/src/cgeo/geocaching/network/OAuth.java @@ -6,7 +6,6 @@ import ch.boye.httpclientandroidlib.NameValuePair; import org.apache.commons.lang3.StringUtils; import org.eclipse.jdt.annotation.NonNull; -import org.eclipse.jdt.annotation.Nullable; import java.util.ArrayList; import java.util.Date; @@ -18,8 +17,7 @@ public class OAuth { final String method, final boolean https, final Parameters params, - @Nullable final String token, - @Nullable final String tokenSecret, + final OAuthTokens tokens, final String consumerKey, final String consumerSecret) { params.put( @@ -27,7 +25,7 @@ public class OAuth { "oauth_nonce", CryptUtils.md5(Long.toString(System.currentTimeMillis())), "oauth_signature_method", "HMAC-SHA1", "oauth_timestamp", Long.toString(new Date().getTime() / 1000), - "oauth_token", StringUtils.defaultString(token), + "oauth_token", StringUtils.defaultString(tokens.getTokenPublic()), "oauth_version", "1.0"); params.sort(); @@ -36,7 +34,7 @@ public class OAuth { paramsEncoded.add(nameValue.getName() + "=" + OAuth.percentEncode(nameValue.getValue())); } - final String keysPacked = consumerSecret + "&" + StringUtils.defaultString(tokenSecret); // both even if empty some of them! + final String keysPacked = consumerSecret + "&" + StringUtils.defaultString(tokens.getTokenSecret()); // both even if empty some of them! final @NonNull String joinedParams = StringUtils.join(paramsEncoded.toArray(), '&'); final String requestPacked = method + "&" + OAuth.percentEncode((https ? "https" : "http") + "://" + host + path) + "&" + OAuth.percentEncode(joinedParams); params.put("oauth_signature", CryptUtils.base64Encode(CryptUtils.hashHmac(requestPacked, keysPacked))); @@ -48,7 +46,7 @@ public class OAuth { * @param url * @return */ - static String percentEncode(@NonNull String url) { + static String percentEncode(@NonNull final String url) { return StringUtils.replace(Network.rfc3986URLEncode(url), "*", "%2A"); } } diff --git a/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java b/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java index eb56f0b..5efea02 100644 --- a/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java +++ b/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java @@ -40,6 +40,8 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { private static final int STATUS_ERROR = 0; private static final int STATUS_SUCCESS = 1; private static final int STATUS_ERROR_EXT_MSG = 2; + private static final Pattern PARAMS_PATTERN_1 = Pattern.compile("oauth_token=([\\w_.-]+)"); + private static final Pattern PARAMS_PATTERN_2 = Pattern.compile("oauth_token_secret=([\\w_.-]+)"); @NonNull private String host = StringUtils.EMPTY; @NonNull private String pathRequest = StringUtils.EMPTY; @@ -51,18 +53,16 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { @NonNull private String callback = StringUtils.EMPTY; private String OAtoken = null; private String OAtokenSecret = null; - private final Pattern paramsPattern1 = Pattern.compile("oauth_token=([a-zA-Z0-9\\-\\_.]+)"); - private final Pattern paramsPattern2 = Pattern.compile("oauth_token_secret=([a-zA-Z0-9\\-\\_.]+)"); @InjectView(R.id.start) protected Button startButton; @InjectView(R.id.auth_1) protected TextView auth_1; @InjectView(R.id.auth_2) protected TextView auth_2; private ProgressDialog requestTokenDialog = null; private ProgressDialog changeTokensDialog = null; - private Handler requestTokenHandler = new Handler() { + private final Handler requestTokenHandler = new Handler() { @Override - public void handleMessage(Message msg) { + public void handleMessage(final Message msg) { if (requestTokenDialog != null && requestTokenDialog.isShowing()) { requestTokenDialog.dismiss(); } @@ -85,10 +85,10 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { }; - private Handler changeTokensHandler = new Handler() { + private final Handler changeTokensHandler = new Handler() { @Override - public void handleMessage(Message msg) { + public void handleMessage(final Message msg) { if (changeTokensDialog != null && changeTokensDialog.isShowing()) { changeTokensDialog.dismiss(); } @@ -105,10 +105,10 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { }; @Override - public void onCreate(Bundle savedInstanceState) { + public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState, R.layout.authorization_activity); - Bundle extras = getIntent().getExtras(); + final Bundle extras = getIntent().getExtras(); if (extras != null) { host = BundleUtils.getString(extras, Intents.EXTRA_OAUTH_HOST, host); pathRequest = BundleUtils.getString(extras, Intents.EXTRA_OAUTH_PATH_REQUEST, pathRequest); @@ -125,7 +125,7 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { auth_1.setText(getAuthExplainShort()); auth_2.setText(getAuthExplainLong()); - ImmutablePair<String, String> tempToken = getTempTokens(); + final ImmutablePair<String, String> tempToken = getTempTokens(); OAtoken = tempToken.left; OAtokenSecret = tempToken.right; @@ -167,7 +167,7 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { final Parameters params = new Parameters(); params.put("oauth_callback", callback); final String method = "GET"; - OAuth.signOAuth(host, pathRequest, method, https, params, null, null, consumerKey, consumerSecret); + OAuth.signOAuth(host, pathRequest, method, https, params, new OAuthTokens(null, null), consumerKey, consumerSecret); final HttpResponse response = Network.getRequest(getUrlPrefix() + host + pathRequest, params); if (Network.isSuccess(response)) { @@ -176,11 +176,11 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { int status = STATUS_ERROR; if (StringUtils.isNotBlank(line)) { assert line != null; - final MatcherWrapper paramsMatcher1 = new MatcherWrapper(paramsPattern1, line); + final MatcherWrapper paramsMatcher1 = new MatcherWrapper(PARAMS_PATTERN_1, line); if (paramsMatcher1.find()) { OAtoken = paramsMatcher1.group(1); } - final MatcherWrapper paramsMatcher2 = new MatcherWrapper(paramsPattern2, line); + final MatcherWrapper paramsMatcher2 = new MatcherWrapper(PARAMS_PATTERN_2, line); if (paramsMatcher2.find()) { OAtokenSecret = paramsMatcher2.group(1); } @@ -193,9 +193,7 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { final String encodedParams = EntityUtils.toString(new UrlEncodedFormEntity(paramsBrowser)); startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getUrlPrefix() + host + pathAuthorize + "?" + encodedParams))); status = STATUS_SUCCESS; - } catch (ParseException e) { - Log.e("OAuthAuthorizationActivity.requestToken", e); - } catch (IOException e) { + } catch (ParseException | IOException e) { Log.e("OAuthAuthorizationActivity.requestToken", e); } } @@ -221,17 +219,17 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { final Parameters params = new Parameters("oauth_verifier", verifier); final String method = "POST"; - OAuth.signOAuth(host, pathAccess, method, https, params, OAtoken, OAtokenSecret, consumerKey, consumerSecret); + OAuth.signOAuth(host, pathAccess, method, https, params, new OAuthTokens(OAtoken, OAtokenSecret), consumerKey, consumerSecret); final String line = StringUtils.defaultString(Network.getResponseData(Network.postRequest(getUrlPrefix() + host + pathAccess, params))); OAtoken = ""; OAtokenSecret = ""; - final MatcherWrapper paramsMatcher1 = new MatcherWrapper(paramsPattern1, line); + final MatcherWrapper paramsMatcher1 = new MatcherWrapper(PARAMS_PATTERN_1, line); if (paramsMatcher1.find()) { OAtoken = paramsMatcher1.group(1); } - final MatcherWrapper paramsMatcher2 = new MatcherWrapper(paramsPattern2, line); + final MatcherWrapper paramsMatcher2 = new MatcherWrapper(PARAMS_PATTERN_2, line); if (paramsMatcher2.find() && paramsMatcher2.groupCount() > 0) { OAtokenSecret = paramsMatcher2.group(1); } @@ -244,7 +242,7 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { setTokens(OAtoken, OAtokenSecret, true); status = AUTHENTICATED; } - } catch (Exception e) { + } catch (final Exception e) { Log.e("OAuthAuthorizationActivity.changeToken", e); } @@ -258,7 +256,7 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { private class StartListener implements View.OnClickListener { @Override - public void onClick(View arg0) { + public void onClick(final View arg0) { if (requestTokenDialog == null) { requestTokenDialog = new ProgressDialog(OAuthAuthorizationActivity.this); requestTokenDialog.setCancelable(false); @@ -333,7 +331,7 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { * @return String with a more detailed error message (user-facing, localized), can be empty */ @SuppressWarnings("static-method") - protected String getExtendedErrorMsg(HttpResponse response) { + protected String getExtendedErrorMsg(final HttpResponse response) { return StringUtils.EMPTY; } @@ -363,14 +361,14 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { @NonNull public final String consumerSecret; @NonNull public final String callback; - public OAuthParameters(@NonNull String host, - @NonNull String pathRequest, - @NonNull String pathAuthorize, - @NonNull String pathAccess, - boolean https, - @NonNull String consumerKey, - @NonNull String consumerSecret, - @NonNull String callback) { + public OAuthParameters(@NonNull final String host, + @NonNull final String pathRequest, + @NonNull final String pathAuthorize, + @NonNull final String pathAccess, + final boolean https, + @NonNull final String consumerKey, + @NonNull final String consumerSecret, + @NonNull final String callback) { this.host = host; this.pathRequest = pathRequest; this.pathAuthorize = pathAuthorize; @@ -381,7 +379,7 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { this.callback = callback; } - public void setOAuthExtras(Intent intent) { + public void setOAuthExtras(final Intent intent) { if (intent != null) { intent.putExtra(Intents.EXTRA_OAUTH_HOST, host); intent.putExtra(Intents.EXTRA_OAUTH_PATH_REQUEST, pathRequest); diff --git a/main/src/cgeo/geocaching/network/OAuthTokens.java b/main/src/cgeo/geocaching/network/OAuthTokens.java new file mode 100644 index 0000000..9f45e7f --- /dev/null +++ b/main/src/cgeo/geocaching/network/OAuthTokens.java @@ -0,0 +1,38 @@ +package cgeo.geocaching.network; + +import cgeo.geocaching.connector.oc.OCApiConnector; +import cgeo.geocaching.settings.Settings; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.eclipse.jdt.annotation.NonNull; + +import android.util.Pair; + +public class OAuthTokens extends Pair<String, String> { + + public OAuthTokens(@NonNull final OCApiConnector connector) { + this(Settings.getTokenPair(connector.getTokenPublicPrefKeyId(), connector.getTokenSecretPrefKeyId())); + } + + public OAuthTokens(final ImmutablePair<String, String> tokenPair) { + this(tokenPair.left, tokenPair.right); + } + + public OAuthTokens(final String pub, final String secret) { + super(pub, secret); + } + + public boolean isValid() { + return StringUtils.isNotBlank(getTokenPublic()) && StringUtils.isNotBlank(getTokenSecret()); + } + + public String getTokenPublic() { + return first; + } + + public String getTokenSecret() { + return second; + } + +} diff --git a/main/src/cgeo/geocaching/network/SmileyImage.java b/main/src/cgeo/geocaching/network/SmileyImage.java new file mode 100644 index 0000000..ebac2bb --- /dev/null +++ b/main/src/cgeo/geocaching/network/SmileyImage.java @@ -0,0 +1,34 @@ +package cgeo.geocaching.network; + +import cgeo.geocaching.list.StoredList; + +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; + +import android.graphics.Bitmap; +import android.graphics.drawable.BitmapDrawable; +import android.widget.TextView; + +public class SmileyImage extends HtmlImage { + + public SmileyImage(final String geocode, final TextView view) { + super(geocode, false, StoredList.STANDARD_LIST_ID, false, view); + } + + @Override + protected Pair<BitmapDrawable, Boolean> scaleImage(final Pair<Bitmap, Boolean> loadResult) { + final Bitmap bitmap = loadResult.getLeft(); + BitmapDrawable drawable; + if (bitmap != null) { + final int lineHeight = (int) (view.getLineHeight() * 0.8); + drawable = new BitmapDrawable(view.getResources(), bitmap); + final int width = drawable.getIntrinsicWidth() * lineHeight / drawable.getIntrinsicHeight(); + drawable.setBounds(0, 0, width, lineHeight); + } + else { + drawable = null; + } + return new ImmutablePair<>(drawable, loadResult.getRight()); + } + +} diff --git a/main/src/cgeo/geocaching/network/StatusUpdater.java b/main/src/cgeo/geocaching/network/StatusUpdater.java index 82650d1..bc4a5db 100644 --- a/main/src/cgeo/geocaching/network/StatusUpdater.java +++ b/main/src/cgeo/geocaching/network/StatusUpdater.java @@ -4,8 +4,7 @@ import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.utils.RxUtils; import cgeo.geocaching.utils.Version; -import org.json.JSONException; -import org.json.JSONObject; +import com.fasterxml.jackson.databind.node.ObjectNode; import rx.functions.Action0; import rx.subjects.BehaviorSubject; @@ -31,11 +30,11 @@ public class StatusUpdater { this.url = url; } - Status(final JSONObject response) { - message = get(response, "message"); - messageId = get(response, "message_id"); - icon = get(response, "icon"); - url = get(response, "url"); + Status(final ObjectNode response) { + message = response.path("message").asText(null); + messageId = response.path("message_id").asText(null); + icon = response.path("icon").asText(null); + url = response.path("url").asText(null); } final static public Status closeoutStatus = @@ -55,7 +54,7 @@ public class StatusUpdater { RxUtils.networkScheduler.createWorker().schedulePeriodically(new Action0() { @Override public void call() { - final JSONObject response = + final ObjectNode response = Network.requestJSON("http://status.cgeo.org/api/status.json", new Parameters("version_code", String.valueOf(Version.getVersionCode(CgeoApplication.getInstance())), "version_name", Version.getVersionName(CgeoApplication.getInstance()), @@ -67,12 +66,4 @@ public class StatusUpdater { }, 0, 1800, TimeUnit.SECONDS); } - private static String get(final JSONObject json, final String key) { - try { - return json.getString(key); - } catch (final JSONException e) { - return null; - } - } - } diff --git a/main/src/cgeo/geocaching/playservices/LocationProvider.java b/main/src/cgeo/geocaching/playservices/LocationProvider.java new file mode 100644 index 0000000..714eaeb --- /dev/null +++ b/main/src/cgeo/geocaching/playservices/LocationProvider.java @@ -0,0 +1,99 @@ +package cgeo.geocaching.playservices; + +import cgeo.geocaching.sensors.GeoData; +import cgeo.geocaching.sensors.IGeoData; +import cgeo.geocaching.utils.Log; +import cgeo.geocaching.utils.RxUtils.ConnectableLooperCallbacks; + +import com.google.android.gms.common.ConnectionResult; +import com.google.android.gms.common.GooglePlayServicesClient.ConnectionCallbacks; +import com.google.android.gms.common.GooglePlayServicesClient.OnConnectionFailedListener; +import com.google.android.gms.location.LocationClient; +import com.google.android.gms.location.LocationListener; +import com.google.android.gms.location.LocationRequest; + +import rx.Observable; +import rx.Observable.OnSubscribe; +import rx.Subscriber; +import rx.observables.ConnectableObservable; +import rx.subjects.BehaviorSubject; + +import android.content.Context; +import android.location.Location; +import android.os.Bundle; + +import java.util.concurrent.TimeUnit; + +public class LocationProvider implements OnSubscribe<IGeoData>, ConnectionCallbacks, OnConnectionFailedListener, LocationListener { + + private final BehaviorSubject<IGeoData> subject; + private final LocationClient locationClient; + private static final LocationRequest LOCATION_REQUEST = + LocationRequest.create().setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY).setInterval(2000).setInterval(1000); + private static boolean firstLocation = true; + + /** + * Build a new geo data provider object. + * <p/> + * There is no need to instantiate more than one such object in an application, as observers can be added + * at will. + * + * @param context the context used to retrieve the system services + */ + protected LocationProvider(final Context context) { + locationClient = new LocationClient(context, this, this); + subject = BehaviorSubject.create(); + } + + public static Observable<IGeoData> create(final Context context) { + final LocationProvider provider = new LocationProvider(context); + return provider.worker.refCount(); + } + + @Override + public void call(final Subscriber<? super IGeoData> subscriber) { + subject.subscribe(subscriber); + } + + final ConnectableObservable<IGeoData> worker = new ConnectableLooperCallbacks<IGeoData>(this, 2500, TimeUnit.MILLISECONDS) { + @Override + protected void onStart() { + Log.d("LocationProvider: starting the location listener"); + locationClient.connect(); + } + + @Override + protected void onStop() { + Log.d("LocationProvider: stopping the location listener"); + locationClient.removeLocationUpdates(LocationProvider.this); + locationClient.disconnect(); + } + }; + + @Override + public void onConnected(final Bundle bundle) { + if (firstLocation) { + final Location initialLocation = locationClient.getLastLocation(); + if (initialLocation != null) { + subject.onNext(new GeoData(initialLocation)); + } + firstLocation = false; + } + locationClient.requestLocationUpdates(LOCATION_REQUEST, this); + } + + @Override + public void onDisconnected() { + } + + @Override + public void onConnectionFailed(final ConnectionResult connectionResult) { + Log.e("cannot connect to Google Play location service: " + connectionResult); + subject.onError(new RuntimeException("Connection failed: " + connectionResult)); + } + + @Override + public void onLocationChanged(final Location location) { + subject.onNext(new GeoData(location)); + } +} diff --git a/main/src/cgeo/geocaching/sensors/GeoData.java b/main/src/cgeo/geocaching/sensors/GeoData.java index c0b3974..ea6c241 100644 --- a/main/src/cgeo/geocaching/sensors/GeoData.java +++ b/main/src/cgeo/geocaching/sensors/GeoData.java @@ -6,18 +6,10 @@ import cgeo.geocaching.geopoint.Geopoint; import android.location.Location; import android.location.LocationManager; -class GeoData extends Location implements IGeoData { - private final boolean gpsEnabled; - private final int satellitesVisible; - private final int satellitesFixed; - private final boolean pseudoLocation; +public class GeoData extends Location implements IGeoData { - GeoData(final Location location, final boolean gpsEnabled, final int satellitesVisible, final int satellitesFixed, final boolean pseudoLocation) { + public GeoData(final Location location) { super(location); - this.gpsEnabled = gpsEnabled; - this.satellitesVisible = satellitesVisible; - this.satellitesFixed = satellitesFixed; - this.pseudoLocation = pseudoLocation; } @Override @@ -32,6 +24,9 @@ class GeoData extends Location implements IGeoData { if (provider.equals(LocationManager.NETWORK_PROVIDER)) { return LocationProviderType.NETWORK; } + if (provider.equals("fused")) { + return LocationProviderType.FUSED; + } return LocationProviderType.LAST; } @@ -44,24 +39,4 @@ class GeoData extends Location implements IGeoData { public Geopoint getCoords() { return new Geopoint(this); } - - @Override - public boolean getGpsEnabled() { - return gpsEnabled; - } - - @Override - public int getSatellitesVisible() { - return satellitesVisible; - } - - @Override - public int getSatellitesFixed() { - return satellitesFixed; - } - - @Override - public boolean isPseudoLocation() { - return pseudoLocation; - } } diff --git a/main/src/cgeo/geocaching/sensors/GeoDataProvider.java b/main/src/cgeo/geocaching/sensors/GeoDataProvider.java index a4799cb..7645d7f 100644 --- a/main/src/cgeo/geocaching/sensors/GeoDataProvider.java +++ b/main/src/cgeo/geocaching/sensors/GeoDataProvider.java @@ -1,25 +1,15 @@ package cgeo.geocaching.sensors; import cgeo.geocaching.utils.Log; -import cgeo.geocaching.utils.StartableHandlerThread; - -import org.apache.commons.lang3.StringUtils; +import cgeo.geocaching.utils.RxUtils.ConnectableLooperCallbacks; import rx.Observable; import rx.Observable.OnSubscribe; import rx.Subscriber; -import rx.Subscription; -import rx.android.schedulers.AndroidSchedulers; -import rx.functions.Action0; -import rx.functions.Action1; import rx.observables.ConnectableObservable; import rx.subjects.BehaviorSubject; -import rx.subscriptions.CompositeSubscription; -import rx.subscriptions.Subscriptions; import android.content.Context; -import android.location.GpsSatellite; -import android.location.GpsStatus; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; @@ -29,20 +19,10 @@ import java.util.concurrent.TimeUnit; public class GeoDataProvider implements OnSubscribe<IGeoData> { - private static final String LAST_LOCATION_PSEUDO_PROVIDER = "last"; private final LocationManager geoManager; private final LocationData gpsLocation = new LocationData(); private final LocationData netLocation = new LocationData(); private final BehaviorSubject<IGeoData> subject; - private static final StartableHandlerThread handlerThread = - new StartableHandlerThread("GeoDataProvider thread", android.os.Process.THREAD_PRIORITY_BACKGROUND); - static { - handlerThread.start(); - } - - public boolean gpsEnabled = false; - public int satellitesVisible = 0; - public int satellitesFixed = 0; private static class LocationData { public Location location; @@ -85,62 +65,32 @@ public class GeoDataProvider implements OnSubscribe<IGeoData> { subject.subscribe(subscriber); } - final ConnectableObservable<IGeoData> worker = new ConnectableObservable<IGeoData>(this) { - private int debugSessionCounter = 0; - - private final Object lock = new Object(); - private int count = 0; - - final private GpsStatus.Listener gpsStatusListener = new GpsStatusListener(); - final private Listener networkListener = new Listener(LocationManager.NETWORK_PROVIDER, netLocation); - final private Listener gpsListener = new Listener(LocationManager.GPS_PROVIDER, gpsLocation); + final ConnectableObservable<IGeoData> worker = new ConnectableLooperCallbacks<IGeoData>(this, 2500, TimeUnit.MILLISECONDS) { + private final Listener networkListener = new Listener(LocationManager.NETWORK_PROVIDER, netLocation); + private final Listener gpsListener = new Listener(LocationManager.GPS_PROVIDER, gpsLocation); @Override - public void connect(Action1<? super Subscription> connection) { - final CompositeSubscription subscription = new CompositeSubscription(); - AndroidSchedulers.handlerThread(handlerThread.getHandler()).createWorker().schedule(new Action0() { - @Override - public void call() { - synchronized(lock) { - if (count++ == 0) { - Log.d("GeoDataProvider: starting the GPS and network listeners" + " (" + ++debugSessionCounter + ")"); - geoManager.addGpsStatusListener(gpsStatusListener); - for (final Listener listener : new Listener[] { networkListener, gpsListener }) { - try { - geoManager.requestLocationUpdates(listener.locationProvider, 0, 0, listener); - } catch (final Exception e) { - Log.w("There is no location provider " + listener.locationProvider); - } - } - } - } - - subscription.add(Subscriptions.create(new Action0() { - @Override - public void call() { - AndroidSchedulers.handlerThread(handlerThread.getHandler()).createWorker().schedule(new Action0() { - @Override - public void call() { - synchronized (lock) { - if (--count == 0) { - Log.d("GeoDataProvider: stopping the GPS and network listeners" + " (" + debugSessionCounter + ")"); - geoManager.removeUpdates(networkListener); - geoManager.removeUpdates(gpsListener); - geoManager.removeGpsStatusListener(gpsStatusListener); - } - } - } - }, 2500, TimeUnit.MILLISECONDS); - } - })); + protected void onStart() { + Log.d("GeoDataProvider: starting the GPS and network listeners"); + for (final Listener listener : new Listener[]{networkListener, gpsListener}) { + try { + geoManager.requestLocationUpdates(listener.locationProvider, 0, 0, listener); + } catch (final Exception e) { + Log.w("There is no location provider " + listener.locationProvider); } - }); - connection.call(subscription); + } + } + + @Override + protected void onStop() { + Log.d("GeoDataProvider: stopping the GPS and network listeners"); + geoManager.removeUpdates(networkListener); + geoManager.removeUpdates(gpsListener); } }; private IGeoData findInitialLocation() { - final Location initialLocation = new Location(LAST_LOCATION_PSEUDO_PROVIDER); + final Location initialLocation = new Location("initial"); try { // Try to find a sensible initial location from the last locations known to Android. final Location lastGpsLocation = geoManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); @@ -167,7 +117,7 @@ public class GeoDataProvider implements OnSubscribe<IGeoData> { } // Start with an historical GeoData just in case someone queries it before we get // a chance to get any information. - return new GeoData(initialLocation, false, 0, 0, true); + return new GeoData(initialLocation); } private static void copyCoords(final Location target, final Location source) { @@ -206,54 +156,6 @@ public class GeoDataProvider implements OnSubscribe<IGeoData> { } } - private final class GpsStatusListener implements GpsStatus.Listener { - - @Override - public void onGpsStatusChanged(final int event) { - boolean changed = false; - switch (event) { - case GpsStatus.GPS_EVENT_FIRST_FIX: - case GpsStatus.GPS_EVENT_SATELLITE_STATUS: { - final GpsStatus status = geoManager.getGpsStatus(null); - int visible = 0; - int fixed = 0; - for (final GpsSatellite satellite : status.getSatellites()) { - if (satellite.usedInFix()) { - fixed++; - } - visible++; - } - if (visible != satellitesVisible || fixed != satellitesFixed) { - satellitesVisible = visible; - satellitesFixed = fixed; - changed = true; - } - break; - } - case GpsStatus.GPS_EVENT_STARTED: - if (!gpsEnabled) { - gpsEnabled = true; - changed = true; - } - break; - case GpsStatus.GPS_EVENT_STOPPED: - if (gpsEnabled) { - gpsEnabled = false; - satellitesFixed = 0; - satellitesVisible = 0; - changed = true; - } - break; - default: - throw new IllegalStateException(); - } - - if (changed) { - selectBest(); - } - } - } - private LocationData best() { if (gpsLocation.isRecent() || !netLocation.isValid()) { return gpsLocation.isValid() ? gpsLocation : null; @@ -274,9 +176,7 @@ public class GeoDataProvider implements OnSubscribe<IGeoData> { } // We do not necessarily get signalled when satellites go to 0/0. - final int visible = gpsLocation.isRecent() ? satellitesVisible : 0; - final boolean pseudoLocation = StringUtils.equals(locationData.location.getProvider(), LAST_LOCATION_PSEUDO_PROVIDER); - final IGeoData current = new GeoData(locationData.location, gpsEnabled, visible, satellitesFixed, pseudoLocation); + final IGeoData current = new GeoData(locationData.location); subject.onNext(current); } diff --git a/main/src/cgeo/geocaching/sensors/GpsStatusProvider.java b/main/src/cgeo/geocaching/sensors/GpsStatusProvider.java new file mode 100644 index 0000000..61243c3 --- /dev/null +++ b/main/src/cgeo/geocaching/sensors/GpsStatusProvider.java @@ -0,0 +1,112 @@ +package cgeo.geocaching.sensors; + +import cgeo.geocaching.sensors.GpsStatusProvider.Status; +import cgeo.geocaching.utils.Log; +import cgeo.geocaching.utils.RxUtils.ConnectableLooperCallbacks; + +import rx.Observable; +import rx.Observable.OnSubscribe; +import rx.Subscriber; +import rx.observables.ConnectableObservable; +import rx.subjects.BehaviorSubject; + +import android.content.Context; +import android.location.GpsSatellite; +import android.location.GpsStatus; +import android.location.LocationManager; + +public class GpsStatusProvider implements OnSubscribe<Status> { + + public static class Status { + final public boolean gpsEnabled; + final public int satellitesVisible; + final public int satellitesFixed; + + public Status(final boolean gpsEnabled, final int satellitesVisible, final int satellitesFixed) { + this.gpsEnabled = gpsEnabled; + this.satellitesVisible = satellitesVisible; + this.satellitesFixed = satellitesFixed; + } + } + + private final LocationManager geoManager; + private final BehaviorSubject<Status> subject; + + private Status latest = new Status(false, 0, 0); + + /** + * Build a new gps status provider object. + * <p/> + * There is no need to instantiate more than one such object in an application, as observers can be added + * at will. + * + * @param context the context used to retrieve the system services + */ + protected GpsStatusProvider(final Context context) { + geoManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); + subject = BehaviorSubject.create(latest); + } + + public static Observable<Status> create(final Context context) { + final GpsStatusProvider provider = new GpsStatusProvider(context); + return provider.worker.refCount(); + } + + @Override + public void call(final Subscriber<? super Status> subscriber) { + subject.subscribe(subscriber); + } + + final ConnectableObservable<Status> worker = new ConnectableLooperCallbacks<Status>(this) { + private final GpsStatus.Listener gpsStatusListener = new GpsStatusListener(); + + @Override + protected void onStart() { + Log.d("GpsStatusProvider: starting the GPS status listener"); + geoManager.addGpsStatusListener(gpsStatusListener); + } + + @Override + protected void onStop() { + Log.d("GpsStatusProvider: stopping the GPS status listener"); + geoManager.removeGpsStatusListener(gpsStatusListener); + } + }; + + private final class GpsStatusListener implements GpsStatus.Listener { + + @Override + public void onGpsStatusChanged(final int event) { + switch (event) { + case GpsStatus.GPS_EVENT_FIRST_FIX: + case GpsStatus.GPS_EVENT_SATELLITE_STATUS: { + final GpsStatus status = geoManager.getGpsStatus(null); + int visible = 0; + int fixed = 0; + for (final GpsSatellite satellite : status.getSatellites()) { + if (satellite.usedInFix()) { + fixed++; + } + visible++; + } + if (visible == latest.satellitesVisible && fixed == latest.satellitesFixed) { + return; + } + latest = new Status(true, visible, fixed); + break; + } + case GpsStatus.GPS_EVENT_STARTED: + latest = new Status(true, 0, 0); + break; + case GpsStatus.GPS_EVENT_STOPPED: + latest = new Status(false, 0, 0); + break; + default: + throw new IllegalStateException(); + } + + subject.onNext(latest); + } + } + +} diff --git a/main/src/cgeo/geocaching/sensors/IGeoData.java b/main/src/cgeo/geocaching/sensors/IGeoData.java index 5b4f046..b78b805 100644 --- a/main/src/cgeo/geocaching/sensors/IGeoData.java +++ b/main/src/cgeo/geocaching/sensors/IGeoData.java @@ -10,13 +10,8 @@ public interface IGeoData { public Location getLocation(); public LocationProviderType getLocationProvider(); - public boolean isPseudoLocation(); - public Geopoint getCoords(); public float getBearing(); public float getSpeed(); public float getAccuracy(); - public boolean getGpsEnabled(); - public int getSatellitesVisible(); - public int getSatellitesFixed(); } diff --git a/main/src/cgeo/geocaching/settings/Settings.java b/main/src/cgeo/geocaching/settings/Settings.java index 01ebd6f..b1c5c31 100644 --- a/main/src/cgeo/geocaching/settings/Settings.java +++ b/main/src/cgeo/geocaching/settings/Settings.java @@ -154,7 +154,6 @@ public class Settings { e.putInt(getKey(R.string.pref_defaultNavigationTool2), old.getInt(getKey(R.string.pref_defaultNavigationTool2), NavigationAppsEnum.INTERNAL_MAP.id)); e.putInt(getKey(R.string.pref_livemapstrategy), old.getInt(getKey(R.string.pref_livemapstrategy), Strategy.AUTO.id)); e.putBoolean(getKey(R.string.pref_debug), old.getBoolean(getKey(R.string.pref_debug), false)); - e.putBoolean(getKey(R.string.pref_hidelivemaphint), old.getInt(getKey(R.string.pref_hidelivemaphint), 0) != 0); e.putInt(getKey(R.string.pref_livemaphintshowcount), old.getInt(getKey(R.string.pref_livemaphintshowcount), 0)); e.putInt(getKey(R.string.pref_settingsversion), 1); // mark migrated @@ -612,7 +611,7 @@ public class Settings { mapSource = MapProviderFactory.getMapSource(id); if (mapSource != null) { // don't use offline maps if the map file is not valid - if ((!(mapSource instanceof OfflineMapSource)) || (isValidMapFile())) { + if (!(mapSource instanceof OfflineMapSource) || isValidMapFile()) { return mapSource; } } @@ -835,14 +834,6 @@ public class Settings { return Log.isDebug(); } - public static boolean getHideLiveMapHint() { - return getBoolean(R.string.pref_hidelivemaphint, false); - } - - public static void setHideLiveHint(final boolean hide) { - putBoolean(R.string.pref_hidelivemaphint, hide); - } - public static int getLiveMapHintShowCount() { return getInt(R.string.pref_livemaphintshowcount, 0); } diff --git a/main/src/cgeo/geocaching/sorting/PopularityRatioComparator.java b/main/src/cgeo/geocaching/sorting/PopularityRatioComparator.java index 57a69ee..a2da6ee 100644 --- a/main/src/cgeo/geocaching/sorting/PopularityRatioComparator.java +++ b/main/src/cgeo/geocaching/sorting/PopularityRatioComparator.java @@ -26,7 +26,8 @@ public class PopularityRatioComparator extends AbstractCacheComparator { if ((ratio2 - ratio1) > 0.0f) { return 1; - } else if ((ratio2 - ratio1) < 0.0f) { + } + if ((ratio2 - ratio1) < 0.0f) { return -1; } diff --git a/main/src/cgeo/geocaching/sorting/SortActionProvider.java b/main/src/cgeo/geocaching/sorting/SortActionProvider.java index e9e65a0..61b2ffb 100644 --- a/main/src/cgeo/geocaching/sorting/SortActionProvider.java +++ b/main/src/cgeo/geocaching/sorting/SortActionProvider.java @@ -136,9 +136,7 @@ public class SortActionProvider extends ActionProvider implements OnMenuItemClic final CacheComparator comparator = cacheComparator.newInstance(); onClickListener.call(comparator); } - } catch (final InstantiationException e) { - Log.e("selectComparator", e); - } catch (final IllegalAccessException e) { + } catch (final InstantiationException | IllegalAccessException e) { Log.e("selectComparator", e); } } diff --git a/main/src/cgeo/geocaching/twitter/Twitter.java b/main/src/cgeo/geocaching/twitter/Twitter.java index c89c0b6..253d91f 100644 --- a/main/src/cgeo/geocaching/twitter/Twitter.java +++ b/main/src/cgeo/geocaching/twitter/Twitter.java @@ -10,6 +10,7 @@ import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.GeopointFormatter.Format; import cgeo.geocaching.network.Network; import cgeo.geocaching.network.OAuth; +import cgeo.geocaching.network.OAuthTokens; import cgeo.geocaching.network.Parameters; import cgeo.geocaching.settings.Settings; import cgeo.geocaching.utils.Log; @@ -17,6 +18,7 @@ import cgeo.geocaching.utils.LogTemplateProvider; import cgeo.geocaching.utils.LogTemplateProvider.LogContext; import ch.boye.httpclientandroidlib.HttpResponse; + import org.apache.commons.lang3.StringUtils; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; @@ -25,7 +27,7 @@ public final class Twitter { private static final String HASH_PREFIX_WITH_BLANK = " #"; private static final int MAX_TWEET_SIZE = 140; - public static void postTweetCache(String geocode, final @Nullable LogEntry logEntry) { + public static void postTweetCache(final String geocode, final @Nullable LogEntry logEntry) { final Geocache cache = DataStore.loadCache(geocode, LoadFlags.LOAD_CACHE_OR_DB); if (cache == null) { return; @@ -33,7 +35,7 @@ public final class Twitter { postTweet(CgeoApplication.getInstance(), getStatusMessage(cache, logEntry), null); } - public static void postTweetTrackable(String geocode, final @Nullable LogEntry logEntry) { + public static void postTweetTrackable(final String geocode, final @Nullable LogEntry logEntry) { final Trackable trackable = DataStore.loadTrackable(geocode); if (trackable == null) { return; @@ -48,7 +50,7 @@ public final class Twitter { try { final String status = shortenToMaxSize(statusIn); - Parameters parameters = new Parameters("status", status); + final Parameters parameters = new Parameters("status", status); if (coords != null) { parameters.put( "lat", coords.format(Format.LAT_DECDEGREE_RAW), @@ -56,7 +58,7 @@ public final class Twitter { "display_coordinates", "true"); } - OAuth.signOAuth("api.twitter.com", "/1.1/statuses/update.json", "POST", true, parameters, Settings.getTokenPublic(), Settings.getTokenSecret(), Settings.getKeyConsumerPublic(), Settings.getKeyConsumerSecret()); + OAuth.signOAuth("api.twitter.com", "/1.1/statuses/update.json", "POST", true, parameters, new OAuthTokens(Settings.getTokenPublic(), Settings.getTokenSecret()), Settings.getKeyConsumerPublic(), Settings.getKeyConsumerSecret()); final HttpResponse httpResponse = Network.postRequest("https://api.twitter.com/1.1/statuses/update.json", parameters); if (httpResponse != null) { if (httpResponse.getStatusLine().getStatusCode() == 200) { @@ -67,13 +69,13 @@ public final class Twitter { } else { Log.e("Tweet could not be posted. Reason: httpResponse Object is null"); } - } catch (Exception e) { + } catch (final Exception e) { Log.e("Twitter.postTweet", e); } } private static String shortenToMaxSize(final String status) { - String result = StringUtils.trim(status); + final String result = StringUtils.trim(status); if (StringUtils.length(result) > MAX_TWEET_SIZE) { return StringUtils.substring(result, 0, MAX_TWEET_SIZE - 1) + '…'; } @@ -98,7 +100,7 @@ public final class Twitter { } private static String appendHashTags(final String status) { - StringBuilder builder = new StringBuilder(status); + final StringBuilder builder = new StringBuilder(status); appendHashTag(builder, "cgeo"); appendHashTag(builder, "geocaching"); return builder.toString(); diff --git a/main/src/cgeo/geocaching/ui/DecryptTextClickListener.java b/main/src/cgeo/geocaching/ui/DecryptTextClickListener.java index e2e587e..3af950f 100644 --- a/main/src/cgeo/geocaching/ui/DecryptTextClickListener.java +++ b/main/src/cgeo/geocaching/ui/DecryptTextClickListener.java @@ -1,40 +1,37 @@ -package cgeo.geocaching.ui;
-
-import cgeo.geocaching.utils.CryptUtils;
-
-import org.eclipse.jdt.annotation.NonNull;
-
-import android.text.Spannable;
-import android.view.View;
-import android.widget.TextView;
-
-public class DecryptTextClickListener implements View.OnClickListener {
-
- @NonNull private final TextView targetView;
-
- public DecryptTextClickListener(@NonNull final TextView targetView) {
- this.targetView = targetView;
- }
-
- @Override
- public final void onClick(final View view) {
- try {
- // do not run the click listener if a link was clicked
- if (targetView.getSelectionStart() != -1 || targetView.getSelectionEnd() != -1) {
- return;
- }
-
- CharSequence text = targetView.getText();
- if (text instanceof Spannable) {
- Spannable span = (Spannable) text;
- targetView.setText(CryptUtils.rot13(span));
- }
- else {
- String string = (String) text;
- targetView.setText(CryptUtils.rot13(string));
- }
- } catch (RuntimeException e) {
- // nothing
- }
- }
-}
+package cgeo.geocaching.ui; + +import cgeo.geocaching.utils.CryptUtils; + +import org.eclipse.jdt.annotation.NonNull; + +import android.text.Spannable; +import android.view.View; +import android.widget.TextView; + +public class DecryptTextClickListener implements View.OnClickListener { + + @NonNull private final TextView targetView; + + public DecryptTextClickListener(@NonNull final TextView targetView) { + this.targetView = targetView; + } + + @Override + public final void onClick(final View view) { + try { + // do not run the click listener if a link was clicked + if (targetView.getSelectionStart() != -1 || targetView.getSelectionEnd() != -1) { + return; + } + + CharSequence text = targetView.getText(); + if (text instanceof Spannable) { + targetView.setText(CryptUtils.rot13((Spannable) text)); + } else { + targetView.setText(CryptUtils.rot13((String) text)); + } + } catch (final RuntimeException ignore) { + // nothing + } + } +} diff --git a/main/src/cgeo/geocaching/ui/ImagesList.java b/main/src/cgeo/geocaching/ui/ImagesList.java index 8bd4ac2..458f8db 100644 --- a/main/src/cgeo/geocaching/ui/ImagesList.java +++ b/main/src/cgeo/geocaching/ui/ImagesList.java @@ -102,7 +102,7 @@ public class ImagesList { imagesView = ButterKnife.findById(parentView, R.id.spoiler_list); - final HtmlImage imgGetter = new HtmlImage(geocode, true, offline ? StoredList.STANDARD_LIST_ID : StoredList.TEMPORARY_LIST_ID, false); + final HtmlImage imgGetter = new HtmlImage(geocode, true, offline ? StoredList.STANDARD_LIST_ID : StoredList.TEMPORARY_LIST.id, false); for (final Image img : images) { final LinearLayout rowView = (LinearLayout) inflater.inflate(R.layout.cache_image_item, imagesView, false); diff --git a/main/src/cgeo/geocaching/ui/dialog/DateDialog.java b/main/src/cgeo/geocaching/ui/dialog/DateDialog.java index 1046f81..15c9556 100644 --- a/main/src/cgeo/geocaching/ui/dialog/DateDialog.java +++ b/main/src/cgeo/geocaching/ui/dialog/DateDialog.java @@ -22,11 +22,11 @@ public class DateDialog extends DialogFragment { private Calendar date; public static DateDialog getInstance(final Calendar date) { - final DateDialog dd = new DateDialog(); + final DateDialog dateDialog = new DateDialog(); final Bundle args = new Bundle(); args.putSerializable("date", date); - dd.setArguments(args); - return dd; + dateDialog.setArguments(args); + return dateDialog; } @Override diff --git a/main/src/cgeo/geocaching/ui/logs/LogsViewCreator.java b/main/src/cgeo/geocaching/ui/logs/LogsViewCreator.java index 23caf79..3aaeec1 100644 --- a/main/src/cgeo/geocaching/ui/logs/LogsViewCreator.java +++ b/main/src/cgeo/geocaching/ui/logs/LogsViewCreator.java @@ -4,8 +4,7 @@ import cgeo.geocaching.ImagesActivity; import cgeo.geocaching.LogEntry; import cgeo.geocaching.R; import cgeo.geocaching.activity.AbstractActionBarActivity; -import cgeo.geocaching.list.StoredList; -import cgeo.geocaching.network.HtmlImage; +import cgeo.geocaching.network.SmileyImage; import cgeo.geocaching.ui.AbstractCachingListViewPageViewCreator; import cgeo.geocaching.ui.AnchorAwareLinkMovementMethod; import cgeo.geocaching.ui.DecryptTextClickListener; @@ -87,7 +86,7 @@ public abstract class LogsViewCreator extends AbstractCachingListViewPageViewCre if (TextUtils.containsHtml(logText)) { logText = log.getDisplayText(); final UnknownTagsHandler unknownTagsHandler = new UnknownTagsHandler(); - holder.text.setText(Html.fromHtml(logText, new HtmlImage(getGeocode(), false, StoredList.STANDARD_LIST_ID, false, holder.text), + holder.text.setText(Html.fromHtml(logText, new SmileyImage(getGeocode(), holder.text), unknownTagsHandler), TextView.BufferType.SPANNABLE); } else { holder.text.setText(logText, TextView.BufferType.SPANNABLE); diff --git a/main/src/cgeo/geocaching/utils/CryptUtils.java b/main/src/cgeo/geocaching/utils/CryptUtils.java index 815c2f4..f2ff0c2 100644 --- a/main/src/cgeo/geocaching/utils/CryptUtils.java +++ b/main/src/cgeo/geocaching/utils/CryptUtils.java @@ -1,6 +1,5 @@ package cgeo.geocaching.utils; - import org.apache.commons.lang3.CharEncoding; import org.apache.commons.lang3.StringUtils; import org.eclipse.jdt.annotation.NonNull; @@ -23,28 +22,29 @@ public final class CryptUtils { // utility class } - private static char[] base64map1 = new char[64]; - private static byte[] base64map2 = new byte[128]; + private static final byte[] EMPTY = {}; + private static char[] BASE64MAP1 = new char[64]; + private static byte[] BASE64MAP2 = new byte[128]; static { int i = 0; for (char c = 'A'; c <= 'Z'; c++) { - base64map1[i++] = c; + BASE64MAP1[i++] = c; } for (char c = 'a'; c <= 'z'; c++) { - base64map1[i++] = c; + BASE64MAP1[i++] = c; } for (char c = '0'; c <= '9'; c++) { - base64map1[i++] = c; + BASE64MAP1[i++] = c; } - base64map1[i++] = '+'; - base64map1[i++] = '/'; + BASE64MAP1[i++] = '+'; + BASE64MAP1[i++] = '/'; - for (i = 0; i < base64map2.length; i++) { - base64map2[i] = -1; + for (i = 0; i < BASE64MAP2.length; i++) { + BASE64MAP2[i] = -1; } for (i = 0; i < 64; i++) { - base64map2[base64map1[i]] = (byte) i; + BASE64MAP2[BASE64MAP1[i]] = (byte) i; } } @@ -88,9 +88,7 @@ public final class CryptUtils { final MessageDigest digest = MessageDigest.getInstance("MD5"); digest.update(text.getBytes(CharEncoding.UTF_8), 0, text.length()); return new BigInteger(1, digest.digest()).toString(16); - } catch (NoSuchAlgorithmException e) { - Log.e("CryptUtils.md5", e); - } catch (UnsupportedEncodingException e) { + } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) { Log.e("CryptUtils.md5", e); } @@ -98,20 +96,16 @@ public final class CryptUtils { } public static byte[] hashHmac(String text, String salt) { - byte[] macBytes = {}; try { final SecretKeySpec secretKeySpec = new SecretKeySpec(salt.getBytes(CharEncoding.UTF_8), "HmacSHA1"); final Mac mac = Mac.getInstance("HmacSHA1"); mac.init(secretKeySpec); - macBytes = mac.doFinal(text.getBytes(CharEncoding.UTF_8)); - } catch (GeneralSecurityException e) { - Log.e("CryptUtils.hashHmac", e); - } catch (UnsupportedEncodingException e) { + return mac.doFinal(text.getBytes(CharEncoding.UTF_8)); + } catch (GeneralSecurityException | UnsupportedEncodingException e) { Log.e("CryptUtils.hashHmac", e); + return EMPTY; } - - return macBytes; } public static CharSequence rot13(final Spannable span) { @@ -145,11 +139,11 @@ public final class CryptUtils { int o1 = ((i0 & 3) << 4) | (i1 >>> 4); int o2 = ((i1 & 0xf) << 2) | (i2 >>> 6); int o3 = i2 & 0x3F; - out[op++] = base64map1[o0]; - out[op++] = base64map1[o1]; - out[op] = op < oDataLen ? base64map1[o2] : '='; + out[op++] = BASE64MAP1[o0]; + out[op++] = BASE64MAP1[o1]; + out[op] = op < oDataLen ? BASE64MAP1[o2] : '='; op++; - out[op] = op < oDataLen ? base64map1[o3] : '='; + out[op] = op < oDataLen ? BASE64MAP1[o3] : '='; op++; } diff --git a/main/src/cgeo/geocaching/utils/JsonUtils.java b/main/src/cgeo/geocaching/utils/JsonUtils.java new file mode 100644 index 0000000..492e137 --- /dev/null +++ b/main/src/cgeo/geocaching/utils/JsonUtils.java @@ -0,0 +1,20 @@ +package cgeo.geocaching.utils; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectReader; +import com.fasterxml.jackson.databind.ObjectWriter; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; + +public class JsonUtils { + + private static final ObjectMapper mapper = new ObjectMapper(); + public static final ObjectReader reader = mapper.reader(); + public static final ObjectWriter writer = mapper.writer(); + + public static final JsonNodeFactory factory = new JsonNodeFactory(true); + + private JsonUtils() { + // Do not instantiate + } + +} diff --git a/main/src/cgeo/geocaching/utils/LeastRecentlyUsedSet.java b/main/src/cgeo/geocaching/utils/LeastRecentlyUsedSet.java index a69f427..d4cf16e 100644 --- a/main/src/cgeo/geocaching/utils/LeastRecentlyUsedSet.java +++ b/main/src/cgeo/geocaching/utils/LeastRecentlyUsedSet.java @@ -20,12 +20,9 @@ import java.util.List; * access has to be guarded externally or the synchronized getAsList method can be used * to get a clone for iteration. */ -public class LeastRecentlyUsedSet<E> extends AbstractSet<E> - implements Cloneable, java.io.Serializable { +public class LeastRecentlyUsedSet<E> extends AbstractSet<E> { - private static final long serialVersionUID = -1942301031191419547L; - - private transient LeastRecentlyUsedMap<E, Object> map; + private final LeastRecentlyUsedMap<E, Object> map; private static final Object PRESENT = new Object(); public LeastRecentlyUsedSet(int maxEntries, int initialCapacity, float loadFactor) { @@ -132,26 +129,6 @@ public class LeastRecentlyUsedSet<E> extends AbstractSet<E> } /** - * (synchronized) Clone of the set - * Copy of the HashSet code if clone() - * - * @see HashSet - */ - @Override - @SuppressWarnings("unchecked") - public Object clone() throws CloneNotSupportedException { - try { - synchronized (this) { - final LeastRecentlyUsedSet<E> newSet = (LeastRecentlyUsedSet<E>) super.clone(); - newSet.map = (LeastRecentlyUsedMap<E, Object>) map.clone(); - return newSet; - } - } catch (CloneNotSupportedException e) { - throw new InternalError(); - } - } - - /** * Creates a clone as a list in a synchronized fashion. * * @return List based clone of the set @@ -160,56 +137,4 @@ public class LeastRecentlyUsedSet<E> extends AbstractSet<E> return new ArrayList<>(this); } - /** - * Serialization version of HashSet with the additional parameters for the custom Map - * - * @see HashSet - */ - private void writeObject(java.io.ObjectOutputStream s) - throws java.io.IOException { - // Write out any hidden serialization magic - s.defaultWriteObject(); - - // Write out HashMap capacity and load factor - s.writeInt(map.initialCapacity); - s.writeFloat(map.loadFactor); - s.writeInt(map.getMaxEntries()); - - // Write out size - s.writeInt(map.size()); - - // Write out all elements in the proper order. - for (final E e : map.keySet()) { - s.writeObject(e); - } - } - - /** - * Serialization version of HashSet with the additional parameters for the custom Map - * - * @see HashSet - */ - @SuppressWarnings("unchecked") - private void readObject(java.io.ObjectInputStream s) - throws java.io.IOException, ClassNotFoundException { - // Read in any hidden serialization magic - s.defaultReadObject(); - - // Read in HashMap capacity and load factor and create backing HashMap - final int capacity = s.readInt(); - final float loadFactor = s.readFloat(); - final int maxEntries = s.readInt(); - - map = new LeastRecentlyUsedMap.LruCache<>(maxEntries, capacity, loadFactor); - - // Read in size - final int size = s.readInt(); - - // Read in all elements in the proper order. - for (int i = 0; i < size; i++) { - E e = (E) s.readObject(); - map.put(e, PRESENT); - } - } - } diff --git a/main/src/cgeo/geocaching/utils/OOMDumpingUncaughtExceptionHandler.java b/main/src/cgeo/geocaching/utils/OOMDumpingUncaughtExceptionHandler.java index 1401542..0c6365c 100644 --- a/main/src/cgeo/geocaching/utils/OOMDumpingUncaughtExceptionHandler.java +++ b/main/src/cgeo/geocaching/utils/OOMDumpingUncaughtExceptionHandler.java @@ -11,14 +11,12 @@ public class OOMDumpingUncaughtExceptionHandler implements UncaughtExceptionHand private boolean defaultReplaced = false; public static boolean activateHandler() { - final OOMDumpingUncaughtExceptionHandler handler = new OOMDumpingUncaughtExceptionHandler(); return handler.activate(); } private boolean activate() { - defaultHandler = Thread.getDefaultUncaughtExceptionHandler(); // replace default handler if that has not been done already @@ -34,10 +32,8 @@ public class OOMDumpingUncaughtExceptionHandler implements UncaughtExceptionHand } public static boolean resetToDefault() { - - boolean defaultResetted = false; - final UncaughtExceptionHandler unspecificHandler = Thread.getDefaultUncaughtExceptionHandler(); + boolean defaultResetted = unspecificHandler != null; if (unspecificHandler instanceof OOMDumpingUncaughtExceptionHandler) { final OOMDumpingUncaughtExceptionHandler handler = (OOMDumpingUncaughtExceptionHandler) unspecificHandler; @@ -48,7 +44,6 @@ public class OOMDumpingUncaughtExceptionHandler implements UncaughtExceptionHand } private boolean reset() { - final boolean resetted = defaultReplaced; if (defaultReplaced) { diff --git a/main/src/cgeo/geocaching/utils/RxUtils.java b/main/src/cgeo/geocaching/utils/RxUtils.java index 241ba78..f58348d 100644 --- a/main/src/cgeo/geocaching/utils/RxUtils.java +++ b/main/src/cgeo/geocaching/utils/RxUtils.java @@ -2,12 +2,21 @@ package cgeo.geocaching.utils; import rx.Observable; import rx.Scheduler; +import rx.Scheduler.Worker; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.functions.Action0; +import rx.functions.Action1; import rx.observables.BlockingObservable; +import rx.observables.ConnectableObservable; import rx.schedulers.Schedulers; +import rx.subscriptions.CompositeSubscription; +import rx.subscriptions.Subscriptions; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; public class RxUtils { @@ -25,4 +34,62 @@ public class RxUtils { public static void waitForCompletion(final Observable<?>... observables) { waitForCompletion(Observable.merge(observables).toBlocking()); } + + /** + * ConnectableObservable whose subscription and unsubscription take place on a looper thread. + * + * @param <T> the type of the observable + */ + public static abstract class ConnectableLooperCallbacks<T> extends ConnectableObservable<T> { + private static final StartableHandlerThread looperCallbacksThread = + new StartableHandlerThread("Looper callbacks thread", android.os.Process.THREAD_PRIORITY_BACKGROUND); + static { + looperCallbacksThread.start(); + } + private static final Worker looperCallbacksWorker = AndroidSchedulers.handlerThread(looperCallbacksThread.getHandler()).createWorker(); + + final AtomicInteger counter = new AtomicInteger(0); + final long stopDelay; + final TimeUnit stopDelayUnit; + + public ConnectableLooperCallbacks(final OnSubscribe<T> onSubscribe, final long stopDelay, final TimeUnit stopDelayUnit) { + super(onSubscribe); + this.stopDelay = stopDelay; + this.stopDelayUnit = stopDelayUnit; + } + + public ConnectableLooperCallbacks(final OnSubscribe<T> onSubscribe) { + this(onSubscribe, 0, TimeUnit.SECONDS); + } + + @Override + final public void connect(final Action1<? super Subscription> action1) { + final CompositeSubscription subscription = new CompositeSubscription(); + looperCallbacksWorker.schedule(new Action0() { + @Override + public void call() { + if (counter.getAndIncrement() == 0) { + onStart(); + } + subscription.add(Subscriptions.create(new Action0() { + @Override + public void call() { + looperCallbacksWorker.schedule(new Action0() { + @Override + public void call() { + if (counter.decrementAndGet() == 0) { + onStop(); + } + } + }, stopDelay, stopDelayUnit); + } + })); + } + }); + action1.call(subscription); + } + + abstract protected void onStart(); + abstract protected void onStop(); + } } diff --git a/main/thirdparty/android/support/v4/app/FragmentListActivity.java b/main/thirdparty/android/support/v4/app/FragmentListActivity.java index a7f8880..9641249 100644 --- a/main/thirdparty/android/support/v4/app/FragmentListActivity.java +++ b/main/thirdparty/android/support/v4/app/FragmentListActivity.java @@ -254,12 +254,10 @@ public class FragmentListActivity extends FragmentActivity { /** * Provide the cursor for the list view. */ - public void setListAdapter(final ListAdapter adapter) { - synchronized (this) { - ensureList(); - mAdapter = adapter; - mList.setAdapter(adapter); - } + public synchronized void setListAdapter(final ListAdapter adapter) { + ensureList(); + mAdapter = adapter; + mList.setAdapter(adapter); } /** diff --git a/main/thirdparty/cgeo/org/kxml2/io/KXmlSerializer.java b/main/thirdparty/cgeo/org/kxml2/io/KXmlSerializer.java index 027ff53..01a1872 100644 --- a/main/thirdparty/cgeo/org/kxml2/io/KXmlSerializer.java +++ b/main/thirdparty/cgeo/org/kxml2/io/KXmlSerializer.java @@ -32,6 +32,7 @@ import java.io.OutputStreamWriter; import java.io.Writer; import java.util.Locale; +@SuppressWarnings("ALL") public class KXmlSerializer implements XmlSerializer { // static final String UNDEFINED = ":"; diff --git a/mapswithme-api/build.gradle b/mapswithme-api/build.gradle index fec7ad7..1a12c73 100644 --- a/mapswithme-api/build.gradle +++ b/mapswithme-api/build.gradle @@ -6,7 +6,7 @@ dependencies { android { compileSdkVersion 19 - buildToolsVersion "19.1.0" + buildToolsVersion "20" sourceSets { main { diff --git a/tests/src/cgeo/geocaching/CgeoApplicationTest.java b/tests/src/cgeo/geocaching/CgeoApplicationTest.java index ae182d7..7e7801b 100644 --- a/tests/src/cgeo/geocaching/CgeoApplicationTest.java +++ b/tests/src/cgeo/geocaching/CgeoApplicationTest.java @@ -165,7 +165,7 @@ public class CgeoApplicationTest extends CGeoTestCase { deleteCacheFromDBAndLogout(cache.getGeocode()); - SearchResult search = Geocache.searchByGeocode(cache.getGeocode(), null, StoredList.TEMPORARY_LIST_ID, true, null); + SearchResult search = Geocache.searchByGeocode(cache.getGeocode(), null, StoredList.TEMPORARY_LIST.id, true, null); assertThat(search).isNotNull(); assertThat(search.getGeocodes()).hasSize(1); assertThat(search.getGeocodes().contains(cache.getGeocode())).isTrue(); @@ -180,7 +180,7 @@ public class CgeoApplicationTest extends CGeoTestCase { deleteCacheFromDBAndLogout(cache.getGeocode()); - search = Geocache.searchByGeocode(cache.getGeocode(), null, StoredList.TEMPORARY_LIST_ID, true, null); + search = Geocache.searchByGeocode(cache.getGeocode(), null, StoredList.TEMPORARY_LIST.id, true, null); assertThat(search).isNotNull(); assertThat(search.getGeocodes()).isEmpty(); } @@ -201,7 +201,7 @@ public class CgeoApplicationTest extends CGeoTestCase { deleteCacheFromDBAndLogout(cache.getGeocode()); - final SearchResult search = Geocache.searchByGeocode(cache.getGeocode(), null, StoredList.TEMPORARY_LIST_ID, true, null); + final SearchResult search = Geocache.searchByGeocode(cache.getGeocode(), null, StoredList.TEMPORARY_LIST.id, true, null); assertThat(search).isNotNull(); assertThat(search.getGeocodes()).isEmpty(); } diff --git a/tests/src/cgeo/geocaching/GeocacheTest.java b/tests/src/cgeo/geocaching/GeocacheTest.java index b3ec6be..722e1cf 100644 --- a/tests/src/cgeo/geocaching/GeocacheTest.java +++ b/tests/src/cgeo/geocaching/GeocacheTest.java @@ -86,7 +86,7 @@ public class GeocacheTest extends CGeoTestCase { assertThat(waypoint.getCoords()).isEqualTo(new Geopoint("N51 13.888 E007 03.444")); // assertThat(waypoint.getNote()).isEqualTo("Test"); assertThat(waypoint.getName()).isEqualTo(CgeoApplication.getInstance().getString(R.string.cache_personal_note) + " 1"); - cache.store(StoredList.TEMPORARY_LIST_ID, null); + cache.store(StoredList.TEMPORARY_LIST.id, null); } removeCacheCompletely(geocode); } finally { diff --git a/tests/src/cgeo/geocaching/export/GpxSerializerTest.java b/tests/src/cgeo/geocaching/export/GpxSerializerTest.java index 809c121..c43ad38 100644 --- a/tests/src/cgeo/geocaching/export/GpxSerializerTest.java +++ b/tests/src/cgeo/geocaching/export/GpxSerializerTest.java @@ -67,7 +67,7 @@ public class GpxSerializerTest extends AbstractResourceInstrumentationTestCase { assertThat(gpxFirst.length() > 0).isTrue(); - final GPX10Parser parser = new GPX10Parser(StoredList.TEMPORARY_LIST_ID); + final GPX10Parser parser = new GPX10Parser(StoredList.TEMPORARY_LIST.id); final InputStream stream = new ByteArrayInputStream(gpxFirst.getBytes(CharEncoding.UTF_8)); Collection<Geocache> caches = parser.parse(stream, null); diff --git a/tests/src/cgeo/geocaching/test/AbstractResourceInstrumentationTestCase.java b/tests/src/cgeo/geocaching/test/AbstractResourceInstrumentationTestCase.java index eaac181..2a22895 100644 --- a/tests/src/cgeo/geocaching/test/AbstractResourceInstrumentationTestCase.java +++ b/tests/src/cgeo/geocaching/test/AbstractResourceInstrumentationTestCase.java @@ -75,7 +75,7 @@ public abstract class AbstractResourceInstrumentationTestCase extends Instrument protected void setUp() throws Exception { super.setUp(); temporaryListId = DataStore.createList("Temporary unit testing"); - assertThat(temporaryListId != StoredList.TEMPORARY_LIST_ID).isTrue(); + assertThat(temporaryListId != StoredList.TEMPORARY_LIST.id).isTrue(); assertThat(temporaryListId != StoredList.STANDARD_LIST_ID).isTrue(); } @@ -95,7 +95,7 @@ public abstract class AbstractResourceInstrumentationTestCase extends Instrument final protected Geocache loadCacheFromResource(int resourceId) throws IOException, ParserException { final InputStream instream = getResourceStream(resourceId); try { - GPX10Parser parser = new GPX10Parser(StoredList.TEMPORARY_LIST_ID); + GPX10Parser parser = new GPX10Parser(StoredList.TEMPORARY_LIST.id); Collection<Geocache> caches = parser.parse(instream, null); assertThat(caches).isNotNull(); assertThat(caches.isEmpty()).isFalse(); |
