added files via upload
86
.github/ISSUE_TEMPLATE/bug.yaml
vendored
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
name: Bug
|
||||||
|
description: Make sure you complete the template. Otherwise, it will be closed without further explanation!
|
||||||
|
title: "[Bug] Replace this with your title"
|
||||||
|
labels: bug
|
||||||
|
body:
|
||||||
|
- type: checkboxes
|
||||||
|
attributes:
|
||||||
|
label: Is there an existing issue for this?
|
||||||
|
description: _Please search to see if an issue already exists for the bug you encountered_
|
||||||
|
options:
|
||||||
|
- label: I have searched the existing issues
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: checkboxes
|
||||||
|
attributes:
|
||||||
|
label: Have you read the FAQ?
|
||||||
|
description: _Make sure you visit the [**FAQ**](https://github.com/qnblackcat/CercubePlus/wiki/FAQ) page first!_
|
||||||
|
options:
|
||||||
|
- label: Yes, I read the FAQ
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Device info
|
||||||
|
description:
|
||||||
|
value: |
|
||||||
|
- iOS/iPadOS version:
|
||||||
|
- Device model:
|
||||||
|
- Sideload tool (AltStore, Sideloadly, TrollStore,...):
|
||||||
|
- The specific version of CercubePlus (**latest** or **newest** is **NOT** a version number!):
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Describe the bug
|
||||||
|
description: _Please attach videos or screenshots if possible_
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Steps to reproduce the issue
|
||||||
|
description: _Please attach videos or screenshots if possible_
|
||||||
|
value: |
|
||||||
|
1.
|
||||||
|
2.
|
||||||
|
3.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: logs
|
||||||
|
attributes:
|
||||||
|
label: Crash log (if the app crashes)
|
||||||
|
description: _If somehow the app crashes, **you must provide the crash log**. It can be found in your device's Settings App > Privacy > Analytics & Improvements > Analytics Data > Youtube-xxx-xxx.ips_
|
||||||
|
render: shell
|
||||||
|
|
||||||
|
- type: dropdown
|
||||||
|
attributes:
|
||||||
|
label: Are you using the newest version of CercubePlus? If not, why?
|
||||||
|
description: _Developers spend time and effort to fix bugs & add improvements with every release. Why don't you update to the [latest version](https://github.com/Balackburn/CercubePlusExtra/releases/latest) before reporting about an issue?_
|
||||||
|
multiple: false
|
||||||
|
options:
|
||||||
|
- ✅ Yes, I'm using the latest version of CercubePlus right now
|
||||||
|
- ❌ No, I'll explain at the end of the template
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: dropdown
|
||||||
|
attributes:
|
||||||
|
label: Does the issue happen with the official YouTube from AppStore?
|
||||||
|
description: _Well, YouTube itself is buggy sometimes..._
|
||||||
|
multiple: false
|
||||||
|
options:
|
||||||
|
- ❌ No, It doesn't
|
||||||
|
- ✅ Yes, It does
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Additional context
|
||||||
|
description: _Um, anything else you want to say?_
|
||||||
|
validations:
|
||||||
|
required: false
|
37
.github/ISSUE_TEMPLATE/question-help.md
vendored
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
name: Question
|
||||||
|
description: Have question(s)?
|
||||||
|
title: "[Questions] Replace with your question"
|
||||||
|
labels: question
|
||||||
|
body:
|
||||||
|
- type: checkboxes
|
||||||
|
attributes:
|
||||||
|
label: Is there an existing issue/question for this?
|
||||||
|
description: _Please search to see if an issue already exists for the bug you encountered. **I DON\'T MAKE THIS TICK BOX FOR COSMETIC.**_
|
||||||
|
options:
|
||||||
|
- label: I have searched the existing issues
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: dropdown
|
||||||
|
attributes:
|
||||||
|
label: Do you think this is a bug?
|
||||||
|
description: _If you think this is a bug, please open a new issue with the bug template_
|
||||||
|
multiple: false
|
||||||
|
options:
|
||||||
|
- ✅ Yes, I believe this is a bug. I will open a new issue with the bug template
|
||||||
|
- ❌ No, I don't think this is a bug. I will explain below
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: My question
|
||||||
|
description: _Please enter your question here_
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Additional context
|
||||||
|
description: _Um, anything else you want to say?_
|
||||||
|
validations:
|
||||||
|
required: false
|
42
.github/RELEASE_TEMPLATE/Release.md
vendored
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
# [YOUR_TWEAK_NAME] Features
|
||||||
|
CercubePlus but adds Additional Features that should’ve been added to the native CercubePlus which were probably not added.
|
||||||
|
|
||||||
|
**LowContrastMode:** This tweak helps remove the new contrasty looking UI that was first introducted way back in 2020 August/September. (Tweak made by arichorn)
|
||||||
|
<details>
|
||||||
|
<summary>More Features...</summary>
|
||||||
|
|
||||||
|
**LowContrastModeColors:** for users who doesn’t use gray will get a set of colors to switch which changes and improves the UI Customization. (Add-on added for LowContrastMode)
|
||||||
|
|
||||||
|
**YTNoHeatwaves:** Turns off the Heatwaves Feature in the video player. `(CercubePlus/VideoPlayerOverlayControls)`
|
||||||
|
|
||||||
|
**YTNoUpgradeDialog:** Disables the Upgrade Dialog so you won’t be prompt to update the app.
|
||||||
|
|
||||||
|
**YouMute:** Mute/unmute videos in YouTube directly.
|
||||||
|
|
||||||
|
**iPadLayout:** Gives iPhone users the ability to use the iPad’s Interface and the ability to use the some of the YouTube features that are not on iPhone.
|
||||||
|
|
||||||
|
**iPhoneLayout:** Gives iPad users the ability to use Community Posts, to create Shorts and the ability to use the buggy iPhone layout. but using it in split view mode fixes the ui.
|
||||||
|
|
||||||
|
**HideSponsorBlockButton:** Hide the SponsorBlock Button shown on the Nav Bar. Added by Dayanch96
|
||||||
|
|
||||||
|
**DisableWifiRelatedOptions:** want to remove sections that are only shown when internet is on? You can toggle this to remove all of those sections. Well not all but toggling the option will remove some of the annoying sections that may not be used.
|
||||||
|
|
||||||
|
**HideShadowOverlayButtons:** want to remove shadow overlay on the buttons used in the video player? Then toggle this to remove the Shadow Overlay on the buttons Previous, Next, Rewind, Forward.
|
||||||
|
|
||||||
|
**etc..**
|
||||||
|
</details>
|
||||||
|
|
||||||
|
# [YOUR_TWEAK_NAME] Release Information
|
||||||
|
Current YouTube IPA: `TEMPLATE`
|
||||||
|
Current Cercube Version: `v5.3.13`
|
||||||
|
Current App Compatibility: `iOS/iPadOS 14.0` or later
|
||||||
|
|
||||||
|
**RELEASE F1:**
|
||||||
|
[THIS IS WHERE YOU PUT YOUR CHANGES BELOW, also F1 indicates First Release on the same YouTube Version in case you needed to know]
|
||||||
|
- [<-- this subtract symbol makes the changelog look cool]
|
||||||
|
|
||||||
|
- [this right here shows you added additonal changes on a certain tweak like this for example, below]
|
||||||
|
- Improvements
|
||||||
|
- Fixed Sign-in Issue
|
||||||
|
- Fixed Ads Not Working Issue
|
||||||
|
[THIS IS HOW YOU DO IT! YOU CAN DELETE ALL OF THE TEXT I'VE SAID!]
|
159
.github/workflows/buildapp.yml
vendored
Normal file
@@ -0,0 +1,159 @@
|
|||||||
|
# Original idea by @ISnackable. Many thanks to him for handling the most hardest parts!
|
||||||
|
# https://github.com/ISnackable/CercubePlus/blob/main/.github/workflows/Build.yml
|
||||||
|
|
||||||
|
name: Build and Release YTLitePlus
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
decrypted_youtube_url:
|
||||||
|
description: "The direct URL to the decrypted YouTube ipa"
|
||||||
|
default: ""
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
youtube_version:
|
||||||
|
description: "The version of YouTube"
|
||||||
|
default: ""
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
ytliteplus_version:
|
||||||
|
description: "The version of YTLitePlus"
|
||||||
|
default: "2.0"
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
bundle_id:
|
||||||
|
description: "Modify the bundle ID. Not recommended"
|
||||||
|
default: "com.google.ios.youtube"
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
app_name:
|
||||||
|
description: "Modify the name of the app on the Home Screen. Not recommended"
|
||||||
|
default: "YouTube"
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
create_release:
|
||||||
|
description: "Create a draft release"
|
||||||
|
default: true
|
||||||
|
required: false
|
||||||
|
type: boolean
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: Build YTLitePlus
|
||||||
|
runs-on: macos-latest
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout Main
|
||||||
|
uses: actions/checkout@v3.5.2
|
||||||
|
with:
|
||||||
|
path: main
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: Install Dependencies
|
||||||
|
run: brew install ldid dpkg make
|
||||||
|
|
||||||
|
- name: Setup Theos
|
||||||
|
uses: actions/checkout@v3.5.2
|
||||||
|
with:
|
||||||
|
repository: theos/theos
|
||||||
|
ref: master
|
||||||
|
path: theos
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: Caching
|
||||||
|
id: SDK
|
||||||
|
uses: actions/cache@v3.3.1
|
||||||
|
env:
|
||||||
|
cache-name: iOS-15.5-SDK
|
||||||
|
with:
|
||||||
|
path: theos/sdks/
|
||||||
|
key: ${{ env.cache-name }}
|
||||||
|
|
||||||
|
- name: Download iOS 15.5 SDK
|
||||||
|
if: steps.SDK.outputs.cache-hit != 'true'
|
||||||
|
run: |
|
||||||
|
svn checkout -q https://github.com/chrisharper22/sdks/trunk/iPhoneOS15.5.sdk
|
||||||
|
mv *.sdk $THEOS/sdks
|
||||||
|
env:
|
||||||
|
THEOS: ${{ github.workspace }}/theos
|
||||||
|
|
||||||
|
- name: Setup Theos Jailed
|
||||||
|
uses: actions/checkout@v3.5.2
|
||||||
|
with:
|
||||||
|
repository: qnblackcat/theos-jailed
|
||||||
|
ref: master
|
||||||
|
path: theos-jailed
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: Install Theos Jailed
|
||||||
|
run: |
|
||||||
|
./theos-jailed/install
|
||||||
|
env:
|
||||||
|
THEOS: ${{ github.workspace }}/theos
|
||||||
|
|
||||||
|
- name: Prepare YouTube iPA
|
||||||
|
run: |
|
||||||
|
wget "$YOUTUBE_URL" --no-verbose -O main/YouTube.ipa
|
||||||
|
echo -e "==> \033[1mYouTube v${{ inputs.youtube_version }} downloaded! \033[0m"
|
||||||
|
unzip -q main/YouTube.ipa -d main/tmp
|
||||||
|
rm -rf main/tmp/Payload/YouTube.app/_CodeSignature/CodeResources
|
||||||
|
rm -rf main/tmp/Payload/YouTube.app/PlugIns/*
|
||||||
|
cp -R main/Extensions/*.appex main/tmp/Payload/YouTube.app/PlugIns
|
||||||
|
echo -e "==> \033[1mYouTube v${{ inputs.youtube_version }} unpacked! \033[0m"
|
||||||
|
|
||||||
|
env:
|
||||||
|
THEOS: ${{ github.workspace }}/theos
|
||||||
|
YOUTUBE_VERSION: ${{ inputs.youtube_version }}
|
||||||
|
YOUTUBE_URL: ${{ inputs.decrypted_youtube_url }}
|
||||||
|
|
||||||
|
- name: Fix Compiling & Build Package
|
||||||
|
id: build_package
|
||||||
|
run: |
|
||||||
|
(echo PATH=\"$(brew --prefix make)/libexec/gnubin:\$PATH\" >> ~/.zprofile)
|
||||||
|
cd ${{ github.workspace }}/main
|
||||||
|
sed -i '' "12s#.*#BUNDLE_ID = ${{ env.BUNDLE_ID }}#g" Makefile
|
||||||
|
sed -i '' "11s#.*#DISPLAY_NAME = ${{ env.APP_NAME }}#g" Makefile
|
||||||
|
make package FINALPACKAGE=1
|
||||||
|
(mv "packages/$(ls -t packages | head -n1)" "packages/YTLitePlus_${{ env.YOUTUBE_VERSION }}.ipa")
|
||||||
|
echo "package=$(ls -t packages | head -n1)" >>$GITHUB_OUTPUT
|
||||||
|
echo -e "==> \033[1mSHASUM256: $(shasum -a 256 packages/*.ipa | cut -f1 -d' ')\033[0m"
|
||||||
|
echo -e "==> \033[1mBundle ID: ${{ env.BUNDLE_ID }}\033[0m"
|
||||||
|
env:
|
||||||
|
THEOS: ${{ github.workspace }}/theos
|
||||||
|
ytliteplus_version: ${{ inputs.ytliteplus_version }}
|
||||||
|
YOUTUBE_VERSION: ${{ inputs.youtube_version }}
|
||||||
|
BUNDLE_ID: ${{ inputs.bundle_id }}
|
||||||
|
APP_NAME: ${{ inputs.app_name }}
|
||||||
|
|
||||||
|
- name: Upload Artifact
|
||||||
|
uses: actions/upload-artifact@v3.1.2
|
||||||
|
env:
|
||||||
|
ytliteplus_version: ${{ inputs.ytliteplus_version }}
|
||||||
|
YOUTUBE_VERSION: ${{ inputs.youtube_version }}
|
||||||
|
with:
|
||||||
|
name: YTLitePlus_${{ env.YOUTUBE_VERSION }}_${{ env.ytliteplus_version }}
|
||||||
|
path: ${{ github.workspace }}/main/packages/${{ steps.build_package.outputs.package }}
|
||||||
|
if-no-files-found: error
|
||||||
|
|
||||||
|
- name: Create Release
|
||||||
|
id: create_release
|
||||||
|
uses: softprops/action-gh-release@v0.1.15
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
ytliteplus_version: ${{ inputs.ytliteplus_version }}
|
||||||
|
YOUTUBE_VERSION: ${{ inputs.youtube_version }}
|
||||||
|
DRAFT: ${{ inputs.create_release }}
|
||||||
|
with:
|
||||||
|
tag_name: v${{ env.YOUTUBE_VERSION }}-${{ env.ytliteplus_version }}-(${{ github.run_number }})
|
||||||
|
name: v${{ env.YOUTUBE_VERSION }}-${{ env.ytliteplus_version }}-(${{ github.run_number }})
|
||||||
|
files: main/packages/*.ipa
|
||||||
|
draft: ${{ env.DRAFT }}
|
||||||
|
|
||||||
|
|
||||||
|
|
7
.gitignore
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
.DS_Store
|
||||||
|
.theos/
|
||||||
|
packages/
|
||||||
|
tmp/
|
||||||
|
Tweaks/Cercube/*
|
||||||
|
!Tweaks/Cercube/.gitkeep
|
||||||
|
Resources/
|
45
.gitmodules
vendored
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
[submodule "Tweaks/YTUHD"]
|
||||||
|
path = Tweaks/YTUHD
|
||||||
|
url = https://github.com/PoomSmart/YTUHD.git
|
||||||
|
[submodule "Tweaks/YouPiP"]
|
||||||
|
path = Tweaks/YouPiP
|
||||||
|
url = https://github.com/PoomSmart/YouPiP.git
|
||||||
|
[submodule "Tweaks/Return-YouTube-Dislikes"]
|
||||||
|
path = Tweaks/Return-YouTube-Dislikes
|
||||||
|
url = https://github.com/PoomSmart/Return-YouTube-Dislikes.git
|
||||||
|
[submodule "Tweaks/YouTubeHeader"]
|
||||||
|
path = Tweaks/YouTubeHeader
|
||||||
|
url = https://github.com/PoomSmart/YouTubeHeader.git
|
||||||
|
[submodule "Tweaks/Alderis"]
|
||||||
|
path = Tweaks/Alderis
|
||||||
|
url = https://github.com/qnblackcat/Alderis.git
|
||||||
|
[submodule "Tweaks/PSHeader"]
|
||||||
|
path = Tweaks/PSHeader
|
||||||
|
url = https://github.com/PoomSmart/PSHeader.git
|
||||||
|
[submodule "Tweaks/YTABConfig"]
|
||||||
|
path = Tweaks/YTABConfig
|
||||||
|
url = https://github.com/PoomSmart/YTABConfig.git
|
||||||
|
[submodule "Tweaks/YouMute"]
|
||||||
|
path = Tweaks/YouMute
|
||||||
|
url = https://github.com/PoomSmart/YouMute.git
|
||||||
|
[submodule "Tweaks/RemoteLog"]
|
||||||
|
path = Tweaks/RemoteLog
|
||||||
|
url = https://github.com/Muirey03/RemoteLog.git
|
||||||
|
[submodule "Tweaks/FLEX"]
|
||||||
|
path = Tweaks/FLEX
|
||||||
|
url = https://github.com/qnblackcat/FLEX-Classes.git
|
||||||
|
[submodule "Tweaks/iSponsorBlock"]
|
||||||
|
path = Tweaks/iSponsorBlock
|
||||||
|
url = https://github.com/Galactic-Dev/iSponsorBlock.git
|
||||||
|
[submodule "Extensions"]
|
||||||
|
path = Extensions
|
||||||
|
url = https://github.com/CokePokes/YoutubeExtensions.git
|
||||||
|
[submodule "Tweaks/YTHoldForSpeed"]
|
||||||
|
path = Tweaks/YTHoldForSpeed
|
||||||
|
url = https://github.com/arichorn/YTHoldForSpeed.git
|
||||||
|
[submodule "Tweaks/DontEatMyContent"]
|
||||||
|
path = Tweaks/DontEatMyContent
|
||||||
|
url = https://github.com/therealFoxster/DontEatMyContent.git
|
||||||
|
[submodule "Tweaks/YTLite"]
|
||||||
|
path = Tweaks/YTLite
|
||||||
|
url = https://github.com/dayanch96/YTLite.git
|
2
Extensions/.gitattributes
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
# Auto detect text files and perform LF normalization
|
||||||
|
* text=auto
|
1
Extensions/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
.DS_Store
|
BIN
Extensions/OpenYoutubeSafariExtension.appex/Info.plist
Normal file
BIN
Extensions/OpenYoutubeSafariExtension.appex/OpenYoutube
Executable file
@@ -0,0 +1,333 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>files</key>
|
||||||
|
<dict>
|
||||||
|
<key>Info.plist</key>
|
||||||
|
<data>
|
||||||
|
5KaPBsMVTGZfcc05Od8nGW6/EyQ=
|
||||||
|
</data>
|
||||||
|
<key>_locales/en/messages.json</key>
|
||||||
|
<data>
|
||||||
|
8cPkszxzYFSjhRWsf34A0AiHaPM=
|
||||||
|
</data>
|
||||||
|
<key>background.js</key>
|
||||||
|
<data>
|
||||||
|
tClFxbnUm0L65Qj+Qu8Fk9asL2o=
|
||||||
|
</data>
|
||||||
|
<key>content.js</key>
|
||||||
|
<data>
|
||||||
|
a6o4B4PMlrIOBXlniU2NS4D9SJE=
|
||||||
|
</data>
|
||||||
|
<key>embedded.mobileprovision</key>
|
||||||
|
<data>
|
||||||
|
dVGLS8Qpu/eCI1J5VCu9IfYq3Z4=
|
||||||
|
</data>
|
||||||
|
<key>images/cat_1.0.gif</key>
|
||||||
|
<data>
|
||||||
|
DtSTnvB7wRt647kM1b38KLfDfXA=
|
||||||
|
</data>
|
||||||
|
<key>images/icon-128.png</key>
|
||||||
|
<data>
|
||||||
|
rYa1lv1LgkO3fkP9h6gRSjlQgqk=
|
||||||
|
</data>
|
||||||
|
<key>images/icon-256.png</key>
|
||||||
|
<data>
|
||||||
|
05xbekvTg28KsH9RRIKQRL8tqQs=
|
||||||
|
</data>
|
||||||
|
<key>images/icon-48.png</key>
|
||||||
|
<data>
|
||||||
|
BWUZe8raKzOzA2cDWIYFoBPxxw8=
|
||||||
|
</data>
|
||||||
|
<key>images/icon-512.png</key>
|
||||||
|
<data>
|
||||||
|
shzpVHJMsAu4q820Fb+YzByiFhc=
|
||||||
|
</data>
|
||||||
|
<key>images/icon-64.png</key>
|
||||||
|
<data>
|
||||||
|
HZC4YIb4ZLg4lpjNAKFqSaka6r0=
|
||||||
|
</data>
|
||||||
|
<key>images/icon-96.png</key>
|
||||||
|
<data>
|
||||||
|
IPAOd1HfCtCI7ybhVhwA5TU/BZ8=
|
||||||
|
</data>
|
||||||
|
<key>images/toolbar-icon-16.png</key>
|
||||||
|
<data>
|
||||||
|
Bkb2Cy8VYIcWl7wFZ2HcWZcCoyA=
|
||||||
|
</data>
|
||||||
|
<key>images/toolbar-icon-19.png</key>
|
||||||
|
<data>
|
||||||
|
XLkdODJ73CVbwn/1LCAsfB6scPg=
|
||||||
|
</data>
|
||||||
|
<key>images/toolbar-icon-32.png</key>
|
||||||
|
<data>
|
||||||
|
0cQgf/z3urGdzsmtmc2Wnim1+lg=
|
||||||
|
</data>
|
||||||
|
<key>images/toolbar-icon-38.png</key>
|
||||||
|
<data>
|
||||||
|
eas7Tl3/r2JMZf6nK84ZjoBJrZo=
|
||||||
|
</data>
|
||||||
|
<key>images/toolbar-icon-48.png</key>
|
||||||
|
<data>
|
||||||
|
fxyz1xgkIR877Cf/7uYNUqXrxoM=
|
||||||
|
</data>
|
||||||
|
<key>images/toolbar-icon-72.png</key>
|
||||||
|
<data>
|
||||||
|
pHL3CJwjPY30T9sFvvcA2qlraBw=
|
||||||
|
</data>
|
||||||
|
<key>manifest.json</key>
|
||||||
|
<data>
|
||||||
|
b37QyqMYHlvlfOjbvJLOKeAM5Y4=
|
||||||
|
</data>
|
||||||
|
<key>popup.css</key>
|
||||||
|
<data>
|
||||||
|
mXR2qQxu+ceMOItNpc4aImux5wY=
|
||||||
|
</data>
|
||||||
|
<key>popup.html</key>
|
||||||
|
<data>
|
||||||
|
zTk6QImmvcZjMYLQY8ek+cqSEWg=
|
||||||
|
</data>
|
||||||
|
<key>popup.js</key>
|
||||||
|
<data>
|
||||||
|
grmSQBg1aRbGzHHjd3TWHS/HbOY=
|
||||||
|
</data>
|
||||||
|
</dict>
|
||||||
|
<key>files2</key>
|
||||||
|
<dict>
|
||||||
|
<key>_locales/en/messages.json</key>
|
||||||
|
<dict>
|
||||||
|
<key>hash2</key>
|
||||||
|
<data>
|
||||||
|
4pOaVgBrOGGIoI81XdEOZidIyW9peYtz85HIYX7d1QE=
|
||||||
|
</data>
|
||||||
|
</dict>
|
||||||
|
<key>background.js</key>
|
||||||
|
<dict>
|
||||||
|
<key>hash2</key>
|
||||||
|
<data>
|
||||||
|
2S7ONYvdkGsryEavyrR7nMCTwsjNGqMV2BSWIxWLSYg=
|
||||||
|
</data>
|
||||||
|
</dict>
|
||||||
|
<key>content.js</key>
|
||||||
|
<dict>
|
||||||
|
<key>hash2</key>
|
||||||
|
<data>
|
||||||
|
9CYz6yZ8bRI2JRzRwnn4DOGuPuy2GSsOudXSZU6s1po=
|
||||||
|
</data>
|
||||||
|
</dict>
|
||||||
|
<key>embedded.mobileprovision</key>
|
||||||
|
<dict>
|
||||||
|
<key>hash2</key>
|
||||||
|
<data>
|
||||||
|
4TQyzTTz0VYUTM0IXf2PMSufVEkzd4WlPWbwKMyfKfQ=
|
||||||
|
</data>
|
||||||
|
</dict>
|
||||||
|
<key>images/cat_1.0.gif</key>
|
||||||
|
<dict>
|
||||||
|
<key>hash2</key>
|
||||||
|
<data>
|
||||||
|
65Ql3FhfivRMoMifbuY5KK8I/1rZx/Zmmwsx1La4OyI=
|
||||||
|
</data>
|
||||||
|
</dict>
|
||||||
|
<key>images/icon-128.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>hash2</key>
|
||||||
|
<data>
|
||||||
|
TV8I8bcVP9rAnVA4AJRAWtkJveIenMpYsd/7+rsMLzo=
|
||||||
|
</data>
|
||||||
|
</dict>
|
||||||
|
<key>images/icon-256.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>hash2</key>
|
||||||
|
<data>
|
||||||
|
kksdsW0Y1svz0bT0i3UzQGBmBDxJGr2eTCZmaqTS+XM=
|
||||||
|
</data>
|
||||||
|
</dict>
|
||||||
|
<key>images/icon-48.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>hash2</key>
|
||||||
|
<data>
|
||||||
|
mBNPpZ78p0eH4WsNdF/EXw/sFHq5f8PqERARlLulYbY=
|
||||||
|
</data>
|
||||||
|
</dict>
|
||||||
|
<key>images/icon-512.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>hash2</key>
|
||||||
|
<data>
|
||||||
|
waQn18oFc3GbhXXm2HEn6xFQk3HKehp9crGljWAMsGQ=
|
||||||
|
</data>
|
||||||
|
</dict>
|
||||||
|
<key>images/icon-64.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>hash2</key>
|
||||||
|
<data>
|
||||||
|
CJwxajQk49Cd0RfR22yEPO6pjDbg+Aa4Ocxi+812CiM=
|
||||||
|
</data>
|
||||||
|
</dict>
|
||||||
|
<key>images/icon-96.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>hash2</key>
|
||||||
|
<data>
|
||||||
|
zuzRjCepizxOWXh9ftCPth38GUxy1Ea/4zS3dw19OXo=
|
||||||
|
</data>
|
||||||
|
</dict>
|
||||||
|
<key>images/toolbar-icon-16.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>hash2</key>
|
||||||
|
<data>
|
||||||
|
xmXH4YHb+Pq/YuC1e8JLIun93LuM3+/8MvB3r8oTKls=
|
||||||
|
</data>
|
||||||
|
</dict>
|
||||||
|
<key>images/toolbar-icon-19.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>hash2</key>
|
||||||
|
<data>
|
||||||
|
qSX/1Ux4BOUIhixJK5NkvyTomLwp0yISfsQ97uF8/5g=
|
||||||
|
</data>
|
||||||
|
</dict>
|
||||||
|
<key>images/toolbar-icon-32.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>hash2</key>
|
||||||
|
<data>
|
||||||
|
pGDg4NcSdD5EQaZgaiwxNosbSEXmZnpRc79RfitKc1c=
|
||||||
|
</data>
|
||||||
|
</dict>
|
||||||
|
<key>images/toolbar-icon-38.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>hash2</key>
|
||||||
|
<data>
|
||||||
|
BUU3dwrCSvNOiFkBQWdPkrwASjUvxSxbizW+Izt3LBA=
|
||||||
|
</data>
|
||||||
|
</dict>
|
||||||
|
<key>images/toolbar-icon-48.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>hash2</key>
|
||||||
|
<data>
|
||||||
|
JLZV5da+fZkfw0m2KfMqHSixWBCJvZoUNlt3la7gm54=
|
||||||
|
</data>
|
||||||
|
</dict>
|
||||||
|
<key>images/toolbar-icon-72.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>hash2</key>
|
||||||
|
<data>
|
||||||
|
TwM7A1Bkuv4C3SWorFNwG+w38mWo3TaMtglLdDXxcFw=
|
||||||
|
</data>
|
||||||
|
</dict>
|
||||||
|
<key>manifest.json</key>
|
||||||
|
<dict>
|
||||||
|
<key>hash2</key>
|
||||||
|
<data>
|
||||||
|
+nWdvS9ap7YzpjqKSWsGUHP5K2irkTGozQX/tI4WrYc=
|
||||||
|
</data>
|
||||||
|
</dict>
|
||||||
|
<key>popup.css</key>
|
||||||
|
<dict>
|
||||||
|
<key>hash2</key>
|
||||||
|
<data>
|
||||||
|
LIfF3an8mzKIMD8PDhKILnrZBhxxSTzoZQKyRiyWuB0=
|
||||||
|
</data>
|
||||||
|
</dict>
|
||||||
|
<key>popup.html</key>
|
||||||
|
<dict>
|
||||||
|
<key>hash2</key>
|
||||||
|
<data>
|
||||||
|
9Ro1fCC5Meq0eSNrYab7V3uc4tNvmwRqMsCb1757M6Q=
|
||||||
|
</data>
|
||||||
|
</dict>
|
||||||
|
<key>popup.js</key>
|
||||||
|
<dict>
|
||||||
|
<key>hash2</key>
|
||||||
|
<data>
|
||||||
|
ruLXAORE+vDoLKPGBSkl7hnXv8V+ZexCoX3KvJyHxBk=
|
||||||
|
</data>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<key>rules</key>
|
||||||
|
<dict>
|
||||||
|
<key>^.*</key>
|
||||||
|
<true/>
|
||||||
|
<key>^.*\.lproj/</key>
|
||||||
|
<dict>
|
||||||
|
<key>optional</key>
|
||||||
|
<true/>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>1000</real>
|
||||||
|
</dict>
|
||||||
|
<key>^.*\.lproj/locversion.plist$</key>
|
||||||
|
<dict>
|
||||||
|
<key>omit</key>
|
||||||
|
<true/>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>1100</real>
|
||||||
|
</dict>
|
||||||
|
<key>^Base\.lproj/</key>
|
||||||
|
<dict>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>1010</real>
|
||||||
|
</dict>
|
||||||
|
<key>^version.plist$</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>rules2</key>
|
||||||
|
<dict>
|
||||||
|
<key>.*\.dSYM($|/)</key>
|
||||||
|
<dict>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>11</real>
|
||||||
|
</dict>
|
||||||
|
<key>^(.*/)?\.DS_Store$</key>
|
||||||
|
<dict>
|
||||||
|
<key>omit</key>
|
||||||
|
<true/>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>2000</real>
|
||||||
|
</dict>
|
||||||
|
<key>^.*</key>
|
||||||
|
<true/>
|
||||||
|
<key>^.*\.lproj/</key>
|
||||||
|
<dict>
|
||||||
|
<key>optional</key>
|
||||||
|
<true/>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>1000</real>
|
||||||
|
</dict>
|
||||||
|
<key>^.*\.lproj/locversion.plist$</key>
|
||||||
|
<dict>
|
||||||
|
<key>omit</key>
|
||||||
|
<true/>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>1100</real>
|
||||||
|
</dict>
|
||||||
|
<key>^Base\.lproj/</key>
|
||||||
|
<dict>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>1010</real>
|
||||||
|
</dict>
|
||||||
|
<key>^Info\.plist$</key>
|
||||||
|
<dict>
|
||||||
|
<key>omit</key>
|
||||||
|
<true/>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>20</real>
|
||||||
|
</dict>
|
||||||
|
<key>^PkgInfo$</key>
|
||||||
|
<dict>
|
||||||
|
<key>omit</key>
|
||||||
|
<true/>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>20</real>
|
||||||
|
</dict>
|
||||||
|
<key>^embedded\.provisionprofile$</key>
|
||||||
|
<dict>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>20</real>
|
||||||
|
</dict>
|
||||||
|
<key>^version\.plist$</key>
|
||||||
|
<dict>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>20</real>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"extension_name": {
|
||||||
|
"message": "OpenYoutube",
|
||||||
|
"description": "The display name for the extension."
|
||||||
|
},
|
||||||
|
"extension_description": {
|
||||||
|
"message": "Displays an Open in Youtube alert for sideloaded YT",
|
||||||
|
"description": "Description of what the extension does."
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,6 @@
|
|||||||
|
browser.runtime.onMessage.addListener((request, sender, sendResponse) => {
|
||||||
|
console.log("Received request: ", request);
|
||||||
|
|
||||||
|
if (request.greeting === "hello")
|
||||||
|
sendResponse({ farewell: "goodbye" });
|
||||||
|
});
|
25
Extensions/OpenYoutubeSafariExtension.appex/content.js
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
browser.runtime.sendMessage({ greeting: "hello" }).then((response) => {
|
||||||
|
console.log("Received response: ", response);
|
||||||
|
});
|
||||||
|
|
||||||
|
browser.runtime.onMessage.addListener((request, sender, sendResponse) => {
|
||||||
|
console.log("Received request: ", request);
|
||||||
|
});
|
||||||
|
|
||||||
|
function afterNavigate() {
|
||||||
|
if ('/watch' === location.pathname) {
|
||||||
|
window.location.href = `youtube://${window.location.pathname.slice(1)}${
|
||||||
|
window.location.search
|
||||||
|
}${window.location.hash}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
(document.body || document.documentElement).addEventListener('transitionend',
|
||||||
|
function(/*TransitionEvent*/ event) {
|
||||||
|
if (event.propertyName === 'width' && event.target.id === 'progress') {
|
||||||
|
afterNavigate();
|
||||||
|
}
|
||||||
|
}, true);
|
||||||
|
// After page load
|
||||||
|
afterNavigate();
|
||||||
|
|
||||||
|
|
BIN
Extensions/OpenYoutubeSafariExtension.appex/images/cat_1.0.gif
Normal file
After Width: | Height: | Size: 110 KiB |
BIN
Extensions/OpenYoutubeSafariExtension.appex/images/icon-128.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
Extensions/OpenYoutubeSafariExtension.appex/images/icon-256.png
Normal file
After Width: | Height: | Size: 42 KiB |
BIN
Extensions/OpenYoutubeSafariExtension.appex/images/icon-48.png
Normal file
After Width: | Height: | Size: 3.4 KiB |
BIN
Extensions/OpenYoutubeSafariExtension.appex/images/icon-512.png
Normal file
After Width: | Height: | Size: 128 KiB |
BIN
Extensions/OpenYoutubeSafariExtension.appex/images/icon-64.png
Normal file
After Width: | Height: | Size: 5.0 KiB |
BIN
Extensions/OpenYoutubeSafariExtension.appex/images/icon-96.png
Normal file
After Width: | Height: | Size: 9.5 KiB |
After Width: | Height: | Size: 454 B |
After Width: | Height: | Size: 569 B |
After Width: | Height: | Size: 919 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 2.1 KiB |
40
Extensions/OpenYoutubeSafariExtension.appex/manifest.json
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"manifest_version": 2,
|
||||||
|
"default_locale": "en",
|
||||||
|
|
||||||
|
"name": "__MSG_extension_name__",
|
||||||
|
"description": "__MSG_extension_description__",
|
||||||
|
"version": "1.0",
|
||||||
|
|
||||||
|
"icons": {
|
||||||
|
"48": "images/icon-48.png",
|
||||||
|
"96": "images/icon-96.png",
|
||||||
|
"128": "images/icon-128.png",
|
||||||
|
"256": "images/icon-256.png",
|
||||||
|
"512": "images/icon-512.png"
|
||||||
|
},
|
||||||
|
|
||||||
|
"background": {
|
||||||
|
"scripts": [ "background.js" ],
|
||||||
|
"persistent": false
|
||||||
|
},
|
||||||
|
|
||||||
|
"content_scripts": [{
|
||||||
|
"js": [ "content.js" ],
|
||||||
|
"matches": [ "*://*.youtube.com/*" ]
|
||||||
|
}],
|
||||||
|
|
||||||
|
"browser_action": {
|
||||||
|
"default_popup": "popup.html",
|
||||||
|
"default_icon": {
|
||||||
|
"16": "images/toolbar-icon-16.png",
|
||||||
|
"19": "images/toolbar-icon-19.png",
|
||||||
|
"32": "images/toolbar-icon-32.png",
|
||||||
|
"38": "images/toolbar-icon-38.png",
|
||||||
|
"48": "images/toolbar-icon-48.png",
|
||||||
|
"72": "images/toolbar-icon-72.png"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"permissions": [ ]
|
||||||
|
}
|
15
Extensions/OpenYoutubeSafariExtension.appex/popup.css
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
:root {
|
||||||
|
color-scheme: light dark;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
width: 100px;
|
||||||
|
padding: 10px;
|
||||||
|
|
||||||
|
font-family: system-ui;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
/* Dark Mode styles go here. */
|
||||||
|
}
|
21
Extensions/OpenYoutubeSafariExtension.appex/popup.html
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<link rel="stylesheet" href="popup.css">
|
||||||
|
<script type="module" src="popup.js"></script>
|
||||||
|
</head>
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
background-image:url('images/cat_1.0.gif');
|
||||||
|
background-size:100%;
|
||||||
|
background-repeat: repeat-y;
|
||||||
|
background-attachment: fixed;
|
||||||
|
height:100%;
|
||||||
|
width:100%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<body>
|
||||||
|
<strong>Extension made by @CokePokes</strong>
|
||||||
|
</body>
|
||||||
|
</html>
|
1
Extensions/OpenYoutubeSafariExtension.appex/popup.js
Normal file
@@ -0,0 +1 @@
|
|||||||
|
console.log("Hello World!", browser);
|
20
Extensions/README.md
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
# YoutubeExtensions
|
||||||
|
appex extensions for sideloaded YT
|
||||||
|
|
||||||
|
|
||||||
|
What is this?
|
||||||
|
|
||||||
|
These plugins enable "Open In" for sideloaded Youtube without any need to download other Opener apps /Shortcuts.
|
||||||
|
|
||||||
|
|
||||||
|
How to install:
|
||||||
|
|
||||||
|
1. Download the .appex files here
|
||||||
|
2. Unzip Youtube.ipa & copy them to /Payload/Youtube.app/Plugins
|
||||||
|
3. Compress Payload folder & rename .zip to .ipa
|
||||||
|
4. Sign & Install onto device
|
||||||
|
5. Open YouTube once & then open Safari to enable the iOS 15 safari plugin [prompted always allow - do it]
|
||||||
|
6. Press the Share icon in Safari scroll app list > More > Enable Youtube
|
||||||
|
|
||||||
|
Done!
|
||||||
|
|
BIN
Extensions/ShareServiceExtension.appex/Info.plist
Normal file
BIN
Extensions/ShareServiceExtension.appex/Youtube
Executable file
BIN
Extensions/ShareServiceExtension.appex/Youtube@2x.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
@@ -0,0 +1,157 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>files</key>
|
||||||
|
<dict>
|
||||||
|
<key>Base.lproj/MainInterface.storyboardc/Info.plist</key>
|
||||||
|
<data>
|
||||||
|
Bgt43YuQd48Y7NBkKAH/I1Nd+7Q=
|
||||||
|
</data>
|
||||||
|
<key>Base.lproj/MainInterface.storyboardc/UIViewController-j1y-V4-xli.nib</key>
|
||||||
|
<data>
|
||||||
|
t/rVTMy59WLCl0e0ydlT2JlJKIs=
|
||||||
|
</data>
|
||||||
|
<key>Base.lproj/MainInterface.storyboardc/j1y-V4-xli-view-wbc-yd-nQP.nib</key>
|
||||||
|
<data>
|
||||||
|
56s4vIzFNrq5HEvB3Mr6qnqVRFg=
|
||||||
|
</data>
|
||||||
|
<key>Info.plist</key>
|
||||||
|
<data>
|
||||||
|
7+n2S5sS/Ngeoe21gJMc6iC6+ac=
|
||||||
|
</data>
|
||||||
|
<key>embedded.mobileprovision</key>
|
||||||
|
<data>
|
||||||
|
dVGLS8Qpu/eCI1J5VCu9IfYq3Z4=
|
||||||
|
</data>
|
||||||
|
<key>icon.png</key>
|
||||||
|
<data>
|
||||||
|
/pip+c1EETgjhxNcOhgiyQxxzyU=
|
||||||
|
</data>
|
||||||
|
</dict>
|
||||||
|
<key>files2</key>
|
||||||
|
<dict>
|
||||||
|
<key>Base.lproj/MainInterface.storyboardc/Info.plist</key>
|
||||||
|
<dict>
|
||||||
|
<key>hash2</key>
|
||||||
|
<data>
|
||||||
|
Qnp5pVqL/lRCSEISDYZs1VBLxfcEnfpOzHg6WgcgLgk=
|
||||||
|
</data>
|
||||||
|
</dict>
|
||||||
|
<key>Base.lproj/MainInterface.storyboardc/UIViewController-j1y-V4-xli.nib</key>
|
||||||
|
<dict>
|
||||||
|
<key>hash2</key>
|
||||||
|
<data>
|
||||||
|
VpQww1vK2BoM0RIaiw/B/8JZ3kp5Pks5bM8Sjtjju9w=
|
||||||
|
</data>
|
||||||
|
</dict>
|
||||||
|
<key>Base.lproj/MainInterface.storyboardc/j1y-V4-xli-view-wbc-yd-nQP.nib</key>
|
||||||
|
<dict>
|
||||||
|
<key>hash2</key>
|
||||||
|
<data>
|
||||||
|
C87FO0vFlvhG8vp7+3v+EcR9kbOeu9v+mDLy/iU+6e8=
|
||||||
|
</data>
|
||||||
|
</dict>
|
||||||
|
<key>embedded.mobileprovision</key>
|
||||||
|
<dict>
|
||||||
|
<key>hash2</key>
|
||||||
|
<data>
|
||||||
|
4TQyzTTz0VYUTM0IXf2PMSufVEkzd4WlPWbwKMyfKfQ=
|
||||||
|
</data>
|
||||||
|
</dict>
|
||||||
|
<key>icon.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>hash2</key>
|
||||||
|
<data>
|
||||||
|
mfufJ0CJyFLUpRnLC8q8awHkGqmWeQtRDgF5EBXKUQs=
|
||||||
|
</data>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<key>rules</key>
|
||||||
|
<dict>
|
||||||
|
<key>^.*</key>
|
||||||
|
<true/>
|
||||||
|
<key>^.*\.lproj/</key>
|
||||||
|
<dict>
|
||||||
|
<key>optional</key>
|
||||||
|
<true/>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>1000</real>
|
||||||
|
</dict>
|
||||||
|
<key>^.*\.lproj/locversion.plist$</key>
|
||||||
|
<dict>
|
||||||
|
<key>omit</key>
|
||||||
|
<true/>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>1100</real>
|
||||||
|
</dict>
|
||||||
|
<key>^Base\.lproj/</key>
|
||||||
|
<dict>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>1010</real>
|
||||||
|
</dict>
|
||||||
|
<key>^version.plist$</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>rules2</key>
|
||||||
|
<dict>
|
||||||
|
<key>.*\.dSYM($|/)</key>
|
||||||
|
<dict>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>11</real>
|
||||||
|
</dict>
|
||||||
|
<key>^(.*/)?\.DS_Store$</key>
|
||||||
|
<dict>
|
||||||
|
<key>omit</key>
|
||||||
|
<true/>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>2000</real>
|
||||||
|
</dict>
|
||||||
|
<key>^.*</key>
|
||||||
|
<true/>
|
||||||
|
<key>^.*\.lproj/</key>
|
||||||
|
<dict>
|
||||||
|
<key>optional</key>
|
||||||
|
<true/>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>1000</real>
|
||||||
|
</dict>
|
||||||
|
<key>^.*\.lproj/locversion.plist$</key>
|
||||||
|
<dict>
|
||||||
|
<key>omit</key>
|
||||||
|
<true/>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>1100</real>
|
||||||
|
</dict>
|
||||||
|
<key>^Base\.lproj/</key>
|
||||||
|
<dict>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>1010</real>
|
||||||
|
</dict>
|
||||||
|
<key>^Info\.plist$</key>
|
||||||
|
<dict>
|
||||||
|
<key>omit</key>
|
||||||
|
<true/>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>20</real>
|
||||||
|
</dict>
|
||||||
|
<key>^PkgInfo$</key>
|
||||||
|
<dict>
|
||||||
|
<key>omit</key>
|
||||||
|
<true/>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>20</real>
|
||||||
|
</dict>
|
||||||
|
<key>^embedded\.provisionprofile$</key>
|
||||||
|
<dict>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>20</real>
|
||||||
|
</dict>
|
||||||
|
<key>^version\.plist$</key>
|
||||||
|
<dict>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>20</real>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
7
Extensions/ShareServiceExtension.appex/test.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
var GetURL = function() {};
|
||||||
|
GetURL.prototype = {
|
||||||
|
run: function(arguments) {
|
||||||
|
arguments.completionFunction({"URL": document.URL});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var ExtensionPreprocessingJS = new GetURL;
|
165
Header.h
Normal file
@@ -0,0 +1,165 @@
|
|||||||
|
#import "Tweaks/YouTubeHeader/YTPlayerViewController.h" // Header.h
|
||||||
|
#import "Tweaks/YouTubeHeader/YTQTMButton.h" // Header.h
|
||||||
|
#import <UIKit/UIKit.h>
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
#import <CaptainHook/CaptainHook.h>
|
||||||
|
#import <objc/runtime.h>
|
||||||
|
#import <dlfcn.h>
|
||||||
|
#import <sys/utsname.h>
|
||||||
|
#import <substrate.h>
|
||||||
|
#import <rootless.h>
|
||||||
|
#import "Tweaks/FLEX/FLEX.h"
|
||||||
|
#import "Tweaks/YouTubeHeader/YTVideoQualitySwitchOriginalController.h"
|
||||||
|
#import "Tweaks/YouTubeHeader/YTPlayerViewController.h"
|
||||||
|
#import "Tweaks/YouTubeHeader/YTWatchController.h"
|
||||||
|
#import "Tweaks/YouTubeHeader/YTIGuideResponse.h"
|
||||||
|
#import "Tweaks/YouTubeHeader/YTIGuideResponseSupportedRenderers.h"
|
||||||
|
#import "Tweaks/YouTubeHeader/YTIPivotBarSupportedRenderers.h"
|
||||||
|
#import "Tweaks/YouTubeHeader/YTIPivotBarRenderer.h"
|
||||||
|
#import "Tweaks/YouTubeHeader/YTIBrowseRequest.h"
|
||||||
|
#import "Tweaks/YouTubeHeader/YTCommonColorPalette.h"
|
||||||
|
#import "Tweaks/YouTubeHeader/ASCollectionView.h"
|
||||||
|
#import "Tweaks/YouTubeHeader/YTPlayerOverlay.h"
|
||||||
|
#import "Tweaks/YouTubeHeader/YTPlayerOverlayProvider.h"
|
||||||
|
#import "Tweaks/YouTubeHeader/YTReelWatchPlaybackOverlayView.h"
|
||||||
|
#import "Tweaks/YouTubeHeader/YTReelPlayerBottomButton.h"
|
||||||
|
#import "Tweaks/YouTubeHeader/YTReelPlayerViewController.h"
|
||||||
|
#import "Tweaks/YouTubeHeader/YTAlertView.h"
|
||||||
|
#import "Tweaks/YouTubeHeader/YTISectionListRenderer.h"
|
||||||
|
#import "Tweaks/YouTubeHeader/YTPivotBarItemView.h"
|
||||||
|
|
||||||
|
#define LOC(x) [tweakBundle localizedStringForKey:x value:nil table:nil]
|
||||||
|
#define YT_BUNDLE_ID @"com.google.ios.youtube"
|
||||||
|
#define YT_NAME @"YouTube"
|
||||||
|
|
||||||
|
// YTSpeed
|
||||||
|
@interface YTVarispeedSwitchControllerOption : NSObject
|
||||||
|
- (id)initWithTitle:(id)title rate:(float)rate;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface MLHAMQueuePlayer : NSObject
|
||||||
|
@property id playerEventCenter;
|
||||||
|
@property id delegate;
|
||||||
|
- (void)setRate:(float)rate;
|
||||||
|
- (void)internalSetRate;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface MLPlayerStickySettings : NSObject
|
||||||
|
- (void)setRate:(float)rate;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface MLPlayerEventCenter : NSObject
|
||||||
|
- (void)broadcastRateChange:(float)rate;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface HAMPlayerInternal : NSObject
|
||||||
|
- (void)setRate:(float)rate;
|
||||||
|
@end
|
||||||
|
|
||||||
|
// YTLitePlus
|
||||||
|
@interface YTChipCloudCell : UIView
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTPlayabilityResolutionUserActionUIController : NSObject // Skips content warning before playing *some videos - @PoomSmart
|
||||||
|
- (void)confirmAlertDidPressConfirm;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTMainAppControlsOverlayView: UIView
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTTransportControlsButtonView : UIView
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTPlaybackButton : UIControl
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTSegmentableInlinePlayerBarView
|
||||||
|
@property (nonatomic, assign, readwrite) BOOL enableSnapToChapter;
|
||||||
|
@end
|
||||||
|
|
||||||
|
// Cercube button in Nav bar
|
||||||
|
@interface MDCButton : UIButton
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTRightNavigationButtons : UIView
|
||||||
|
@property (nonatomic, strong, readwrite) MDCButton *cercubeButton;
|
||||||
|
@property YTQTMButton *notificationButton;
|
||||||
|
@property YTQTMButton *sponsorBlockButton;
|
||||||
|
@end
|
||||||
|
|
||||||
|
// IAmYouTube
|
||||||
|
@interface SSOConfiguration : NSObject
|
||||||
|
@end
|
||||||
|
|
||||||
|
// BigYTMiniPlayer
|
||||||
|
@interface YTMainAppVideoPlayerOverlayView : UIView
|
||||||
|
- (UIViewController *)_viewControllerForAncestor;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTWatchMiniBarView : UIView
|
||||||
|
@end
|
||||||
|
|
||||||
|
// YTAutoFullscreen
|
||||||
|
@interface YTPlayerViewController (YTAFS)
|
||||||
|
- (void)autoFullscreen;
|
||||||
|
@end
|
||||||
|
|
||||||
|
// YTNoShorts
|
||||||
|
@interface ELMCellNode
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface _ASCollectionViewCell : UICollectionViewCell
|
||||||
|
- (id)node;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTAsyncCollectionView : UICollectionView
|
||||||
|
- (void)removeShortsCellAtIndexPath:(NSIndexPath *)indexPath;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTPlayerView : UIView
|
||||||
|
- (void)downloadVideo;
|
||||||
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
// App Theme
|
||||||
|
@interface YCHLiveChatView : UIView
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTFullscreenEngagementOverlayView : UIView
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTRelatedVideosView : UIView
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface ELMView: UIView
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface ASWAppSwitcherCollectionViewCell: UIView
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface ASScrollView : UIView
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface UIKeyboardLayoutStar : UIView
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface UIKeyboardDockView : UIView
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface _ASDisplayView : UIView
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTCommentDetailHeaderCell : UIView
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface SponsorBlockSettingsController : UITableViewController
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface SponsorBlockViewController : UIViewController
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface UICandidateViewController : UIViewController
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface UIPredictionViewController : UIViewController
|
||||||
|
@end
|
42
Makefile
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
TARGET = iphone:clang:15.5:14.0
|
||||||
|
YTLitePlus_USE_FISHHOOK = 0
|
||||||
|
ARCHS = arm64
|
||||||
|
MODULES = jailed
|
||||||
|
FINALPACKAGE = 1
|
||||||
|
CODESIGN_IPA = 0
|
||||||
|
PACKAGE_VERSION = 18.23.3-2.0
|
||||||
|
|
||||||
|
TWEAK_NAME = YTLitePlus
|
||||||
|
DISPLAY_NAME = YouTube
|
||||||
|
BUNDLE_ID = com.google.ios.youtube
|
||||||
|
|
||||||
|
EXTRA_CFLAGS := $(addprefix -I,$(shell find Tweaks/FLEX -name '*.h' -exec dirname {} \;))
|
||||||
|
|
||||||
|
YTLitePlus_INJECT_DYLIBS = .theos/obj/libcolorpicker.dylib .theos/obj/iSponsorBlock.dylib .theos/obj/YTUHD.dylib .theos/obj/YouPiP.dylib .theos/obj/YouTubeDislikesReturn.dylib .theos/obj/YTABConfig.dylib .theos/obj/YouMute.dylib .theos/obj/DontEatMyContent.dylib .theos/obj/YTHoldForSpeed.dylib .theos/obj/YTLite.dylib
|
||||||
|
YTLitePlus_FILES = YTLitePlus.xm $(shell find Source -name '*.xm' -o -name '*.x' -o -name '*.m') $(shell find Tweaks/FLEX -type f \( -iname \*.c -o -iname \*.m -o -iname \*.mm \))
|
||||||
|
YTLitePlus_IPA = ./tmp/Payload/YouTube.app
|
||||||
|
YTLitePlus_CFLAGS = -fobjc-arc -Wno-deprecated-declarations -Wno-unsupported-availability-guard -Wno-unused-but-set-variable -DTWEAK_VERSION=$(PACKAGE_VERSION) $(EXTRA_CFLAGS)
|
||||||
|
YTLitePlus_FRAMEWORKS = UIKit Security
|
||||||
|
|
||||||
|
include $(THEOS)/makefiles/common.mk
|
||||||
|
include $(THEOS_MAKE_PATH)/tweak.mk
|
||||||
|
SUBPROJECTS += Tweaks/Alderis Tweaks/iSponsorBlock Tweaks/YTUHD Tweaks/YouPiP Tweaks/Return-YouTube-Dislikes Tweaks/YTABConfig Tweaks/YouMute Tweaks/DontEatMyContent Tweaks/YTLite Tweaks/YTHoldForSpeed
|
||||||
|
include $(THEOS_MAKE_PATH)/aggregate.mk
|
||||||
|
|
||||||
|
before-package::
|
||||||
|
@echo -e "==> \033[1mMoving tweak's bundle to Resources/...\033[0m"
|
||||||
|
@mkdir -p Resources/Frameworks/Alderis.framework && find .theos/obj/install/Library/Frameworks/Alderis.framework -maxdepth 1 -type f -exec cp {} Resources/Frameworks/Alderis.framework/ \;
|
||||||
|
@cp -R Tweaks/YTLite/layout/Library/Application\ Support/YTLite.bundle Resources/
|
||||||
|
@cp -R Tweaks/YTUHD/layout/Library/Application\ Support/YTUHD.bundle Resources/
|
||||||
|
@cp -R Tweaks/YouPiP/layout/Library/Application\ Support/YouPiP.bundle Resources/
|
||||||
|
@cp -R Tweaks/Return-YouTube-Dislikes/layout/Library/Application\ Support/RYD.bundle Resources/
|
||||||
|
@cp -R Tweaks/YTABConfig/layout/Library/Application\ Support/YTABC.bundle Resources/
|
||||||
|
@cp -R Tweaks/YouMute/layout/Library/Application\ Support/YouMute.bundle Resources/
|
||||||
|
@cp -R Tweaks/DontEatMyContent/layout/Library/Application\ Support/DontEatMyContent.bundle Resources/
|
||||||
|
@cp -R Tweaks/YTHoldForSpeed/layout/Library/Application\ Support/YTHoldForSpeed.bundle Resources/
|
||||||
|
@cp -R Tweaks/iSponsorBlock/layout/Library/Application\ Support/iSponsorBlock.bundle Resources/
|
||||||
|
@cp -R lang/YTLitePlus.bundle Resources/
|
||||||
|
@echo -e "==> \033[1mChanging the installation path of dylibs...\033[0m"
|
||||||
|
@ldid -r .theos/obj/iSponsorBlock.dylib && install_name_tool -change /usr/lib/libcolorpicker.dylib @rpath/libcolorpicker.dylib .theos/obj/iSponsorBlock.dylib
|
||||||
|
@codesign --remove-signature .theos/obj/libcolorpicker.dylib && install_name_tool -change /Library/Frameworks/Alderis.framework/Alderis @rpath/Alderis.framework/Alderis .theos/obj/libcolorpicker.dylib
|
||||||
|
|
302
README.md
Normal file
@@ -0,0 +1,302 @@
|
|||||||
|
## Cercube with extra features!
|
||||||
|
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img src="https://img.shields.io/badge/Platform-iOS%20%7C%20iPadOS%2014.0%2B-yellow" alt="Badge"/>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://github.com/Balackburn/CercubePlusExtra/releases/latest"><img src="https://custom-icon-badges.demolab.com/github/v/release/arichorn/CercubePlusExtra?color=brightgreen&label=Latest%20release" alt="Badge"></img></a>
|
||||||
|
<a href="https://github.com/Balackburn/CercubePlusExtra/releases/latest"><img src="https://img.shields.io/github/downloads/arichorn/CercubePlusExtra/total?label=Download" alt="Badge"></img></a>
|
||||||
|
<a href="https://github.com/Balackburn/CercubePlusExtra/commit"><img src="https://custom-icon-badges.demolab.com/github/last-commit/arichorn/CercubePlusExtra?logo=history&logoColor=white&label=Last commit" alt="Badge"></img></a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img src="https://img.shields.io/github/stars/arichorn/CercubePlusExtra?style=social" alt="Badge"/>
|
||||||
|
<img src="https://img.shields.io/github/forks/arichorn/CercubePlusExtra?style=social" alt="Badge"/>
|
||||||
|
<a href="https://github.com/qnblackcat/uYouPlus#support-the-developers"><img src="https://img.shields.io/badge/-Support-lightgrey?style=social&logo=paypal" alt="Badge"></img></a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
# Table of Contents
|
||||||
|
|
||||||
|
* [Credits](#credits)
|
||||||
|
* [Features](#features)
|
||||||
|
* [Known issues](#known-issues)
|
||||||
|
* [Download (IPA)](#download-ipa)
|
||||||
|
* [Support the developers!](#support-the-developers)
|
||||||
|
* [Building (optional)](#building-optional)
|
||||||
|
|
||||||
|
# Credits
|
||||||
|
|
||||||
|
<table id='maintainer credit'>
|
||||||
|
Special thanks to these developer(s) for maintaining and improving CercubePlus (@qnblackcat is the OG dev)
|
||||||
|
<tr>
|
||||||
|
<td id='arichorn'>
|
||||||
|
<a href='https://github.com/arichorn'>
|
||||||
|
<img src='https://github.com/arichorn.png' width='140px;'>
|
||||||
|
</a>
|
||||||
|
<h4 align='center'><a href='https://github.com/arichorn'>arichorn</a></h4>
|
||||||
|
</td>
|
||||||
|
<td id='qnblackcat'>
|
||||||
|
<a href='https://github.com/qnblackcat'>
|
||||||
|
<img src='https://github.com/qnblackcat.png' width='140px;'>
|
||||||
|
</a>
|
||||||
|
<h4 align='center'><a href='https://github.com/qnblackcat'>Qnblackcat</a></h4>
|
||||||
|
</td>
|
||||||
|
<td id='dayanch96'>
|
||||||
|
<a href='https://github.com/dayanch96'>
|
||||||
|
<img src='https://github.com/dayanch96.png' width='140px;'>
|
||||||
|
</a>
|
||||||
|
<h4 align='center'><a href='https://github.com/dayanch96'>dayanch96</a></h4>
|
||||||
|
</td>
|
||||||
|
<td id='ssuesskind'>
|
||||||
|
<a href='https://github.com/ssuesskind'>
|
||||||
|
<img src='https://github.com/ssuesskind.png' width='140px;'>
|
||||||
|
</a>
|
||||||
|
<h4 align='center'><a href='https://github.com/ssuesskind'>ssuesskind</a></h4>
|
||||||
|
</td>
|
||||||
|
|
||||||
|
<table id='credit'>
|
||||||
|
Special thanks to all the developers who have contributed to CercubePlus/CercubePlusExtra!
|
||||||
|
|
||||||
|
(Cercube is an original tweak by Majd Alfhaily @majd)
|
||||||
|
<tr>
|
||||||
|
<td id='majd'>
|
||||||
|
<a href='https://github.com/majd'>
|
||||||
|
<img src='https://github.com/majd.png' width='140px;'>
|
||||||
|
</a>
|
||||||
|
<h4 align='center'><a href='https://github.com/majd'>Majd Alfhaily</a></h4>
|
||||||
|
</td>
|
||||||
|
<td id='PoomSmart'>
|
||||||
|
<a href='https://github.com/PoomSmart'>
|
||||||
|
<img src='https://github.com/PoomSmart.png' width='140px;'>
|
||||||
|
</a>
|
||||||
|
<h4 align='center'><a href='https://github.com/PoomSmart'>PoomSmart</a></h4>
|
||||||
|
</td>
|
||||||
|
<td id='miro92'>
|
||||||
|
<a href='https://github.com/MiRO92'>
|
||||||
|
<img src='https://github.com/MiRO92.png' width='140px;'>
|
||||||
|
</a>
|
||||||
|
<h4 align='center'><a href='https://twitter.com/miro92'>MiRO92</a></h4>
|
||||||
|
</td>
|
||||||
|
<td id='level3tjg'>
|
||||||
|
<a href='https://github.com/level3tjg'>
|
||||||
|
<img src='https://github.com/level3tjg.png' width='140px;'>
|
||||||
|
</a>
|
||||||
|
<h4 align='center'><a href='https://twitter.com/level3tjg'>level3tjg</a></h4>
|
||||||
|
</td>
|
||||||
|
<td id='bandarHL'>
|
||||||
|
<a href='https://github.com/BandarHL'>
|
||||||
|
<img src='https://github.com/BandarHL.png' width='140px;'>
|
||||||
|
</a>
|
||||||
|
<h4 align='center'><a href='https://twitter.com/bandarhl'>BandarHelal</a></h4>
|
||||||
|
</td>
|
||||||
|
<td id='galactic-dev'>
|
||||||
|
<a href='https://github.com/Galactic-Dev'>
|
||||||
|
<img src='https://github.com/Galactic-Dev.png' width='140px;'>
|
||||||
|
</a>
|
||||||
|
<h4 align='center'><a href='https://twitter.com/dev_galactic'>galactic</a></h4>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td id='hbang'>
|
||||||
|
<a href='https://github.com/hbang'>
|
||||||
|
<img src='https://github.com/hbang.png' width='140px;'>
|
||||||
|
</a>
|
||||||
|
<h4 align='center'><a href='https://twitter.com/hashbang'>HASHBANG</a></h4>
|
||||||
|
</td>
|
||||||
|
<td id='lyvendia'>
|
||||||
|
<a href='https://github.com/Lyvendia'>
|
||||||
|
<img src='https://github.com/Lyvendia.png' width='140px;'>
|
||||||
|
</a>
|
||||||
|
<h4 align='center'><a href='https://github.com/Lyvendia'>Lyvendia</a></h4>
|
||||||
|
</td>
|
||||||
|
<td id='foxster'>
|
||||||
|
<a href='https://github.com/therealFoxster'>
|
||||||
|
<img src='https://github.com/therealFoxster.png' width='140px;'>
|
||||||
|
</a>
|
||||||
|
<h4 align='center'><a href='https://twitter.com/therealFoxster'>Foxster</a></h4>
|
||||||
|
</td>
|
||||||
|
<td id='julioverne'>
|
||||||
|
<a href='https://github.com/julioverne'>
|
||||||
|
<img src='https://github.com/julioverne.png' width='140px;'>
|
||||||
|
</a>
|
||||||
|
<h4 align='center'><a href='https://twitter.com/ijulioverne'>julioverne</a></h4>
|
||||||
|
</td>
|
||||||
|
<td id='ichitaso'>
|
||||||
|
<a href='https://github.com/ichitaso'>
|
||||||
|
<img src='https://github.com/ichitaso.png' width='140px;'>
|
||||||
|
</a>
|
||||||
|
<h4 align='center'><a href='https://twitter.com/ichitaso'>ichitaso</a></h4>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td id='ahmed-bafkir'>
|
||||||
|
<a href='https://github.com/AhmedBafkir'>
|
||||||
|
<img src='https://github.com/AhmedBafkir.png' width='140px;'>
|
||||||
|
</a>
|
||||||
|
<h4 align='center'><a href='https://twitter.com/Peaceful_0'>Ahmed Bafkir</a></h4>
|
||||||
|
</td>
|
||||||
|
<td id='cokepokes'>
|
||||||
|
<a href='https://github.com/CokePokes'>
|
||||||
|
<img src='https://github.com/CokePokes.png' width='140px;'>
|
||||||
|
</a>
|
||||||
|
<h4 align='center'><a href='https://twitter.com/cokepokes'>CokePokes</a></h4>
|
||||||
|
</td>
|
||||||
|
<td id='isnackable'>
|
||||||
|
<a href='https://github.com/ISnackable'>
|
||||||
|
<img src='https://github.com/ISnackable.png' width='140px;'>
|
||||||
|
</a>
|
||||||
|
<h4 align='center'><a href='https://isnackable.me/'>Tommy Teo</a></h4>
|
||||||
|
</td>
|
||||||
|
<td id='SKIEDs'>
|
||||||
|
<a href='https://github.com/SKEIDs'>
|
||||||
|
<img src='https://github.com/SKEIDs.png' width='140px;'>
|
||||||
|
</a>
|
||||||
|
<h4 align='center'><a href='https://github.com/SKEIDs'>SKIEDs</a></h4>
|
||||||
|
</td>
|
||||||
|
<td id='theos-team'>
|
||||||
|
<a href='https://github.com/theos/theos'>
|
||||||
|
<img src='https://github.com/theos.png' width='140px;'>
|
||||||
|
</a>
|
||||||
|
<h4 align='center'><a href='https://theos.dev'>theos</a></h4>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
# Features
|
||||||
|
|
||||||
|
1. **Cercube:**
|
||||||
|
|
||||||
|
- Block all advertisements & Enable background playback.
|
||||||
|
|
||||||
|
- Set default player quality on WiFi & Celullar.
|
||||||
|
|
||||||
|
- Save videos in high resolution, save videos as audio-only, save public playlists (beta).
|
||||||
|
|
||||||
|
- And many more...
|
||||||
|
|
||||||
|
2. **iSponsorBlock:** Skips annoying sponsor ads inside videos. iSponsorBlock is based on [SponsorBlock engine](https://sponsor.ajay.app/). Basically, this is the iOS version of the SponsorBlock extension.
|
||||||
|
|
||||||
|
3. **YouPiP:** enable YouTube's **native PiP**. More options are in YouTube Settings => General.
|
||||||
|
|
||||||
|
4. **YTUHD:** unlock VP9 codec and in effect, enables video quality of 2K and 4K. You can configure YTUHD in YouTube's Settings - Video quality preferences.
|
||||||
|
|
||||||
|
5. **YouTube Dislike Return:** brings back Dislike counts under YouTube videos using **ReturnYoutubeDislike**'s API.
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>and many more...!</summary>
|
||||||
|
|
||||||
|
6. **YTClassicVideoQuality:** since YouTube v16.xx, you need one more step to change the video quality. YTClassicVideoQuality brings back the old video quality selector, which is a lot better than the new one.
|
||||||
|
|
||||||
|
7. **YTNoHoverCards:** offer an option to enable/disable the annoying suggested videos show up at the end of the videos.
|
||||||
|
|
||||||
|
8. **YTABGoodies:** allow you to disable some YouTube A/B testing features. It is a combination of several tweaks, such as:
|
||||||
|
|
||||||
|
- YouAreThere: disable "Video paused. Continue watching?" popup in the YouTube app when you play a long video.
|
||||||
|
|
||||||
|
- YouRememberCaption: make YouTube remember your video caption setting (if not already).
|
||||||
|
|
||||||
|
- YTNoCheckLocalNetwork: block the Local Network permission popup.
|
||||||
|
|
||||||
|
9. **NOYTPremium:** remove YouTube Premium upsell alerts.
|
||||||
|
|
||||||
|
10. **YTSpeed**: a toggleable tweak to add 2.25x, 2.5x, 2.75x, 3x, 3.25x, 3.5x, 3.75x, 4x & 5x playback speed options in the video player.
|
||||||
|
|
||||||
|
11. **YTMiniplayerEnabler**: enable Miniplayer for all YouTube videos.
|
||||||
|
|
||||||
|
12. **DontEatMyContent**: prevent the notch/Dynamic Island from munching on 2:1 video content in YouTube.
|
||||||
|
|
||||||
|
13. **YTShortsProgress**: always enable progress bar and scrubbing in YouTube Shorts (iPhone only).
|
||||||
|
|
||||||
|
14. **YTABConfig**: allow user to control over YouTube A/B testing flags.
|
||||||
|
|
||||||
|
15. **YouMute**: Mute/unmute videos in the YouTube Video Player directly.
|
||||||
|
|
||||||
|
16. **LowContrastMode**: makes the YouTube Interface Low Contrast as possible to make it easier on the eyes.
|
||||||
|
|
||||||
|
any many more...
|
||||||
|
</details>
|
||||||
|
|
||||||
|
# Known issues
|
||||||
|
|
||||||
|
1. **Cercube**:
|
||||||
|
|
||||||
|
- Hide Cast button is not working. (Workaround: Hide cast button in CercubePlus settings)
|
||||||
|
|
||||||
|
- The Updated Dark Mode in the YouTube App is not Present or Working in Cercube v5.3.13 & older versions
|
||||||
|
|
||||||
|
2. **LowContrastMode**: this tweak doesn't work everywhere with every ui element on the YouTube App.
|
||||||
|
|
||||||
|
3. **YTUHD**: [Stuttering on 4K videos](https://github.com/qnblackcat/uYouPlus/issues/6).
|
||||||
|
|
||||||
|
4. **YouPiP** (iOS 14.0 - 14.4.2): due to Apple's fault, you may encounter the *speedup-bug* as described [here](https://drive.google.com/file/d/1NKdv1fr_KRWgD8nhkMDfG2eLBnbdeVtX/view?usp=sharing). The bug also happens when you try to play multi-sources of sound at the same time. Enable **LegacyPiP** is a workaround. Keep in mind that LegacyPiP also removes UHD quality and breaks YouTube Autoplay next. Use it at your own risk!
|
||||||
|
|
||||||
|
5. **Not a bug**:
|
||||||
|
|
||||||
|
- The app won't be able to receive push notifications if you use a free developer account to sideload it.
|
||||||
|
|
||||||
|
- It's impossible to fix deep-link (a.k.a Open in the YouTube app). However, you can use this [Shortcuts](https://shortcutsgallery.com/shortcuts/open-in-youtube/) as a workaround (tested on iOS 14). **Credit:** RandomAccessMemories#5025
|
||||||
|
|
||||||
|
# Download (IPA)
|
||||||
|
|
||||||
|
- **CercubePlus** (or you can call it Cercube+) requires iOS & iPadOS 14.0 and later. The latest version of **CercubePlus** can be found in the [Release tab](https://github.com/Balackburn/CercubePlusExtra/releases/latest).
|
||||||
|
|
||||||
|
- For AltStore user: [Open in AltStore (v18.18.2-5.3.11)](https://tinyurl.com/5a5jn7ra) - It will take a while to install because AltStore needs to download the IPA first.
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Alternative Download</summary>
|
||||||
|
|
||||||
|
[Open in AltStore (v18.14.1-5.3.11-F2)](https://tinyurl.com/4exxknn8) - This is the **v18.14.1-5.3.11-F2** release. only use this to resolve the OLED/OLD Dark Mode Problem.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
- Version info: _(May 9 2023)_
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Expand!</summary>
|
||||||
|
|
||||||
|
| **Tweaks/App** | **Developer** | **Version** | **Open source** |
|
||||||
|
| - | - | :-: | :-: |
|
||||||
|
| **YouTube** | Google Inc | 18.21.3 | ✖︎ |
|
||||||
|
| **Cercube** | Majd Alfhaily | 5.3.11 | ✖︎ |
|
||||||
|
| **Open in YouTube** | [CokePokes](https://github.com/CokePokes/) | 1.2 | ✖︎ |
|
||||||
|
| **YTNoShorts** | [MiRO92](https://twitter.com/miro92) | 1.0.2 | [✔︎](https://github.com/MiRO92/YTNoShorts) |
|
||||||
|
| **iSponsorBlock** | [Galactic-Dev](https://github.com/Galactic-Dev) | 1.0-15 | [✔︎](https://github.com/Galactic-Dev/iSponsorBlock) |
|
||||||
|
| **BigYTMiniPlayer** | [Galactic-Dev](https://github.com/Galactic-Dev) | 1.0-1 | [✔︎](https://github.com/Galactic-Dev/BigYTMiniPlayer) |
|
||||||
|
| **YTNoHoverCards** | [level3tjg](https://twitter.com/level3tjg) | 0.0.3 | [✔︎](https://github.com/level3tjg/YTNoHoverCards) |
|
||||||
|
| **YTMiniplayerEnabler** | [level3tjg](https://twitter.com/level3tjg) | 0.0.2 | [✔︎](https://github.com/level3tjg/YTMiniplayerEnabler) |
|
||||||
|
| **DontEatMyContent** | [therealFoxster](https://github.com/therealFoxster) | 1.0.6 | [✔︎](https://github.com/therealFoxster/DontEatMyContent) |
|
||||||
|
| **LowContrastMode** | arichorn | 1.2.3 | [✔︎](https://github.com/arichorn/LowContrastMode) |
|
||||||
|
| **YTUHD** | PoomSmart | 1.4.0 | [✔︎](https://github.com/PoomSmart/YTUHD) |
|
||||||
|
| **YouPiP** | PoomSmart | 1.7.19-2 | [✔︎](https://github.com/PoomSmart/YouPiP) |
|
||||||
|
| **YouMute** | PoomSmart | 1.1.1-1 | [✔︎](https://github.com/PoomSmart/YouMute) |
|
||||||
|
| **YTABConfig** | PoomSmart | 1.5.0-1 | [✔︎](https://github.com/PoomSmart/YTABConfig) |
|
||||||
|
| **IAmYouTube** | PoomSmart | 1.2.0 | [✔︎](https://github.com/PoomSmart/IAmYouTube) |
|
||||||
|
| **YTReExplore** | PoomSmart | 1.0.2 | [✔︎](https://github.com/PoomSmart/YTReExplore) |
|
||||||
|
| **NoYTPremium** | PoomSmart | 1.0.4 | [✔︎](https://github.com/PoomSmart/NoYTPremium) |
|
||||||
|
| **YTNoPaidPromo** | PoomSmart | 1.0.0 | [✔︎](https://github.com/PoomSmart/YTNoPaidPromo) |
|
||||||
|
| **YTAutoFullScreen** | PoomSmart | 1.0.3 | [✔︎](https://github.com/PoomSmart/YTAutoFullScreen) |
|
||||||
|
| **YTShortsProgress** | PoomSmart | 1.0.2 | [✔︎](https://github.com/PoomSmart/YTShortsProgress) |
|
||||||
|
| **Return YouTube Dislike** | PoomSmart | 1.11.3 | [✔︎](https://github.com/PoomSmart/Return-YouTube-Dislikes) |
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
# Support the developers
|
||||||
|
- [**MiRO92**](https://twitter.com/miro92): https://github.com/MiRO92/uYou-for-YouTube#support
|
||||||
|
- [**level3tjg**](https://twitter.com/level3tjg): https://ko-fi.com/level3tjg
|
||||||
|
- [**BandarHL**](https://twitter.com/bandarhl): https://www.paypal.com/paypalme/BandarHL
|
||||||
|
- [**julioverne**](https://twitter.com/ijulioverne): https://www.patreon.com/julioverne
|
||||||
|
- [**Galactic-dev**](https://twitter.com/dev_galactic):
|
||||||
|
- Paypal: https://www.paypal.com/paypalme/DBrett684
|
||||||
|
- Venmo: https://venmo.com/u/DavidBrett
|
||||||
|
|
||||||
|
# Building(s) (optional)
|
||||||
|
See [CercubePlusExtra/Building - Wiki](https://github.com/Balackburn/CercubePlusExtra/wiki/Building)
|
||||||
|
or Another Version [uYouPlus/Building - Wiki](https://github.com/qnblackcat/uYouPlus/wiki/Building)
|
42
Source/Download.xm.bak
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
// Code has been disabled due to some compiling errors.
|
||||||
|
|
||||||
|
#import "../Header.h"
|
||||||
|
|
||||||
|
%ctor {
|
||||||
|
void $YTPlayerView_downloadVideo_register();
|
||||||
|
void $YTPlayerView_layoutSubviews$_register();
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef YTPLAYERVIEW_DOWNLOADVIDEO_REGISTER
|
||||||
|
#ifndef YTPLAYERVIEW_LAYOUTSUBVIEWS_REGISTER
|
||||||
|
#define YTPLAYERVIEW_DOWNLOADVIDEO_REGISTER
|
||||||
|
#define YTPLAYERVIEW_LAYOUTSUBVIEWS_REGISTER
|
||||||
|
|
||||||
|
void $YTPlayerView_downloadVideo_register();
|
||||||
|
void $YTPlayerView_layoutSubviews$_register();
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// YouTube Video Downloading
|
||||||
|
CHDeclareClass(YTPlayerView);
|
||||||
|
|
||||||
|
CHOptimizedMethod1(self, void, YTPlayerView, layoutSubviews, BOOL, arg1)
|
||||||
|
{
|
||||||
|
CHSuper1(YTPlayerView, layoutSubviews, arg1);
|
||||||
|
CGRect downloadButtonFrame = CGRectMake(0, 0, 100, 50);
|
||||||
|
UIButton *downloadButton = [[UIButton alloc] initWithFrame:downloadButtonFrame];
|
||||||
|
[downloadButton setTitle:@"Download" forState:UIControlStateNormal];
|
||||||
|
[downloadButton addTarget:self action:@selector(downloadVideo) forControlEvents:UIControlEventTouchUpInside];
|
||||||
|
[self addSubview:downloadButton];
|
||||||
|
}
|
||||||
|
|
||||||
|
CHOptimizedMethod0(self, void, YTPlayerView, downloadVideo)
|
||||||
|
{
|
||||||
|
NSString *videoUrlString = @"[Insert YouTube video URL here]";
|
||||||
|
NSURL *videoUrl = [NSURL URLWithString:videoUrlString];
|
||||||
|
NSData *videoData = [NSData dataWithContentsOfURL:videoUrl];
|
||||||
|
|
||||||
|
// Save the video data to a file
|
||||||
|
NSString *filePath = @"[Insert file path here]";
|
||||||
|
[videoData writeToFile:filePath atomically:YES];
|
||||||
|
}
|
1160
Source/LowContrastMode.xm
Normal file
746
Source/Settings.xm
Normal file
@@ -0,0 +1,746 @@
|
|||||||
|
#import "../Tweaks/YouTubeHeader/YTSettingsViewController.h"
|
||||||
|
#import "../Tweaks/YouTubeHeader/YTSearchableSettingsViewController.h"
|
||||||
|
#import "../Tweaks/YouTubeHeader/YTSettingsSectionItem.h"
|
||||||
|
#import "../Tweaks/YouTubeHeader/YTSettingsSectionItemManager.h"
|
||||||
|
#import "../Tweaks/YouTubeHeader/YTUIUtils.h"
|
||||||
|
#import "../Tweaks/YouTubeHeader/YTSettingsPickerViewController.h"
|
||||||
|
#import "../Header.h"
|
||||||
|
|
||||||
|
static BOOL IsEnabled(NSString *key) {
|
||||||
|
return [[NSUserDefaults standardUserDefaults] boolForKey:key];
|
||||||
|
}
|
||||||
|
static int GetSelection(NSString *key) {
|
||||||
|
return [[NSUserDefaults standardUserDefaults] integerForKey:key];
|
||||||
|
}
|
||||||
|
static int colorContrastMode() {
|
||||||
|
return [[NSUserDefaults standardUserDefaults] integerForKey:@"lcmColor"];
|
||||||
|
}
|
||||||
|
static const NSInteger YTLitePlusSection = 500;
|
||||||
|
|
||||||
|
@interface YTSettingsSectionItemManager (YTLitePlus)
|
||||||
|
- (void)updateYTLitePlusSectionWithEntry:(id)entry;
|
||||||
|
@end
|
||||||
|
|
||||||
|
extern NSBundle *YTLitePlusBundle();
|
||||||
|
|
||||||
|
// Settings
|
||||||
|
%hook YTAppSettingsPresentationData
|
||||||
|
+ (NSArray *)settingsCategoryOrder {
|
||||||
|
NSArray *order = %orig;
|
||||||
|
NSMutableArray *mutableOrder = [order mutableCopy];
|
||||||
|
NSUInteger insertIndex = [order indexOfObject:@(1)];
|
||||||
|
if (insertIndex != NSNotFound)
|
||||||
|
[mutableOrder insertObject:@(YTLitePlusSection) atIndex:insertIndex + 1];
|
||||||
|
return mutableOrder;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTSettingsSectionController
|
||||||
|
|
||||||
|
- (void)setSelectedItem:(NSUInteger)selectedItem {
|
||||||
|
if (selectedItem != NSNotFound) %orig;
|
||||||
|
}
|
||||||
|
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTSettingsSectionItemManager
|
||||||
|
%new(v@:@)
|
||||||
|
- (void)updateYTLitePlusSectionWithEntry:(id)entry {
|
||||||
|
NSMutableArray *sectionItems = [NSMutableArray array];
|
||||||
|
NSBundle *tweakBundle = YTLitePlusBundle();
|
||||||
|
Class YTSettingsSectionItemClass = %c(YTSettingsSectionItem);
|
||||||
|
YTSettingsViewController *settingsViewController = [self valueForKey:@"_settingsViewControllerDelegate"];
|
||||||
|
|
||||||
|
YTSettingsSectionItem *main = [%c(YTSettingsSectionItem)
|
||||||
|
itemWithTitle:[NSString stringWithFormat:LOC(@"VERSION"), @(OS_STRINGIFY(TWEAK_VERSION))]
|
||||||
|
titleDescription:LOC(@"VERSION_CHECK")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
detailTextBlock:nil
|
||||||
|
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
|
return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/Balackburn/YTLitePlusExtra/releases/latest"]];
|
||||||
|
}];
|
||||||
|
[sectionItems addObject:main];
|
||||||
|
|
||||||
|
# pragma mark - VideoPlayer
|
||||||
|
YTSettingsSectionItem *videoPlayerGroup = [YTSettingsSectionItemClass itemWithTitle:LOC(@"VIDEO_PLAYER_OPTIONS") accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
|
NSArray <YTSettingsSectionItem *> *rows = @[
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"AUTO_FULLSCREEN")
|
||||||
|
titleDescription:LOC(@"AUTO_FULLSCREEN_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"autoFull_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"autoFull_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"TAP_TO_SKIP")
|
||||||
|
titleDescription:LOC(@"TAP_TO_SKIP_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"tapToSkip_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"tapToSkip_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"SNAP_TO_CHAPTER")
|
||||||
|
titleDescription:LOC(@"SNAP_TO_CHAPTER_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"snapToChapter_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"snapToChapter_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"PINCH_TO_ZOOM")
|
||||||
|
titleDescription:LOC(@"PINCH_TO_ZOOM_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"pinchToZoom_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"pinchToZoom_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"YT_MINIPLAYER")
|
||||||
|
titleDescription:LOC(@"YT_MINIPLAYER_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"ytMiniPlayer_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"ytMiniPlayer_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"STOCK_VOLUME_HUD")
|
||||||
|
titleDescription:LOC(@"STOCK_VOLUME_HUD_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"stockVolumeHUD_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"stockVolumeHUD_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0]
|
||||||
|
];
|
||||||
|
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"VIDEO_PLAYER_OPTIONS") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]];
|
||||||
|
[settingsViewController pushViewController:picker];
|
||||||
|
return YES;
|
||||||
|
}];
|
||||||
|
[sectionItems addObject:videoPlayerGroup];
|
||||||
|
|
||||||
|
# pragma mark - Video Controls Overlay Options
|
||||||
|
YTSettingsSectionItem *videoControlOverlayGroup = [YTSettingsSectionItemClass itemWithTitle:LOC(@"VIDEO_CONTROLS_OVERLAY_OPTIONS") accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
|
NSArray <YTSettingsSectionItem *> *rows = @[
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"ENABLE_SHARE_BUTTON")
|
||||||
|
titleDescription:LOC(@"ENABLE_SHARE_BUTTON_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"enableShareButton_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"enableShareButton_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"ENABLE_SAVE_TO_PLAYLIST_BUTTON")
|
||||||
|
titleDescription:LOC(@"ENABLE_SAVE_TO_PLAYLIST_BUTTON_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"enableSaveToButton_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"enableSaveToButton_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_AUTOPLAY_SWITCH")
|
||||||
|
titleDescription:LOC(@"HIDE_AUTOPLAY_SWITCH_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"hideAutoplaySwitch_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideAutoplaySwitch_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_SUBTITLES_BUTTON")
|
||||||
|
titleDescription:LOC(@"HIDE_SUBTITLES_BUTTON_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"hideCC_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideCC_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_HUD_MESSAGES")
|
||||||
|
titleDescription:LOC(@"HIDE_HUD_MESSAGES_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"hideHUD_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideHUD_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_PAID_PROMOTION_CARDS")
|
||||||
|
titleDescription:LOC(@"HIDE_PAID_PROMOTION_CARDS_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"hidePaidPromotionCard_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hidePaidPromotionCard_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_CHANNEL_WATERMARK")
|
||||||
|
titleDescription:LOC(@"HIDE_CHANNEL_WATERMARK_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"hideChannelWatermark_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideChannelWatermark_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_SHADOW_OVERLAY_BUTTONS")
|
||||||
|
titleDescription:LOC(@"HIDE_SHADOW_OVERLAY_BUTTONS_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"hideVideoPlayerShadowOverlayButtons_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideVideoPlayerShadowOverlayButtons_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_PREVIOUS_AND_NEXT_BUTTON")
|
||||||
|
titleDescription:LOC(@"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"hidePreviousAndNextButton_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hidePreviousAndNextButton_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"REPLACE_PREVIOUS_NEXT_BUTTON")
|
||||||
|
titleDescription:LOC(@"REPLACE_PREVIOUS_NEXT_BUTTON_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"replacePreviousAndNextButton_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"replacePreviousAndNextButton_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"RED_PROGRESS_BAR")
|
||||||
|
titleDescription:LOC(@"RED_PROGRESS_BAR_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"redProgressBar_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"redProgressBar_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"DISABLE_VIDEO_PLAYER_ZOOM")
|
||||||
|
titleDescription:LOC(@"DISABLE_VIDEO_PLAYER_ZOOM")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"disableVideoPlayerZoom_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"disableVideoPlayerZoom_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_HOVER_CARD")
|
||||||
|
titleDescription:LOC(@"HIDE_HOVER_CARD_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"hideHoverCards_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideHoverCards_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_RIGHT_PANEL")
|
||||||
|
titleDescription:LOC(@"HIDE_RIGHT_PANEL_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"hideRightPanel_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideRightPanel_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_HEATWAVES")
|
||||||
|
titleDescription:LOC(@"HIDE_HEATWAVES_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"hideHeatwaves_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideHeatwaves_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_DARK_OVERLAY_BACKGROUND")
|
||||||
|
titleDescription:LOC(@"HIDE_DARK_OVERLAY_BACKGROUND_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"hideOverlayDarkBackground_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideOverlayDarkBackground_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0]
|
||||||
|
];
|
||||||
|
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"VIDEO_CONTROLS_OVERLAY_OPTIONS") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]];
|
||||||
|
[settingsViewController pushViewController:picker];
|
||||||
|
return YES;
|
||||||
|
}];
|
||||||
|
[sectionItems addObject:videoControlOverlayGroup];
|
||||||
|
|
||||||
|
# pragma mark - Shorts Controls Overlay Options
|
||||||
|
YTSettingsSectionItem *shortsControlOverlayGroup = [YTSettingsSectionItemClass itemWithTitle:LOC(@"SHORTS_CONTROLS_OVERLAY_OPTIONS") accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
|
NSArray <YTSettingsSectionItem *> *rows = @[
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_SHORTS_VIDEOS")
|
||||||
|
titleDescription:LOC(@"HIDE_SHORTS_VIDEOS_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"hideShorts_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideShorts_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_SHORTS_CHANNEL_AVATAR")
|
||||||
|
titleDescription:LOC(@"HIDE_SHORTS_CHANNEL_AVATAR_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"hideShortsChannelAvatar_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideShortsChannelAvatar_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_SHORTS_LIKE_BUTTON")
|
||||||
|
titleDescription:LOC(@"HIDE_SHORTS_LIKE_BUTTON_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"hideShortsLikeButton_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideShortsLikeButton_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_SHORTS_DISLIKE_BUTTON")
|
||||||
|
titleDescription:LOC(@"HIDE_SHORTS_DISLIKE_BUTTON_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"hideShortsDislikeButton_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideShortsDislikeButton_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_SHORTS_COMMENT_BUTTON")
|
||||||
|
titleDescription:LOC(@"HIDE_SHORTS_COMMENT_BUTTON_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"hideShortsCommentButton_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideShortsCommentButton_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_SHORTS_REMIX_BUTTON")
|
||||||
|
titleDescription:LOC(@"HIDE_SHORTS_REMIX_BUTTON_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"hideShortsRemixButton_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideShortsRemixButton_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_SHORTS_SHARE_BUTTON")
|
||||||
|
titleDescription:LOC(@"HIDE_SHORTS_SHARE_BUTTON_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"hideShortsShareButton_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideShortsShareButton_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_SUPER_THANKS")
|
||||||
|
titleDescription:LOC(@"HIDE_SUPER_THANKS_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"hideBuySuperThanks_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideBuySuperThanks_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_SUBSCRIPTIONS")
|
||||||
|
titleDescription:LOC(@"HIDE_SUBSCRIPTIONS_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"hideSubscriptions_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideSubscriptions_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0]
|
||||||
|
];
|
||||||
|
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"SHORTS_CONTROLS_OVERLAY_OPTIONS") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]];
|
||||||
|
[settingsViewController pushViewController:picker];
|
||||||
|
return YES;
|
||||||
|
}];
|
||||||
|
[sectionItems addObject:shortsControlOverlayGroup];
|
||||||
|
|
||||||
|
# pragma mark - LowContrastMode
|
||||||
|
YTSettingsSectionItem *lowContrastModeSection = [YTSettingsSectionItemClass itemWithTitle:LOC(@"LCM_CHOOSE_COLOR")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
detailTextBlock:^NSString *() {
|
||||||
|
switch (colorContrastMode()) {
|
||||||
|
case 1:
|
||||||
|
return LOC(@"RED_UI");
|
||||||
|
case 2:
|
||||||
|
return LOC(@"BLUE_UI");
|
||||||
|
case 3:
|
||||||
|
return LOC(@"GREEN_UI");
|
||||||
|
case 4:
|
||||||
|
return LOC(@"YELLOW_UI");
|
||||||
|
case 5:
|
||||||
|
return LOC(@"ORANGE_UI");
|
||||||
|
case 6:
|
||||||
|
return LOC(@"PURPLE_UI");
|
||||||
|
case 7:
|
||||||
|
return LOC(@"VIOLET_UI");
|
||||||
|
case 8:
|
||||||
|
return LOC(@"PINK_UI");
|
||||||
|
case 0:
|
||||||
|
default:
|
||||||
|
return LOC(@"DEFAULT_UI");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
|
NSArray <YTSettingsSectionItem *> *rows = @[
|
||||||
|
[YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"DEFAULT_UI") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setInteger:0 forKey:@"lcmColor"];
|
||||||
|
[settingsViewController reloadData];
|
||||||
|
return YES;
|
||||||
|
}],
|
||||||
|
[YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"RED_UI") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setInteger:1 forKey:@"lcmColor"];
|
||||||
|
[settingsViewController reloadData];
|
||||||
|
return YES;
|
||||||
|
}],
|
||||||
|
[YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"BLUE_UI") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setInteger:2 forKey:@"lcmColor"];
|
||||||
|
[settingsViewController reloadData];
|
||||||
|
return YES;
|
||||||
|
}],
|
||||||
|
[YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"GREEN_UI") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setInteger:3 forKey:@"lcmColor"];
|
||||||
|
[settingsViewController reloadData];
|
||||||
|
return YES;
|
||||||
|
}],
|
||||||
|
[YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"YELLOW_UI") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setInteger:4 forKey:@"lcmColor"];
|
||||||
|
[settingsViewController reloadData];
|
||||||
|
return YES;
|
||||||
|
}],
|
||||||
|
[YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"ORANGE_UI") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setInteger:5 forKey:@"lcmColor"];
|
||||||
|
[settingsViewController reloadData];
|
||||||
|
return YES;
|
||||||
|
}],
|
||||||
|
[YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"PURPLE_UI") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setInteger:6 forKey:@"lcmColor"];
|
||||||
|
[settingsViewController reloadData];
|
||||||
|
return YES;
|
||||||
|
}],
|
||||||
|
[YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"VIOLET_UI") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setInteger:7 forKey:@"lcmColor"];
|
||||||
|
[settingsViewController reloadData];
|
||||||
|
return YES;
|
||||||
|
}],
|
||||||
|
[YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"PINK_UI") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setInteger:8 forKey:@"lcmColor"];
|
||||||
|
[settingsViewController reloadData];
|
||||||
|
return YES;
|
||||||
|
}]
|
||||||
|
];
|
||||||
|
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"LCM_CHOOSE_COLOR") pickerSectionTitle:nil rows:rows selectedItemIndex:colorContrastMode() parentResponder:[self parentResponder]];
|
||||||
|
[settingsViewController pushViewController:picker];
|
||||||
|
return YES;
|
||||||
|
}];
|
||||||
|
|
||||||
|
# pragma mark - Theme
|
||||||
|
YTSettingsSectionItem *themeGroup = [YTSettingsSectionItemClass itemWithTitle:LOC(@"THEME_OPTIONS")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
detailTextBlock:^NSString *() {
|
||||||
|
switch (GetSelection(@"appTheme")) {
|
||||||
|
case 1:
|
||||||
|
return LOC(@"OLED_DARK_THEME_2");
|
||||||
|
case 2:
|
||||||
|
return LOC(@"OLD_DARK_THEME");
|
||||||
|
case 0:
|
||||||
|
default:
|
||||||
|
return LOC(@"DEFAULT_THEME");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
|
NSArray <YTSettingsSectionItem *> *rows = @[
|
||||||
|
[YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"DEFAULT_THEME") titleDescription:LOC(@"DEFAULT_THEME_DESC") selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setInteger:0 forKey:@"appTheme"];
|
||||||
|
[settingsViewController reloadData];
|
||||||
|
return YES;
|
||||||
|
}],
|
||||||
|
[YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"OLED_DARK_THEME") titleDescription:LOC(@"OLED_DARK_THEME_DESC") selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setInteger:1 forKey:@"appTheme"];
|
||||||
|
[settingsViewController reloadData];
|
||||||
|
return YES;
|
||||||
|
}],
|
||||||
|
[YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"OLD_DARK_THEME") titleDescription:LOC(@"OLD_DARK_THEME_DESC") selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setInteger:2 forKey:@"appTheme"];
|
||||||
|
[settingsViewController reloadData];
|
||||||
|
return YES;
|
||||||
|
}],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"OLED_KEYBOARD")
|
||||||
|
titleDescription:LOC(@"OLED_KEYBOARD_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"oledKeyBoard_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"oledKeyBoard_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"LOW_CONTRAST_MODE")
|
||||||
|
titleDescription:LOC(@"LOW_CONTRAST_MODE_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"lowContrastMode_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"lowContrastMode_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0], lowContrastModeSection];
|
||||||
|
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"THEME_OPTIONS") pickerSectionTitle:nil rows:rows selectedItemIndex:GetSelection(@"appTheme") parentResponder:[self parentResponder]];
|
||||||
|
[settingsViewController pushViewController:picker];
|
||||||
|
return YES;
|
||||||
|
}];
|
||||||
|
[sectionItems addObject:themeGroup];
|
||||||
|
|
||||||
|
# pragma mark - Miscellaneous
|
||||||
|
YTSettingsSectionItem *miscellaneousGroup = [YTSettingsSectionItemClass itemWithTitle:LOC(@"MISCELLANEOUS") accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
|
NSArray <YTSettingsSectionItem *> *rows = @[
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"ENABLE_YT_STARTUP_ANIMATION")
|
||||||
|
titleDescription:LOC(@"ENABLE_YT_STARTUP_ANIMATION_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"ytStartupAnimation_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"ytStartupAnimation_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_YOUTUBE_LOGO")
|
||||||
|
titleDescription:LOC(@"HIDE_YOUTUBE_LOGO_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"hideYouTubeLogo_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideYouTubeLogo_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_CHIP_BAR")
|
||||||
|
titleDescription:LOC(@"HIDE_CHIP_BAR_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"hideChipBar_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideChipBar_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_MODERN_INTERFACE")
|
||||||
|
titleDescription:LOC(@"HIDE_MODERN_INTERFACE_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"ytNoModernUI_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"ytNoModernUI_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"IPAD_LAYOUT")
|
||||||
|
titleDescription:LOC(@"IPAD_LAYOUT_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"iPadLayout_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"iPadLayout_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"IPHONE_LAYOUT")
|
||||||
|
titleDescription:LOC(@"IPHONE_LAYOUT_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"iPhoneLayout_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"iPhoneLayout_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"CAST_CONFIRM")
|
||||||
|
titleDescription:LOC(@"CAST_CONFIRM_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"castConfirm_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"castConfirm_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"DISABLE_HINTS")
|
||||||
|
titleDescription:LOC(@"DISABLE_HINTS_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"disableHints_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"disableHints_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"NEW_MINIPLAYER_STYLE")
|
||||||
|
titleDescription:LOC(@"NEW_MINIPLAYER_STYLE_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"bigYTMiniPlayer_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"bigYTMiniPlayer_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_CAST_BUTTON")
|
||||||
|
titleDescription:LOC(@"HIDE_CAST_BUTTON_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"hideCastButton_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideCastButton_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_NOTIFICATION_BUTTON")
|
||||||
|
titleDescription:LOC(@"HIDE_NOTIFICATION_BUTTON_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"hideNotificationButton_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideNotificationButton_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_SPONSORBLOCK_BUTTON")
|
||||||
|
titleDescription:LOC(@"HIDE_SPONSORBLOCK_BUTTON_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"hideSponsorBlockButton_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideSponsorBlockButton_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_CERCUBE_BUTTON")
|
||||||
|
titleDescription:LOC(@"")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"hideCercubeButton_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideCercubeButton_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_CERCUBE_PIP_BUTTON")
|
||||||
|
titleDescription:LOC(@"HIDE_CERCUBE_PIP_BUTTON_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"hideCercubePiP_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideCercubePiP_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_CERCUBE_DOWNLOAD_BUTTON")
|
||||||
|
titleDescription:LOC(@"HIDE_CERCUBE_DOWNLOAD_BUTTON_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"hideCercubeDownload_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL disabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"hideCercubeDownload_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"DISABLE_WIFI_RELATED_SETTINGS")
|
||||||
|
titleDescription:LOC(@"DISABLE_WIFI_RELATED_SETTINGS_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"disableWifiRelatedSettings_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"disableWifiRelatedSettings_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"YT_RE_EXPLORE")
|
||||||
|
titleDescription:LOC(@"YT_RE_EXPLORE_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"reExplore_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"reExplore_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"YT_SPEED")
|
||||||
|
titleDescription:LOC(@"YT_SPEED_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"ytSpeed_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"ytSpeed_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0],
|
||||||
|
|
||||||
|
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"ENABLE_FLEX")
|
||||||
|
titleDescription:LOC(@"ENABLE_FLEX_DESC")
|
||||||
|
accessibilityIdentifier:nil
|
||||||
|
switchOn:IsEnabled(@"flex_enabled")
|
||||||
|
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"flex_enabled"];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
settingItemId:0]
|
||||||
|
];
|
||||||
|
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"MISCELLANEOUS") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]];
|
||||||
|
[settingsViewController pushViewController:picker];
|
||||||
|
return YES;
|
||||||
|
}];
|
||||||
|
[sectionItems addObject:miscellaneousGroup];
|
||||||
|
|
||||||
|
[settingsViewController setSectionItems:sectionItems forCategory:YTLitePlusSection title:@"YTLitePlus" titleDescription:LOC(@"TITLE DESCRIPTION") headerHidden:YES];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)updateSectionForCategory:(NSUInteger)category withEntry:(id)entry {
|
||||||
|
if (category == YTLitePlusSection) {
|
||||||
|
[self updateYTLitePlusSectionWithEntry:entry];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
%orig;
|
||||||
|
}
|
||||||
|
%end
|
466
Source/Themes.xm
Normal file
@@ -0,0 +1,466 @@
|
|||||||
|
#import "../Header.h"
|
||||||
|
|
||||||
|
static BOOL IsEnabled(NSString *key) {
|
||||||
|
return [[NSUserDefaults standardUserDefaults] boolForKey:key];
|
||||||
|
}
|
||||||
|
static BOOL isDarkMode() {
|
||||||
|
return ([[NSUserDefaults standardUserDefaults] integerForKey:@"page_style"] == 1);
|
||||||
|
}
|
||||||
|
static BOOL oledDarkTheme() {
|
||||||
|
return ([[NSUserDefaults standardUserDefaults] integerForKey:@"appTheme"] == 1);
|
||||||
|
}
|
||||||
|
static BOOL oldDarkTheme() {
|
||||||
|
return ([[NSUserDefaults standardUserDefaults] integerForKey:@"appTheme"] == 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Themes.xm - Theme Options
|
||||||
|
// Old dark theme (gray)
|
||||||
|
%group gOldDarkTheme
|
||||||
|
%hook YTAsyncCollectionView
|
||||||
|
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
|
||||||
|
return pageStyle == 1 ? [UIColor colorWithRed:0.129 green:0.129 blue:0.129 alpha:1.0] : %orig;
|
||||||
|
}
|
||||||
|
- (UIColor *)darkBackgroundColor {
|
||||||
|
return [UIColor colorWithRed:0.129 green:0.129 blue:0.129 alpha:1.0];
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTAppView
|
||||||
|
- (void)setBackgroundColor:(UIColor *)color {
|
||||||
|
%orig([UIColor colorWithRed:0.129 green:0.129 blue:0.129 alpha:1.0]);
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTPivotBarView
|
||||||
|
- (void)setBackgroundColor:(UIColor *)color {
|
||||||
|
%orig([UIColor colorWithRed:0.129 green:0.129 blue:0.129 alpha:1.0]);
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTAsyncCollectionView
|
||||||
|
- (void)setBackgroundColor:(UIColor *)color {
|
||||||
|
%orig([UIColor colorWithRed:0.129 green:0.129 blue:0.129 alpha:1.0]);
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTAppViewController
|
||||||
|
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
|
||||||
|
return pageStyle == 1 ? [UIColor colorWithRed:0.129 green:0.129 blue:0.129 alpha:1.0] : %orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTNavigationBar
|
||||||
|
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
|
||||||
|
return pageStyle == 1 ? [UIColor colorWithRed:0.129 green:0.129 blue:0.129 alpha:1.0] : %orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTInnerTubeCollectionViewController
|
||||||
|
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
|
||||||
|
return pageStyle == 1 ? [UIColor colorWithRed:0.129 green:0.129 blue:0.129 alpha:1.0] : %orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTColdConfig
|
||||||
|
- (BOOL)uiSystemsClientGlobalConfigUseDarkerPaletteBgColorForNative { return NO; }
|
||||||
|
- (BOOL)uiSystemsClientGlobalConfigUseDarkerPaletteTextColorForNative { return NO; }
|
||||||
|
- (BOOL)enableCinematicContainerOnClient { return NO; }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook _ASDisplayView
|
||||||
|
- (void)didMoveToWindow {
|
||||||
|
%orig;
|
||||||
|
if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.comment_composer"]) { self.backgroundColor = [UIColor clearColor]; }
|
||||||
|
if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.video_list_entry"]) { self.backgroundColor = [UIColor clearColor]; }
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook ASCollectionView
|
||||||
|
- (void)didMoveToWindow {
|
||||||
|
%orig;
|
||||||
|
self.superview.backgroundColor = [UIColor colorWithRed:0.129 green:0.129 blue:0.129 alpha:1.0];
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTFullscreenEngagementOverlayView
|
||||||
|
- (void)didMoveToWindow {
|
||||||
|
%orig;
|
||||||
|
self.subviews[0].backgroundColor = [UIColor clearColor];
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTRelatedVideosView
|
||||||
|
- (void)didMoveToWindow {
|
||||||
|
%orig;
|
||||||
|
self.subviews[0].backgroundColor = [UIColor clearColor];
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
%end
|
||||||
|
|
||||||
|
// OLED dark mode by BandarHL
|
||||||
|
UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha:1.0];
|
||||||
|
%group gOLED
|
||||||
|
%hook YTCommonColorPalette
|
||||||
|
- (UIColor *)brandBackgroundSolid {
|
||||||
|
return self.pageStyle == 1 ? [UIColor blackColor] : %orig;
|
||||||
|
}
|
||||||
|
- (UIColor *)brandBackgroundPrimary {
|
||||||
|
return self.pageStyle == 1 ? [UIColor blackColor] : %orig;
|
||||||
|
}
|
||||||
|
- (UIColor *)brandBackgroundSecondary {
|
||||||
|
return self.pageStyle == 1 ? [[UIColor blackColor] colorWithAlphaComponent:0.9] : %orig;
|
||||||
|
}
|
||||||
|
- (UIColor *)raisedBackground {
|
||||||
|
return self.pageStyle == 1 ? [UIColor blackColor] : %orig;
|
||||||
|
}
|
||||||
|
- (UIColor *)staticBrandBlack {
|
||||||
|
return self.pageStyle == 1 ? [UIColor blackColor] : %orig;
|
||||||
|
}
|
||||||
|
- (UIColor *)generalBackgroundA {
|
||||||
|
return self.pageStyle == 1 ? [UIColor blackColor] : %orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTAppView
|
||||||
|
- (void)setBackgroundColor:(UIColor *)color {
|
||||||
|
%orig([UIColor blackColor]);
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTPivotBarView
|
||||||
|
- (void)setBackgroundColor:(UIColor *)color {
|
||||||
|
%orig([UIColor blackColor]);
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTAsyncCollectionView
|
||||||
|
- (void)setBackgroundColor:(UIColor *)color {
|
||||||
|
%orig([UIColor blackColor]);
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTAppViewController
|
||||||
|
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
|
||||||
|
return pageStyle == 1 ? [UIColor blackColor] : %orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTNavigationBar
|
||||||
|
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
|
||||||
|
return pageStyle == 1 ? [UIColor blackColor] : %orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
BOOL areColorsEqual(UIColor *color1, UIColor *color2, CGFloat tolerance) {
|
||||||
|
CGFloat r1, g1, b1, a1, r2, g2, b2, a2;
|
||||||
|
[color1 getRed:&r1 green:&g1 blue:&b1 alpha:&a1];
|
||||||
|
[color2 getRed:&r2 green:&g2 blue:&b2 alpha:&a2];
|
||||||
|
|
||||||
|
return (fabs(r1 - r2) <= tolerance) &&
|
||||||
|
(fabs(g1 - g2) <= tolerance) &&
|
||||||
|
(fabs(b1 - b2) <= tolerance) &&
|
||||||
|
(fabs(a1 - a2) <= tolerance);
|
||||||
|
}
|
||||||
|
|
||||||
|
%hook UIView
|
||||||
|
- (void)setBackgroundColor:(UIColor *)color {
|
||||||
|
UIColor *targetColor = [UIColor colorWithRed:0.0588235 green:0.0588235 blue:0.0588235 alpha:1];
|
||||||
|
CGFloat tolerance = 0.01; // Adjust this value as needed
|
||||||
|
|
||||||
|
if (areColorsEqual(color, targetColor, tolerance)) {
|
||||||
|
color = [UIColor blackColor];
|
||||||
|
}
|
||||||
|
%orig(color);
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTCollectionViewController
|
||||||
|
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
|
||||||
|
return pageStyle == 1 ? [UIColor blackColor] : %orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTChannelMobileHeaderViewController
|
||||||
|
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
|
||||||
|
return pageStyle == 1 ? [UIColor blackColor] : %orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTELMView
|
||||||
|
- (UIColor *)backgroundColor {
|
||||||
|
return [UIColor blackColor];
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTHeaderViewController
|
||||||
|
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
|
||||||
|
return pageStyle == 1 ? [UIColor blackColor] : %orig;
|
||||||
|
}
|
||||||
|
- (UIColor *)barTintColor:(NSInteger)pageStyle {
|
||||||
|
return pageStyle == 1 ? [UIColor blackColor] : %orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTInnerTubeCollectionViewController
|
||||||
|
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
|
||||||
|
return pageStyle == 1 ? [UIColor blackColor] : %orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTSettingsCell
|
||||||
|
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
|
||||||
|
return pageStyle == 1 ? [UIColor blackColor] : %orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTSearchViewController
|
||||||
|
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
|
||||||
|
return pageStyle == 1 ? [UIColor blackColor] : %orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTSectionListViewController
|
||||||
|
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
|
||||||
|
return pageStyle == 1 ? [UIColor blackColor] : %orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTWatchMiniBarViewController
|
||||||
|
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
|
||||||
|
return pageStyle == 1 ? [UIColor blackColor] : %orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTWrapperSplitViewController
|
||||||
|
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
|
||||||
|
return pageStyle == 1 ? [UIColor blackColor] : %orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
// Explore
|
||||||
|
%hook ASScrollView
|
||||||
|
- (void)didMoveToWindow {
|
||||||
|
%orig;
|
||||||
|
if (isDarkMode()) {
|
||||||
|
self.backgroundColor = [UIColor clearColor];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
// Your videos
|
||||||
|
%hook ASCollectionView
|
||||||
|
- (void)didMoveToWindow {
|
||||||
|
%orig;
|
||||||
|
if (isDarkMode() && [self.nextResponder isKindOfClass:%c(_ASDisplayView)]) {
|
||||||
|
self.superview.backgroundColor = [UIColor blackColor];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
// Sub?
|
||||||
|
%hook ELMView
|
||||||
|
- (void)didMoveToWindow {
|
||||||
|
%orig;
|
||||||
|
if (isDarkMode()) {
|
||||||
|
self.subviews[0].backgroundColor = [UIColor blackColor];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
// iSponsorBlock
|
||||||
|
%hook SponsorBlockSettingsController
|
||||||
|
- (void)viewDidLoad {
|
||||||
|
if (self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) {
|
||||||
|
%orig;
|
||||||
|
self.tableView.backgroundColor = [UIColor blackColor];
|
||||||
|
} else { return %orig; }
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook SponsorBlockViewController
|
||||||
|
- (void)viewDidLoad {
|
||||||
|
if (self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) {
|
||||||
|
%orig;
|
||||||
|
self.view.backgroundColor = [UIColor blackColor];
|
||||||
|
} else { return %orig; }
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
// Search View
|
||||||
|
%hook YTSearchBarView
|
||||||
|
- (void)setBackgroundColor:(UIColor *)color {
|
||||||
|
return isDarkMode() ? %orig([UIColor blackColor]) : %orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
// History Search view
|
||||||
|
%hook YTSearchBoxView
|
||||||
|
- (void)setBackgroundColor:(UIColor *)color {
|
||||||
|
return isDarkMode() ? %orig([UIColor blackColor]) : %orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
// Comment view
|
||||||
|
%hook YTCommentView
|
||||||
|
- (void)setBackgroundColor:(UIColor *)color {
|
||||||
|
return isDarkMode() ? %orig([UIColor blackColor]) : %orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTCreateCommentAccessoryView
|
||||||
|
- (void)setBackgroundColor:(UIColor *)color {
|
||||||
|
return isDarkMode() ? %orig([UIColor blackColor]) : %orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTCreateCommentTextView
|
||||||
|
- (void)setBackgroundColor:(UIColor *)color {
|
||||||
|
return isDarkMode() ? %orig([UIColor blackColor]) : %orig;
|
||||||
|
}
|
||||||
|
- (void)setTextColor:(UIColor *)color { // fix black text in #Shorts video's comment
|
||||||
|
return isDarkMode() ? %orig([UIColor whiteColor]) : %orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTCommentDetailHeaderCell
|
||||||
|
- (void)didMoveToWindow {
|
||||||
|
%orig;
|
||||||
|
if (isDarkMode()) {
|
||||||
|
self.subviews[2].backgroundColor = [UIColor blackColor];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTFormattedStringLabel // YT is werid...
|
||||||
|
- (void)setBackgroundColor:(UIColor *)color {
|
||||||
|
return isDarkMode() ? %orig([UIColor clearColor]) : %orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
// Live chat comment
|
||||||
|
%hook YCHLiveChatActionPanelView
|
||||||
|
- (void)setBackgroundColor:(UIColor *)color {
|
||||||
|
return isDarkMode() ? %orig([UIColor blackColor]) : %orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTEmojiTextView
|
||||||
|
- (void)setBackgroundColor:(UIColor *)color {
|
||||||
|
return isDarkMode() ? %orig([UIColor blackColor]) : %orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YCHLiveChatView
|
||||||
|
- (void)didMoveToWindow {
|
||||||
|
%orig;
|
||||||
|
if (isDarkMode()) {
|
||||||
|
self.subviews[1].backgroundColor = [UIColor blackColor];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
//
|
||||||
|
%hook YTBackstageCreateRepostDetailView
|
||||||
|
- (void)setBackgroundColor:(UIColor *)color {
|
||||||
|
return isDarkMode() ? %orig([UIColor blackColor]) : %orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
// Others
|
||||||
|
%hook _ASDisplayView
|
||||||
|
- (void)didMoveToWindow {
|
||||||
|
%orig;
|
||||||
|
if (isDarkMode()) {
|
||||||
|
if ([self.nextResponder isKindOfClass:%c(ASScrollView)]) { self.backgroundColor = [UIColor clearColor]; }
|
||||||
|
if ([self.accessibilityIdentifier isEqualToString:@"eml.cvr"]) { self.backgroundColor = [UIColor blackColor]; }
|
||||||
|
if ([self.accessibilityIdentifier isEqualToString:@"rich_header"]) { self.backgroundColor = [UIColor blackColor]; }
|
||||||
|
if ([self.accessibilityIdentifier isEqualToString:@"id.ui.comment_cell"]) { self.backgroundColor = [UIColor blackColor]; }
|
||||||
|
if ([self.accessibilityIdentifier isEqualToString:@"id.ui.cancel.button"]) { self.superview.backgroundColor = [UIColor clearColor]; }
|
||||||
|
if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.comment_composer"]) { self.backgroundColor = [UIColor blackColor]; }
|
||||||
|
if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.video_list_entry"]) { self.backgroundColor = [UIColor blackColor]; }
|
||||||
|
if ([self.accessibilityIdentifier isEqualToString:@"id.comment.guidelines_text"]) { self.superview.backgroundColor = [UIColor blackColor]; }
|
||||||
|
if ([self.accessibilityIdentifier isEqualToString:@"id.comment.channel_guidelines_bottom_sheet_container"]) { self.backgroundColor = [UIColor blackColor]; }
|
||||||
|
if ([self.accessibilityIdentifier isEqualToString:@"id.comment.channel_guidelines_entry_banner_container"]) { self.backgroundColor = [UIColor blackColor]; }
|
||||||
|
if ([self.accessibilityIdentifier isEqualToString:@"id.comment.comment_group_detail_container"]) { self.backgroundColor = [UIColor clearColor]; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
// Open link with...
|
||||||
|
%hook ASWAppSwitchingSheetHeaderView
|
||||||
|
- (void)setBackgroundColor:(UIColor *)color {
|
||||||
|
return isDarkMode() ? %orig(raisedColor) : %orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook ASWAppSwitchingSheetFooterView
|
||||||
|
- (void)setBackgroundColor:(UIColor *)color {
|
||||||
|
return isDarkMode() ? %orig(raisedColor) : %orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook ASWAppSwitcherCollectionViewCell
|
||||||
|
- (void)didMoveToWindow {
|
||||||
|
%orig;
|
||||||
|
if (isDarkMode()) {
|
||||||
|
self.backgroundColor = raisedColor;
|
||||||
|
self.subviews[1].backgroundColor = raisedColor;
|
||||||
|
self.superview.backgroundColor = raisedColor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
// Incompatibility with the new YT Dark theme
|
||||||
|
%hook YTColdConfig
|
||||||
|
- (BOOL)uiSystemsClientGlobalConfigUseDarkerPaletteBgColorForNative { return NO; }
|
||||||
|
%end
|
||||||
|
%end
|
||||||
|
|
||||||
|
// OLED keyboard by @ichitaso <3 - http://gist.github.com/ichitaso/935100fd53a26f18a9060f7195a1be0e
|
||||||
|
%group gOLEDKB
|
||||||
|
%hook UIPredictionViewController
|
||||||
|
- (void)loadView {
|
||||||
|
%orig;
|
||||||
|
[self.view setBackgroundColor:[UIColor blackColor]];
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook UICandidateViewController
|
||||||
|
- (void)loadView {
|
||||||
|
%orig;
|
||||||
|
[self.view setBackgroundColor:[UIColor blackColor]];
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook UIKeyboardDockView
|
||||||
|
- (void)didMoveToWindow {
|
||||||
|
%orig;
|
||||||
|
self.backgroundColor = [UIColor blackColor];
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook UIKeyboardLayoutStar
|
||||||
|
- (void)didMoveToWindow {
|
||||||
|
%orig;
|
||||||
|
self.backgroundColor = [UIColor blackColor];
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook UIKBRenderConfig // Prediction text color
|
||||||
|
- (void)setLightKeyboard:(BOOL)arg1 { %orig(NO); }
|
||||||
|
%end
|
||||||
|
%end
|
||||||
|
|
||||||
|
# pragma mark - ctor
|
||||||
|
%ctor {
|
||||||
|
%init;
|
||||||
|
if (IsEnabled(@"oledKeyBoard_enabled")) {
|
||||||
|
%init(gOLEDKB);
|
||||||
|
}
|
||||||
|
if (oledDarkTheme()) {
|
||||||
|
%init(gOLED);
|
||||||
|
}
|
||||||
|
if (oldDarkTheme()) {
|
||||||
|
%init(gOldDarkTheme);
|
||||||
|
}
|
||||||
|
}
|
16
Tweaks/Alderis/.gitignore
vendored
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# Crap
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
# Xcode
|
||||||
|
*.pbxuser
|
||||||
|
!default.pbxuser
|
||||||
|
xcuserdata
|
||||||
|
*.xccheckout
|
||||||
|
*.xcuserstate
|
||||||
|
|
||||||
|
# Carthage
|
||||||
|
Carthage/
|
||||||
|
|
||||||
|
# Theos
|
||||||
|
.theos
|
||||||
|
packages/
|
36
Tweaks/Alderis/.jazzy.yaml
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
clean: true
|
||||||
|
author: HASHBANG Productions
|
||||||
|
author_url: https://hbang.github.io/
|
||||||
|
github_url: https://github.com/hbang/Alderis
|
||||||
|
root_url: https://hbang.github.io/Alderis/
|
||||||
|
dash_url: https://hbang.github.io/Alderis/docsets/Alderis.xml
|
||||||
|
documentation: info/*.md
|
||||||
|
hide_documentation_coverage: true
|
||||||
|
|
||||||
|
custom_categories:
|
||||||
|
- name: "Guides"
|
||||||
|
children:
|
||||||
|
- "Preference Bundles"
|
||||||
|
- "Migrating to 1.1"
|
||||||
|
|
||||||
|
- name: "Color Picker"
|
||||||
|
children:
|
||||||
|
- ColorPickerViewController
|
||||||
|
- ColorPickerConfiguration
|
||||||
|
- ColorPickerDelegate
|
||||||
|
- ColorPickerTab
|
||||||
|
|
||||||
|
- name: "UI Components"
|
||||||
|
children:
|
||||||
|
- ColorWell
|
||||||
|
|
||||||
|
- name: "Extensions"
|
||||||
|
children:
|
||||||
|
- UIColor
|
||||||
|
- ColorPropertyListValue
|
||||||
|
- String
|
||||||
|
- Array
|
||||||
|
|
||||||
|
- name: "Deprecated"
|
||||||
|
children:
|
||||||
|
- ColorPickerCircleView
|
61
Tweaks/Alderis/.swiftlint.yml
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
disabled_rules:
|
||||||
|
- trailing_comma
|
||||||
|
- nesting
|
||||||
|
- fallthrough
|
||||||
|
- shorthand_operator
|
||||||
|
- todo
|
||||||
|
- large_tuple
|
||||||
|
- identifier_name
|
||||||
|
- type_name
|
||||||
|
- type_body_length
|
||||||
|
# TODO: Why is vertical_parameter_alignment giving false positives?
|
||||||
|
- vertical_parameter_alignment
|
||||||
|
- vertical_parameter_alignment_on_call
|
||||||
|
# TODO: Enable when removing support for older Swift versions (<5.6)
|
||||||
|
- unavailable_condition
|
||||||
|
opt_in_rules:
|
||||||
|
- closure_end_indentation
|
||||||
|
- closure_spacing
|
||||||
|
- contains_over_first_not_nil
|
||||||
|
- empty_count
|
||||||
|
- explicit_init
|
||||||
|
- fatal_error_message
|
||||||
|
- first_where
|
||||||
|
- joined_default_parameter
|
||||||
|
- literal_expression_end_indentation
|
||||||
|
- overridden_super_call
|
||||||
|
- prohibited_super_call
|
||||||
|
- sorted_first_last
|
||||||
|
- unneeded_parentheses_in_closure_argument
|
||||||
|
- vertical_parameter_alignment_on_call
|
||||||
|
- yoda_condition
|
||||||
|
- nslocalizedstring_key
|
||||||
|
- unused_setter_value
|
||||||
|
custom_rules:
|
||||||
|
comment_whitespace:
|
||||||
|
name: "Comment Whitespace"
|
||||||
|
regex: //\S
|
||||||
|
match_kinds: comment
|
||||||
|
message: "Comments must begin with a whitespace character"
|
||||||
|
spaces_not_tabs:
|
||||||
|
name: "Tabs not Spaces"
|
||||||
|
regex: ^( )
|
||||||
|
message: "Use tabs instead of spaces"
|
||||||
|
point_zero:
|
||||||
|
name: "Point Zero"
|
||||||
|
regex: '(?<!iOS\s)(?<!macOS\s)(?<!\.)\b[\d_]+\.0\b'
|
||||||
|
match_kinds:
|
||||||
|
- number
|
||||||
|
- attribute.builtin
|
||||||
|
message: "Don't add a .0 to the end of floating point literals"
|
||||||
|
color_init:
|
||||||
|
name: "Color Initializer"
|
||||||
|
regex: 'UIColor\(red: (.+), green: \1, blue: \1, alpha: .+\)'
|
||||||
|
message: "Use UIColor(white:alpha:)"
|
||||||
|
force_try: warning
|
||||||
|
force_cast: warning
|
||||||
|
function_body_length: 200
|
||||||
|
line_length: 200
|
||||||
|
file_length: 450
|
||||||
|
cyclomatic_complexity: 12
|
||||||
|
function_parameter_count: 7
|
30
Tweaks/Alderis/Alderis.podspec
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
Pod::Spec.new do |spec|
|
||||||
|
spec.name = "Alderis"
|
||||||
|
spec.version = "1.2.0"
|
||||||
|
spec.summary = "A fresh new color picker, with a gentle, fun, and dead simple user interface."
|
||||||
|
spec.description = <<-DESC
|
||||||
|
Alderis is a fresh new color picker, with a gentle, fun, and dead simple user
|
||||||
|
interface. It aims to incorporate the usual elements of a color picker, in a way
|
||||||
|
that users will find easy and fun to use.
|
||||||
|
|
||||||
|
The user can start by selecting a color they like on the initial color palette
|
||||||
|
tab, and either accept it, or refine it using the color wheel and adjustment
|
||||||
|
sliders found on the two other tabs.
|
||||||
|
DESC
|
||||||
|
spec.homepage = "https://github.com/hbang/Alderis"
|
||||||
|
spec.screenshots = "https://github.com/hbang/Alderis/raw/main/screenshots/alderis-1.jpg",
|
||||||
|
"https://github.com/hbang/Alderis/raw/main/screenshots/alderis-2.jpg",
|
||||||
|
"https://github.com/hbang/Alderis/raw/main/screenshots/alderis-3.jpg",
|
||||||
|
"https://github.com/hbang/Alderis/raw/main/screenshots/alderis-4.jpg"
|
||||||
|
spec.license = "Apache License, Version 2.0"
|
||||||
|
spec.author = "HASHBANG Productions"
|
||||||
|
spec.social_media_url = "https://twitter.com/hashbang"
|
||||||
|
|
||||||
|
spec.swift_versions = "5.0"
|
||||||
|
spec.platform = :ios, "12.0"
|
||||||
|
|
||||||
|
spec.source = { :git => "https://github.com/hbang/Alderis.git", :tag => "#{spec.version}" }
|
||||||
|
spec.requires_arc = true
|
||||||
|
spec.source_files = [ "Alderis/*.swift", "Alderis/*.h" ]
|
||||||
|
spec.resource_bundles = { "Alderis" => "Alderis/Assets-ios12.xcassets" }
|
||||||
|
end
|
482
Tweaks/Alderis/Alderis.xcodeproj/project.pbxproj
Normal file
@@ -0,0 +1,482 @@
|
|||||||
|
// !$*UTF8*$!
|
||||||
|
{
|
||||||
|
archiveVersion = 1;
|
||||||
|
classes = {
|
||||||
|
};
|
||||||
|
objectVersion = 52;
|
||||||
|
objects = {
|
||||||
|
|
||||||
|
/* Begin PBXBuildFile section */
|
||||||
|
4E1C741328266C5900227EC3 /* UIFontDescriptorAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E1C741228266C5900227EC3 /* UIFontDescriptorAdditions.swift */; };
|
||||||
|
4E1C74172826C1F100227EC3 /* ColorPickerAccessibilityViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E1C74162826C1F100227EC3 /* ColorPickerAccessibilityViewController.swift */; };
|
||||||
|
4E1C741928276D5600227EC3 /* TextViewLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E1C741828276D5600227EC3 /* TextViewLabel.swift */; };
|
||||||
|
4E1C741B2827829E00227EC3 /* AccessibilityComplianceLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E1C741A2827829E00227EC3 /* AccessibilityComplianceLabel.swift */; };
|
||||||
|
4E1C741D2827882600227EC3 /* AccessibilityContrastSelector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E1C741C2827882600227EC3 /* AccessibilityContrastSelector.swift */; };
|
||||||
|
4E1C741F2827B3C800227EC3 /* UIFloat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E1C741E2827B3C800227EC3 /* UIFloat.swift */; };
|
||||||
|
4E1C74212827B8F800227EC3 /* NSBeep.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E1C74202827B8F800227EC3 /* NSBeep.swift */; };
|
||||||
|
4E2E6C06282BD5990089E4FB /* GradientView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E2E6C05282BD5990089E4FB /* GradientView.swift */; };
|
||||||
|
569C25522427F57000022C60 /* ColorPickerTabViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 569C25512427F57000022C60 /* ColorPickerTabViewController.swift */; };
|
||||||
|
569C25582428346900022C60 /* ColorPickerMapSlider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 569C25572428346900022C60 /* ColorPickerMapSlider.swift */; };
|
||||||
|
56C74667242F722A003ED00A /* ColorPickerSlider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56C74666242F722A003ED00A /* ColorPickerSlider.swift */; };
|
||||||
|
56C74669242F75E3003ED00A /* ColorPickerNumericSlider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56C74668242F75E3003ED00A /* ColorPickerNumericSlider.swift */; };
|
||||||
|
94A2368C252B5951002B5D0B /* UIColorAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94A2368B252B5951002B5D0B /* UIColorAdditions.swift */; };
|
||||||
|
CF73D33A241F9C23000B1B10 /* Alderis.h in Headers */ = {isa = PBXBuildFile; fileRef = CF73D338241F9C23000B1B10 /* Alderis.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||||
|
CF73D344241F9C31000B1B10 /* ColorWell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF73D32D241E49EE000B1B10 /* ColorWell.swift */; };
|
||||||
|
CF73D345241F9C31000B1B10 /* ColorPickerMapViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFE70280241CBDE700083903 /* ColorPickerMapViewController.swift */; };
|
||||||
|
CF73D346241F9C31000B1B10 /* ColorPickerSlidersViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFE70282241CC88D00083903 /* ColorPickerSlidersViewController.swift */; };
|
||||||
|
CF73D347241F9C31000B1B10 /* ColorPickerWheelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFE70288241D0E7300083903 /* ColorPickerWheelView.swift */; };
|
||||||
|
CF73D348241F9C31000B1B10 /* ColorPickerInnerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFE7027B241A62ED00083903 /* ColorPickerInnerViewController.swift */; };
|
||||||
|
CF73D34A241F9C31000B1B10 /* ColorPickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFE70273241A4C5500083903 /* ColorPickerViewController.swift */; };
|
||||||
|
CF73D34B241F9C31000B1B10 /* ColorPickerSwatchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFE7027E241B984600083903 /* ColorPickerSwatchViewController.swift */; };
|
||||||
|
CF73D34C241F9C4D000B1B10 /* Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF73D32B241E4720000B1B10 /* Color.swift */; };
|
||||||
|
CF73D351241F9FB3000B1B10 /* ColorPickerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF73D350241F9FB3000B1B10 /* ColorPickerDelegate.swift */; };
|
||||||
|
CF7750B72520D3B50069CC57 /* Assets.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF7750B62520D3B50069CC57 /* Assets.swift */; };
|
||||||
|
CF7750BE252203630069CC57 /* DialogButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF7750BD252203630069CC57 /* DialogButton.swift */; };
|
||||||
|
CF7750CF252433680069CC57 /* ColorPickerConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF7750CE252433680069CC57 /* ColorPickerConfiguration.swift */; };
|
||||||
|
CF7750D62524615D0069CC57 /* SeparatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF7750D52524615D0069CC57 /* SeparatorView.swift */; };
|
||||||
|
CF775122252852460069CC57 /* AlderisSDKCompatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = CF775121252852110069CC57 /* AlderisSDKCompatibility.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||||
|
CF79DA31251723C500F17BCB /* BottomSheetTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF79DA30251723C500F17BCB /* BottomSheetTransition.swift */; };
|
||||||
|
CFAFFC9124277CEE005AD4C1 /* Assets-ios12.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = CFAFFC9024277CEE005AD4C1 /* Assets-ios12.xcassets */; platformFilter = ios; };
|
||||||
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
|
/* Begin PBXFileReference section */
|
||||||
|
4E1C741228266C5900227EC3 /* UIFontDescriptorAdditions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIFontDescriptorAdditions.swift; sourceTree = "<group>"; };
|
||||||
|
4E1C74162826C1F100227EC3 /* ColorPickerAccessibilityViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerAccessibilityViewController.swift; sourceTree = "<group>"; };
|
||||||
|
4E1C741828276D5600227EC3 /* TextViewLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextViewLabel.swift; sourceTree = "<group>"; };
|
||||||
|
4E1C741A2827829E00227EC3 /* AccessibilityComplianceLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessibilityComplianceLabel.swift; sourceTree = "<group>"; };
|
||||||
|
4E1C741C2827882600227EC3 /* AccessibilityContrastSelector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessibilityContrastSelector.swift; sourceTree = "<group>"; };
|
||||||
|
4E1C741E2827B3C800227EC3 /* UIFloat.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIFloat.swift; sourceTree = "<group>"; };
|
||||||
|
4E1C74202827B8F800227EC3 /* NSBeep.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSBeep.swift; sourceTree = "<group>"; };
|
||||||
|
4E2E6C05282BD5990089E4FB /* GradientView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GradientView.swift; sourceTree = "<group>"; };
|
||||||
|
569C25512427F57000022C60 /* ColorPickerTabViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerTabViewController.swift; sourceTree = "<group>"; };
|
||||||
|
569C25572428346900022C60 /* ColorPickerMapSlider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerMapSlider.swift; sourceTree = "<group>"; };
|
||||||
|
56C74666242F722A003ED00A /* ColorPickerSlider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerSlider.swift; sourceTree = "<group>"; };
|
||||||
|
56C74668242F75E3003ED00A /* ColorPickerNumericSlider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerNumericSlider.swift; sourceTree = "<group>"; };
|
||||||
|
94A2368B252B5951002B5D0B /* UIColorAdditions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIColorAdditions.swift; sourceTree = "<group>"; };
|
||||||
|
CF73D32B241E4720000B1B10 /* Color.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Color.swift; sourceTree = "<group>"; };
|
||||||
|
CF73D32D241E49EE000B1B10 /* ColorWell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorWell.swift; sourceTree = "<group>"; };
|
||||||
|
CF73D336241F9C23000B1B10 /* Alderis.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alderis.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
CF73D338241F9C23000B1B10 /* Alderis.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Alderis.h; sourceTree = "<group>"; };
|
||||||
|
CF73D339241F9C23000B1B10 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||||
|
CF73D350241F9FB3000B1B10 /* ColorPickerDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerDelegate.swift; sourceTree = "<group>"; };
|
||||||
|
CF7750B62520D3B50069CC57 /* Assets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Assets.swift; sourceTree = "<group>"; };
|
||||||
|
CF7750BD252203630069CC57 /* DialogButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DialogButton.swift; sourceTree = "<group>"; };
|
||||||
|
CF7750CE252433680069CC57 /* ColorPickerConfiguration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ColorPickerConfiguration.swift; sourceTree = "<group>"; };
|
||||||
|
CF7750D52524615D0069CC57 /* SeparatorView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SeparatorView.swift; sourceTree = "<group>"; };
|
||||||
|
CF775121252852110069CC57 /* AlderisSDKCompatibility.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AlderisSDKCompatibility.h; sourceTree = "<group>"; };
|
||||||
|
CF79DA30251723C500F17BCB /* BottomSheetTransition.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomSheetTransition.swift; sourceTree = "<group>"; };
|
||||||
|
CFAFFC9024277CEE005AD4C1 /* Assets-ios12.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Assets-ios12.xcassets"; sourceTree = "<group>"; };
|
||||||
|
CFE70273241A4C5500083903 /* ColorPickerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerViewController.swift; sourceTree = "<group>"; };
|
||||||
|
CFE7027B241A62ED00083903 /* ColorPickerInnerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerInnerViewController.swift; sourceTree = "<group>"; };
|
||||||
|
CFE7027E241B984600083903 /* ColorPickerSwatchViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerSwatchViewController.swift; sourceTree = "<group>"; };
|
||||||
|
CFE70280241CBDE700083903 /* ColorPickerMapViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerMapViewController.swift; sourceTree = "<group>"; };
|
||||||
|
CFE70282241CC88D00083903 /* ColorPickerSlidersViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerSlidersViewController.swift; sourceTree = "<group>"; };
|
||||||
|
CFE70288241D0E7300083903 /* ColorPickerWheelView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerWheelView.swift; sourceTree = "<group>"; };
|
||||||
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
|
CF73D333241F9C23000B1B10 /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXFrameworksBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXGroup section */
|
||||||
|
CF39D435222BC07C001EF57F = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
CF73D337241F9C23000B1B10 /* Alderis */,
|
||||||
|
CF39D43F222BC07C001EF57F /* Products */,
|
||||||
|
);
|
||||||
|
indentWidth = 2;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
tabWidth = 2;
|
||||||
|
usesTabs = 1;
|
||||||
|
};
|
||||||
|
CF39D43F222BC07C001EF57F /* Products */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
CF73D336241F9C23000B1B10 /* Alderis.framework */,
|
||||||
|
);
|
||||||
|
name = Products;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
CF73D337241F9C23000B1B10 /* Alderis */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
CF73D338241F9C23000B1B10 /* Alderis.h */,
|
||||||
|
CF775121252852110069CC57 /* AlderisSDKCompatibility.h */,
|
||||||
|
CF7750B62520D3B50069CC57 /* Assets.swift */,
|
||||||
|
CF79DA30251723C500F17BCB /* BottomSheetTransition.swift */,
|
||||||
|
CF73D32B241E4720000B1B10 /* Color.swift */,
|
||||||
|
CFE70273241A4C5500083903 /* ColorPickerViewController.swift */,
|
||||||
|
CF7750CE252433680069CC57 /* ColorPickerConfiguration.swift */,
|
||||||
|
CF73D350241F9FB3000B1B10 /* ColorPickerDelegate.swift */,
|
||||||
|
CFE7027B241A62ED00083903 /* ColorPickerInnerViewController.swift */,
|
||||||
|
569C25512427F57000022C60 /* ColorPickerTabViewController.swift */,
|
||||||
|
56C74666242F722A003ED00A /* ColorPickerSlider.swift */,
|
||||||
|
CFE7027E241B984600083903 /* ColorPickerSwatchViewController.swift */,
|
||||||
|
569C25572428346900022C60 /* ColorPickerMapSlider.swift */,
|
||||||
|
CFE70280241CBDE700083903 /* ColorPickerMapViewController.swift */,
|
||||||
|
CFE70288241D0E7300083903 /* ColorPickerWheelView.swift */,
|
||||||
|
CFE70282241CC88D00083903 /* ColorPickerSlidersViewController.swift */,
|
||||||
|
56C74668242F75E3003ED00A /* ColorPickerNumericSlider.swift */,
|
||||||
|
4E1C74162826C1F100227EC3 /* ColorPickerAccessibilityViewController.swift */,
|
||||||
|
4E1C741A2827829E00227EC3 /* AccessibilityComplianceLabel.swift */,
|
||||||
|
4E1C741C2827882600227EC3 /* AccessibilityContrastSelector.swift */,
|
||||||
|
CF73D32D241E49EE000B1B10 /* ColorWell.swift */,
|
||||||
|
CF7750BD252203630069CC57 /* DialogButton.swift */,
|
||||||
|
CF7750D52524615D0069CC57 /* SeparatorView.swift */,
|
||||||
|
4E2E6C05282BD5990089E4FB /* GradientView.swift */,
|
||||||
|
94A2368B252B5951002B5D0B /* UIColorAdditions.swift */,
|
||||||
|
4E1C741228266C5900227EC3 /* UIFontDescriptorAdditions.swift */,
|
||||||
|
4E1C741E2827B3C800227EC3 /* UIFloat.swift */,
|
||||||
|
4E1C741828276D5600227EC3 /* TextViewLabel.swift */,
|
||||||
|
4E1C74202827B8F800227EC3 /* NSBeep.swift */,
|
||||||
|
CF73D339241F9C23000B1B10 /* Info.plist */,
|
||||||
|
CFAFFC9024277CEE005AD4C1 /* Assets-ios12.xcassets */,
|
||||||
|
);
|
||||||
|
path = Alderis;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
/* End PBXGroup section */
|
||||||
|
|
||||||
|
/* Begin PBXHeadersBuildPhase section */
|
||||||
|
CF73D331241F9C23000B1B10 /* Headers */ = {
|
||||||
|
isa = PBXHeadersBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
CF73D33A241F9C23000B1B10 /* Alderis.h in Headers */,
|
||||||
|
CF775122252852460069CC57 /* AlderisSDKCompatibility.h in Headers */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXHeadersBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXNativeTarget section */
|
||||||
|
CF73D335241F9C23000B1B10 /* Alderis */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = CF73D340241F9C23000B1B10 /* Build configuration list for PBXNativeTarget "Alderis" */;
|
||||||
|
buildPhases = (
|
||||||
|
CF73D331241F9C23000B1B10 /* Headers */,
|
||||||
|
CF73D332241F9C23000B1B10 /* Sources */,
|
||||||
|
CF73D333241F9C23000B1B10 /* Frameworks */,
|
||||||
|
CF73D334241F9C23000B1B10 /* Resources */,
|
||||||
|
CF77511225281F7E0069CC57 /* SwiftLint */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
);
|
||||||
|
name = Alderis;
|
||||||
|
productName = Alderis;
|
||||||
|
productReference = CF73D336241F9C23000B1B10 /* Alderis.framework */;
|
||||||
|
productType = "com.apple.product-type.framework";
|
||||||
|
};
|
||||||
|
/* End PBXNativeTarget section */
|
||||||
|
|
||||||
|
/* Begin PBXProject section */
|
||||||
|
CF39D436222BC07C001EF57F /* Project object */ = {
|
||||||
|
isa = PBXProject;
|
||||||
|
attributes = {
|
||||||
|
LastUpgradeCheck = 1330;
|
||||||
|
ORGANIZATIONNAME = "HASHBANG Productions";
|
||||||
|
TargetAttributes = {
|
||||||
|
CF73D335241F9C23000B1B10 = {
|
||||||
|
CreatedOnToolsVersion = 11.3.1;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
buildConfigurationList = CF39D439222BC07C001EF57F /* Build configuration list for PBXProject "Alderis" */;
|
||||||
|
compatibilityVersion = "Xcode 9.3";
|
||||||
|
developmentRegion = en;
|
||||||
|
hasScannedForEncodings = 0;
|
||||||
|
knownRegions = (
|
||||||
|
en,
|
||||||
|
Base,
|
||||||
|
);
|
||||||
|
mainGroup = CF39D435222BC07C001EF57F;
|
||||||
|
productRefGroup = CF39D43F222BC07C001EF57F /* Products */;
|
||||||
|
projectDirPath = "";
|
||||||
|
projectRoot = "";
|
||||||
|
targets = (
|
||||||
|
CF73D335241F9C23000B1B10 /* Alderis */,
|
||||||
|
);
|
||||||
|
};
|
||||||
|
/* End PBXProject section */
|
||||||
|
|
||||||
|
/* Begin PBXResourcesBuildPhase section */
|
||||||
|
CF73D334241F9C23000B1B10 /* Resources */ = {
|
||||||
|
isa = PBXResourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
CFAFFC9124277CEE005AD4C1 /* Assets-ios12.xcassets in Resources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXResourcesBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXShellScriptBuildPhase section */
|
||||||
|
CF77511225281F7E0069CC57 /* SwiftLint */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
);
|
||||||
|
name = SwiftLint;
|
||||||
|
outputFileListPaths = (
|
||||||
|
);
|
||||||
|
outputPaths = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "export PATH=$PATH:/opt/homebrew/bin\nif which swiftlint >/dev/null; then\n\tswiftlint\nelse\n\techo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n";
|
||||||
|
};
|
||||||
|
/* End PBXShellScriptBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXSourcesBuildPhase section */
|
||||||
|
CF73D332241F9C23000B1B10 /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
CF73D34B241F9C31000B1B10 /* ColorPickerSwatchViewController.swift in Sources */,
|
||||||
|
CF7750BE252203630069CC57 /* DialogButton.swift in Sources */,
|
||||||
|
4E1C741928276D5600227EC3 /* TextViewLabel.swift in Sources */,
|
||||||
|
CF73D347241F9C31000B1B10 /* ColorPickerWheelView.swift in Sources */,
|
||||||
|
CF7750D62524615D0069CC57 /* SeparatorView.swift in Sources */,
|
||||||
|
CF73D34C241F9C4D000B1B10 /* Color.swift in Sources */,
|
||||||
|
94A2368C252B5951002B5D0B /* UIColorAdditions.swift in Sources */,
|
||||||
|
569C25582428346900022C60 /* ColorPickerMapSlider.swift in Sources */,
|
||||||
|
4E2E6C06282BD5990089E4FB /* GradientView.swift in Sources */,
|
||||||
|
CF73D344241F9C31000B1B10 /* ColorWell.swift in Sources */,
|
||||||
|
CF7750B72520D3B50069CC57 /* Assets.swift in Sources */,
|
||||||
|
CF73D348241F9C31000B1B10 /* ColorPickerInnerViewController.swift in Sources */,
|
||||||
|
56C74667242F722A003ED00A /* ColorPickerSlider.swift in Sources */,
|
||||||
|
4E1C74212827B8F800227EC3 /* NSBeep.swift in Sources */,
|
||||||
|
4E1C74172826C1F100227EC3 /* ColorPickerAccessibilityViewController.swift in Sources */,
|
||||||
|
4E1C741D2827882600227EC3 /* AccessibilityContrastSelector.swift in Sources */,
|
||||||
|
CF73D345241F9C31000B1B10 /* ColorPickerMapViewController.swift in Sources */,
|
||||||
|
CF79DA31251723C500F17BCB /* BottomSheetTransition.swift in Sources */,
|
||||||
|
4E1C741328266C5900227EC3 /* UIFontDescriptorAdditions.swift in Sources */,
|
||||||
|
CF73D34A241F9C31000B1B10 /* ColorPickerViewController.swift in Sources */,
|
||||||
|
CF7750CF252433680069CC57 /* ColorPickerConfiguration.swift in Sources */,
|
||||||
|
56C74669242F75E3003ED00A /* ColorPickerNumericSlider.swift in Sources */,
|
||||||
|
569C25522427F57000022C60 /* ColorPickerTabViewController.swift in Sources */,
|
||||||
|
4E1C741F2827B3C800227EC3 /* UIFloat.swift in Sources */,
|
||||||
|
CF73D351241F9FB3000B1B10 /* ColorPickerDelegate.swift in Sources */,
|
||||||
|
CF73D346241F9C31000B1B10 /* ColorPickerSlidersViewController.swift in Sources */,
|
||||||
|
4E1C741B2827829E00227EC3 /* AccessibilityComplianceLabel.swift in Sources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXSourcesBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin XCBuildConfiguration section */
|
||||||
|
CF39D452222BC07E001EF57F /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
|
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
||||||
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
|
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||||
|
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||||
|
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_COMMA = YES;
|
||||||
|
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||||
|
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||||
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||||
|
CLANG_WARN_EMPTY_BODY = YES;
|
||||||
|
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||||
|
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||||
|
CLANG_WARN_INT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||||
|
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||||
|
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||||
|
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||||
|
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||||
|
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||||
|
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||||
|
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||||
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
|
CODE_SIGN_IDENTITY = "iPhone Developer";
|
||||||
|
COPY_PHASE_STRIP = NO;
|
||||||
|
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||||
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
|
ENABLE_TESTABILITY = YES;
|
||||||
|
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||||
|
GCC_DYNAMIC_NO_PIC = NO;
|
||||||
|
GCC_NO_COMMON_BLOCKS = YES;
|
||||||
|
GCC_OPTIMIZATION_LEVEL = 0;
|
||||||
|
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||||
|
"DEBUG=1",
|
||||||
|
"$(inherited)",
|
||||||
|
);
|
||||||
|
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||||
|
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||||
|
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||||
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||||
|
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||||
|
MTL_FAST_MATH = YES;
|
||||||
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
|
SDKROOT = iphoneos;
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
CF39D453222BC07E001EF57F /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
|
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
||||||
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
|
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||||
|
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||||
|
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_COMMA = YES;
|
||||||
|
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||||
|
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||||
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||||
|
CLANG_WARN_EMPTY_BODY = YES;
|
||||||
|
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||||
|
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||||
|
CLANG_WARN_INT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||||
|
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||||
|
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||||
|
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||||
|
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||||
|
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||||
|
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||||
|
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||||
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
|
CODE_SIGN_IDENTITY = "iPhone Developer";
|
||||||
|
COPY_PHASE_STRIP = NO;
|
||||||
|
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||||
|
ENABLE_NS_ASSERTIONS = NO;
|
||||||
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
|
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||||
|
GCC_NO_COMMON_BLOCKS = YES;
|
||||||
|
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||||
|
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||||
|
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||||
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||||
|
MTL_ENABLE_DEBUG_INFO = NO;
|
||||||
|
MTL_FAST_MATH = YES;
|
||||||
|
SDKROOT = iphoneos;
|
||||||
|
SWIFT_COMPILATION_MODE = wholemodule;
|
||||||
|
VALIDATE_PRODUCT = YES;
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
CF73D341241F9C23000B1B10 /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
APPLICATION_EXTENSION_API_ONLY = YES;
|
||||||
|
BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
|
||||||
|
CURRENT_PROJECT_VERSION = 3;
|
||||||
|
DEFINES_MODULE = YES;
|
||||||
|
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||||
|
DYLIB_CURRENT_VERSION = 1;
|
||||||
|
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||||
|
INFOPLIST_FILE = Alderis/Info.plist;
|
||||||
|
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/Frameworks",
|
||||||
|
"@loader_path/Frameworks",
|
||||||
|
);
|
||||||
|
MARKETING_VERSION = 1.2;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = ws.hbang.Alderis;
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||||
|
SKIP_INSTALL = NO;
|
||||||
|
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
|
||||||
|
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
VERSIONING_SYSTEM = "apple-generic";
|
||||||
|
VERSION_INFO_PREFIX = "";
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
CF73D342241F9C23000B1B10 /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
APPLICATION_EXTENSION_API_ONLY = YES;
|
||||||
|
BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
|
||||||
|
CURRENT_PROJECT_VERSION = 3;
|
||||||
|
DEFINES_MODULE = YES;
|
||||||
|
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||||
|
DYLIB_CURRENT_VERSION = 1;
|
||||||
|
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||||
|
INFOPLIST_FILE = Alderis/Info.plist;
|
||||||
|
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/Frameworks",
|
||||||
|
"@loader_path/Frameworks",
|
||||||
|
);
|
||||||
|
MARKETING_VERSION = 1.2;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = ws.hbang.Alderis;
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||||
|
SKIP_INSTALL = NO;
|
||||||
|
SWIFT_COMPILATION_MODE = wholemodule;
|
||||||
|
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
VERSIONING_SYSTEM = "apple-generic";
|
||||||
|
VERSION_INFO_PREFIX = "";
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
/* End XCBuildConfiguration section */
|
||||||
|
|
||||||
|
/* Begin XCConfigurationList section */
|
||||||
|
CF39D439222BC07C001EF57F /* Build configuration list for PBXProject "Alderis" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
CF39D452222BC07E001EF57F /* Debug */,
|
||||||
|
CF39D453222BC07E001EF57F /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
CF73D340241F9C23000B1B10 /* Build configuration list for PBXNativeTarget "Alderis" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
CF73D341241F9C23000B1B10 /* Debug */,
|
||||||
|
CF73D342241F9C23000B1B10 /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
/* End XCConfigurationList section */
|
||||||
|
};
|
||||||
|
rootObject = CF39D436222BC07C001EF57F /* Project object */;
|
||||||
|
}
|
7
Tweaks/Alderis/Alderis.xcodeproj/project.xcworkspace/contents.xcworkspacedata
generated
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Workspace
|
||||||
|
version = "1.0">
|
||||||
|
<FileRef
|
||||||
|
location = "self:Alderis Demo.xcodeproj">
|
||||||
|
</FileRef>
|
||||||
|
</Workspace>
|
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>IDEDidComputeMac32BitWarning</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
@@ -0,0 +1,67 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Scheme
|
||||||
|
LastUpgradeVersion = "1330"
|
||||||
|
version = "1.3">
|
||||||
|
<BuildAction
|
||||||
|
parallelizeBuildables = "YES"
|
||||||
|
buildImplicitDependencies = "YES">
|
||||||
|
<BuildActionEntries>
|
||||||
|
<BuildActionEntry
|
||||||
|
buildForTesting = "YES"
|
||||||
|
buildForRunning = "YES"
|
||||||
|
buildForProfiling = "YES"
|
||||||
|
buildForArchiving = "YES"
|
||||||
|
buildForAnalyzing = "YES">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "CF73D335241F9C23000B1B10"
|
||||||
|
BuildableName = "Alderis.framework"
|
||||||
|
BlueprintName = "Alderis"
|
||||||
|
ReferencedContainer = "container:Alderis.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildActionEntry>
|
||||||
|
</BuildActionEntries>
|
||||||
|
</BuildAction>
|
||||||
|
<TestAction
|
||||||
|
buildConfiguration = "Debug"
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||||
|
<Testables>
|
||||||
|
</Testables>
|
||||||
|
</TestAction>
|
||||||
|
<LaunchAction
|
||||||
|
buildConfiguration = "Debug"
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
launchStyle = "0"
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
ignoresPersistentStateOnLaunch = "NO"
|
||||||
|
debugDocumentVersioning = "YES"
|
||||||
|
debugServiceExtension = "internal"
|
||||||
|
allowLocationSimulation = "YES">
|
||||||
|
</LaunchAction>
|
||||||
|
<ProfileAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
|
savedToolIdentifier = ""
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
debugDocumentVersioning = "YES">
|
||||||
|
<MacroExpansion>
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "CF73D335241F9C23000B1B10"
|
||||||
|
BuildableName = "Alderis.framework"
|
||||||
|
BlueprintName = "Alderis"
|
||||||
|
ReferencedContainer = "container:Alderis.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</MacroExpansion>
|
||||||
|
</ProfileAction>
|
||||||
|
<AnalyzeAction
|
||||||
|
buildConfiguration = "Debug">
|
||||||
|
</AnalyzeAction>
|
||||||
|
<ArchiveAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
revealArchiveInOrganizer = "YES">
|
||||||
|
</ArchiveAction>
|
||||||
|
</Scheme>
|
77
Tweaks/Alderis/Alderis/AccessibilityComplianceLabel.swift
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
//
|
||||||
|
// AccessibilityComplianceLabel.swift
|
||||||
|
// Alderis
|
||||||
|
//
|
||||||
|
// Created by Adam Demasi on 8/5/2022.
|
||||||
|
// Copyright © 2022 HASHBANG Productions. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import UIKit
|
||||||
|
|
||||||
|
internal class AccessibilityComplianceLabel: UIView {
|
||||||
|
|
||||||
|
var text: String {
|
||||||
|
get { label.text! }
|
||||||
|
set { label.text = newValue }
|
||||||
|
}
|
||||||
|
|
||||||
|
var isCompliant = false {
|
||||||
|
didSet { updateState() }
|
||||||
|
}
|
||||||
|
|
||||||
|
private let tickImage = Assets.systemImage(named: "checkmark.circle.fill")
|
||||||
|
private let crossImage = Assets.systemImage(named: "xmark.circle.fill")
|
||||||
|
|
||||||
|
private var imageView: UIImageView!
|
||||||
|
private var label: UILabel!
|
||||||
|
|
||||||
|
override init(frame: CGRect) {
|
||||||
|
super.init(frame: frame)
|
||||||
|
|
||||||
|
let font = UIFont.systemFont(ofSize: UIFloat(16), weight: .medium)
|
||||||
|
|
||||||
|
imageView = UIImageView()
|
||||||
|
if #available(iOS 13, *) {
|
||||||
|
imageView.preferredSymbolConfiguration = UIImage.SymbolConfiguration(font: font, scale: .small)
|
||||||
|
}
|
||||||
|
|
||||||
|
label = UILabel()
|
||||||
|
label.font = font
|
||||||
|
|
||||||
|
let stackView = UIStackView(arrangedSubviews: [imageView, label])
|
||||||
|
stackView.translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
stackView.alignment = .center
|
||||||
|
stackView.spacing = UIFloat(6)
|
||||||
|
addSubview(stackView)
|
||||||
|
|
||||||
|
NSLayoutConstraint.activate([
|
||||||
|
stackView.topAnchor.constraint(equalTo: self.topAnchor),
|
||||||
|
stackView.bottomAnchor.constraint(equalTo: self.bottomAnchor),
|
||||||
|
stackView.leadingAnchor.constraint(equalTo: self.leadingAnchor),
|
||||||
|
stackView.trailingAnchor.constraint(equalTo: self.trailingAnchor)
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
|
convenience init(text: String) {
|
||||||
|
self.init(frame: .zero)
|
||||||
|
self.text = text
|
||||||
|
}
|
||||||
|
|
||||||
|
required init?(coder: NSCoder) {
|
||||||
|
fatalError("init(coder:) has not been implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
private func updateState() {
|
||||||
|
let color = isCompliant ? Assets.green : Assets.red
|
||||||
|
|
||||||
|
tintColor = color
|
||||||
|
accessibilityLabel = "\(text): \(isCompliant ? "Compliant" : "Not compliant")"
|
||||||
|
imageView.image = isCompliant ? tickImage : crossImage
|
||||||
|
}
|
||||||
|
|
||||||
|
override func tintColorDidChange() {
|
||||||
|
super.tintColorDidChange()
|
||||||
|
label.textColor = tintColor
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
91
Tweaks/Alderis/Alderis/AccessibilityContrastSelector.swift
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
//
|
||||||
|
// AccessibilityContrastSelector.swift
|
||||||
|
// Alderis
|
||||||
|
//
|
||||||
|
// Created by Adam Demasi on 8/5/2022.
|
||||||
|
// Copyright © 2022 HASHBANG Productions. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import UIKit
|
||||||
|
|
||||||
|
internal class AccessibilityContrastSelector: UIView {
|
||||||
|
|
||||||
|
enum Mode: Int, CaseIterable {
|
||||||
|
case color, black, white
|
||||||
|
|
||||||
|
var label: String {
|
||||||
|
switch self {
|
||||||
|
case .color: return "Color"
|
||||||
|
case .black: return "Black"
|
||||||
|
case .white: return "White"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func color(withColor color: Color) -> Color {
|
||||||
|
switch self {
|
||||||
|
case .color: return color
|
||||||
|
case .black: return .black
|
||||||
|
case .white: return .white
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var text: String {
|
||||||
|
get { label.text! }
|
||||||
|
set { label.text = newValue }
|
||||||
|
}
|
||||||
|
|
||||||
|
var value: Mode = .white {
|
||||||
|
didSet {
|
||||||
|
if segmentedControl.selectedSegmentIndex != value.rawValue {
|
||||||
|
segmentedControl.selectedSegmentIndex = value.rawValue
|
||||||
|
handleChange?(value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var handleChange: ((Mode) -> Void)?
|
||||||
|
|
||||||
|
private var label: UILabel!
|
||||||
|
private var segmentedControl: UISegmentedControl!
|
||||||
|
|
||||||
|
override init(frame: CGRect) {
|
||||||
|
super.init(frame: frame)
|
||||||
|
|
||||||
|
label = UILabel()
|
||||||
|
label.font = UIFont.systemFont(ofSize: UIFloat(16), weight: .medium)
|
||||||
|
|
||||||
|
segmentedControl = UISegmentedControl(items: Mode.allCases.map(\.label))
|
||||||
|
segmentedControl.addTarget(self, action: #selector(handleValueChanged), for: .valueChanged)
|
||||||
|
|
||||||
|
let stackView = UIStackView(arrangedSubviews: [label, UIView(), segmentedControl])
|
||||||
|
stackView.translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
stackView.alignment = .center
|
||||||
|
stackView.distribution = .fill
|
||||||
|
stackView.spacing = UIFloat(5)
|
||||||
|
addSubview(stackView)
|
||||||
|
|
||||||
|
NSLayoutConstraint.activate([
|
||||||
|
stackView.topAnchor.constraint(equalTo: self.topAnchor),
|
||||||
|
stackView.bottomAnchor.constraint(equalTo: self.bottomAnchor),
|
||||||
|
stackView.leadingAnchor.constraint(equalTo: self.leadingAnchor),
|
||||||
|
stackView.trailingAnchor.constraint(equalTo: self.trailingAnchor)
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
|
required init?(coder: NSCoder) {
|
||||||
|
fatalError("init(coder:) has not been implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
convenience init(text: String, value: Mode) {
|
||||||
|
self.init(frame: .zero)
|
||||||
|
self.text = text
|
||||||
|
self.value = value
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc private func handleValueChanged() {
|
||||||
|
value = Mode(rawValue: segmentedControl.selectedSegmentIndex)!
|
||||||
|
handleChange?(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
11
Tweaks/Alderis/Alderis/Alderis.h
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
//
|
||||||
|
// Alderis.h
|
||||||
|
// Alderis
|
||||||
|
//
|
||||||
|
// Created by Adam Demasi on 16/3/20.
|
||||||
|
// Copyright © 2020 HASHBANG Productions. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
@import UIKit;
|
||||||
|
|
||||||
|
#import "AlderisSDKCompatibility.h"
|
21
Tweaks/Alderis/Alderis/AlderisSDKCompatibility.h
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
//
|
||||||
|
// AlderisSDKCompatibility.h
|
||||||
|
// Alderis
|
||||||
|
//
|
||||||
|
// Created by Adam Demasi on 3/10/20.
|
||||||
|
// Copyright © 2020 HASHBANG Productions. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
@import UIKit;
|
||||||
|
|
||||||
|
#ifndef __IPHONE_14_0
|
||||||
|
// Allows building with the iOS 13 SDK while retaining iOS 14 compatibility.
|
||||||
|
|
||||||
|
@interface UIControl ()
|
||||||
|
|
||||||
|
- (void)addAction:(UIAction *)action forControlEvents:(UIControlEvents)controlEvents NS_SWIFT_NAME(addAction(_:for:)) API_AVAILABLE(ios(14.0));
|
||||||
|
- (void)removeAction:(UIAction *)action forControlEvents:(UIControlEvents)controlEvents NS_SWIFT_NAME(removeAction(_:for:)) API_AVAILABLE(ios(14.0));
|
||||||
|
- (void)removeActionForIdentifier:(UIActionIdentifier)actionIdentifier forControlEvents:(UIControlEvents)controlEvents NS_SWIFT_NAME(removeAction(identifiedBy:for:)) API_AVAILABLE(ios(14.0));
|
||||||
|
|
||||||
|
@end
|
||||||
|
#endif
|
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"info" : {
|
||||||
|
"version" : 1,
|
||||||
|
"author" : "xcode"
|
||||||
|
}
|
||||||
|
}
|
26
Tweaks/Alderis/Alderis/Assets-ios12.xcassets/Brightness Slider/sun.max.imageset/Contents.json
vendored
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"filename" : "sun.max.png",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"filename" : "sun.max@2x.png",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"filename" : "sun.max@3x.png",
|
||||||
|
"scale" : "3x"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"version" : 1,
|
||||||
|
"author" : "xcode"
|
||||||
|
},
|
||||||
|
"properties" : {
|
||||||
|
"template-rendering-intent" : "template"
|
||||||
|
}
|
||||||
|
}
|
BIN
Tweaks/Alderis/Alderis/Assets-ios12.xcassets/Brightness Slider/sun.max.imageset/sun.max.png
vendored
Normal file
After Width: | Height: | Size: 310 B |
BIN
Tweaks/Alderis/Alderis/Assets-ios12.xcassets/Brightness Slider/sun.max.imageset/sun.max@2x.png
vendored
Normal file
After Width: | Height: | Size: 661 B |
BIN
Tweaks/Alderis/Alderis/Assets-ios12.xcassets/Brightness Slider/sun.max.imageset/sun.max@3x.png
vendored
Normal file
After Width: | Height: | Size: 942 B |
26
Tweaks/Alderis/Alderis/Assets-ios12.xcassets/Brightness Slider/sun.min.imageset/Contents.json
vendored
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"filename" : "sun.min.png",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"filename" : "sun.min@2x.png",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"filename" : "sun.min@3x.png",
|
||||||
|
"scale" : "3x"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"version" : 1,
|
||||||
|
"author" : "xcode"
|
||||||
|
},
|
||||||
|
"properties" : {
|
||||||
|
"template-rendering-intent" : "template"
|
||||||
|
}
|
||||||
|
}
|
BIN
Tweaks/Alderis/Alderis/Assets-ios12.xcassets/Brightness Slider/sun.min.imageset/sun.min.png
vendored
Normal file
After Width: | Height: | Size: 307 B |
BIN
Tweaks/Alderis/Alderis/Assets-ios12.xcassets/Brightness Slider/sun.min.imageset/sun.min@2x.png
vendored
Normal file
After Width: | Height: | Size: 606 B |
BIN
Tweaks/Alderis/Alderis/Assets-ios12.xcassets/Brightness Slider/sun.min.imageset/sun.min@3x.png
vendored
Normal file
After Width: | Height: | Size: 909 B |
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "checkmark.circle.fill.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "checkmark.circle.fill@2x.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "checkmark.circle.fill@3x.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "3x"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
},
|
||||||
|
"properties" : {
|
||||||
|
"template-rendering-intent" : "template"
|
||||||
|
}
|
||||||
|
}
|
After Width: | Height: | Size: 169 B |
After Width: | Height: | Size: 287 B |
After Width: | Height: | Size: 377 B |
26
Tweaks/Alderis/Alderis/Assets-ios12.xcassets/Contrast Checker/sparkles.imageset/Contents.json
vendored
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "sparkles.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "sparkles@2x.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "sparkles@3x.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "3x"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
},
|
||||||
|
"properties" : {
|
||||||
|
"template-rendering-intent" : "template"
|
||||||
|
}
|
||||||
|
}
|
BIN
Tweaks/Alderis/Alderis/Assets-ios12.xcassets/Contrast Checker/sparkles.imageset/sparkles.png
vendored
Normal file
After Width: | Height: | Size: 184 B |
BIN
Tweaks/Alderis/Alderis/Assets-ios12.xcassets/Contrast Checker/sparkles.imageset/sparkles@2x.png
vendored
Normal file
After Width: | Height: | Size: 324 B |
BIN
Tweaks/Alderis/Alderis/Assets-ios12.xcassets/Contrast Checker/sparkles.imageset/sparkles@3x.png
vendored
Normal file
After Width: | Height: | Size: 427 B |
@@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "xmark.circle.fill.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "xmark.circle.fill@2x.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "xmark.circle.fill@3x.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "3x"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
},
|
||||||
|
"properties" : {
|
||||||
|
"template-rendering-intent" : "template"
|
||||||
|
}
|
||||||
|
}
|
After Width: | Height: | Size: 164 B |
After Width: | Height: | Size: 274 B |
After Width: | Height: | Size: 383 B |
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
26
Tweaks/Alderis/Alderis/Assets-ios12.xcassets/Tabs/circle.righthalf.fill.imageset/Contents.json
vendored
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "circle.righthalf.fill.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "circle.righthalf.fill@2x.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "circle.righthalf.fill@3x.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "3x"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
},
|
||||||
|
"properties" : {
|
||||||
|
"template-rendering-intent" : "template"
|
||||||
|
}
|
||||||
|
}
|
After Width: | Height: | Size: 229 B |
After Width: | Height: | Size: 385 B |
After Width: | Height: | Size: 574 B |
26
Tweaks/Alderis/Alderis/Assets-ios12.xcassets/Tabs/slider.horizontal.3.imageset/Contents.json
vendored
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "slider.horizontal.3.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "slider.horizontal.3@2x.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "slider.horizontal.3@3x.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "3x"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
},
|
||||||
|
"properties" : {
|
||||||
|
"template-rendering-intent" : "template"
|
||||||
|
}
|
||||||
|
}
|
After Width: | Height: | Size: 208 B |
After Width: | Height: | Size: 361 B |
After Width: | Height: | Size: 507 B |
@@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "slider.horizontal.below.rectangle.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "slider.horizontal.below.rectangle@2x.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "slider.horizontal.below.rectangle@3x.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "3x"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
},
|
||||||
|
"properties" : {
|
||||||
|
"template-rendering-intent" : "template"
|
||||||
|
}
|
||||||
|
}
|
After Width: | Height: | Size: 189 B |
After Width: | Height: | Size: 309 B |
After Width: | Height: | Size: 412 B |
26
Tweaks/Alderis/Alderis/Assets-ios12.xcassets/Tabs/square.grid.4x3.fill.imageset/Contents.json
vendored
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "square.grid.4x3.fill.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "square.grid.4x3.fill@2x.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "square.grid.4x3.fill@3x.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "3x"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
},
|
||||||
|
"properties" : {
|
||||||
|
"template-rendering-intent" : "template"
|
||||||
|
}
|
||||||
|
}
|
After Width: | Height: | Size: 211 B |
After Width: | Height: | Size: 289 B |
After Width: | Height: | Size: 419 B |
135
Tweaks/Alderis/Alderis/Assets.swift
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
//
|
||||||
|
// Assets.swift
|
||||||
|
// Alderis
|
||||||
|
//
|
||||||
|
// Created by Adam Demasi on 27/9/20.
|
||||||
|
// Copyright © 2020 HASHBANG Productions. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import UIKit
|
||||||
|
|
||||||
|
internal struct Assets {
|
||||||
|
|
||||||
|
internal enum SymbolScale: Int {
|
||||||
|
case `default` = -1
|
||||||
|
case unspecified, small, medium, large
|
||||||
|
|
||||||
|
@available(iOS 13, *)
|
||||||
|
var uiImageSymbolScale: UIImage.SymbolScale { UIImage.SymbolScale(rawValue: rawValue)! }
|
||||||
|
}
|
||||||
|
|
||||||
|
private static let bundle: Bundle = {
|
||||||
|
let myBundle = Bundle(for: ColorPickerViewController.self)
|
||||||
|
if let resourcesURL = myBundle.url(forResource: "Alderis", withExtension: "bundle"),
|
||||||
|
let resourcesBundle = Bundle(url: resourcesURL) {
|
||||||
|
return resourcesBundle
|
||||||
|
}
|
||||||
|
return myBundle
|
||||||
|
}()
|
||||||
|
private static let uikitBundle = Bundle(for: UIView.self)
|
||||||
|
|
||||||
|
// MARK: - Localization
|
||||||
|
|
||||||
|
static func uikitLocalize(_ key: String) -> String {
|
||||||
|
uikitBundle.localizedString(forKey: key, value: nil, table: nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - Images
|
||||||
|
|
||||||
|
static func systemImage(named name: String, font: UIFont? = nil, scale: SymbolScale = .default) -> UIImage? {
|
||||||
|
if #available(iOS 13, *) {
|
||||||
|
var configuration: UIImage.SymbolConfiguration?
|
||||||
|
if let font = font {
|
||||||
|
configuration = UIImage.SymbolConfiguration(font: font, scale: scale.uiImageSymbolScale)
|
||||||
|
}
|
||||||
|
return UIImage(systemName: name, withConfiguration: configuration)
|
||||||
|
}
|
||||||
|
return UIImage(named: name, in: bundle, compatibleWith: nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - Fonts
|
||||||
|
|
||||||
|
static func niceMonospaceDigitFont(ofSize size: CGFloat) -> UIFont {
|
||||||
|
// Take the monospace digit font and enable stylistic alternative 6, which provides a
|
||||||
|
// high-legibility, monospace-looking style of the system font.
|
||||||
|
let font = UIFont.monospacedDigitSystemFont(ofSize: size, weight: .regular)
|
||||||
|
let fontDescriptor = font.fontDescriptor.addingAttributes([
|
||||||
|
.featureSettings: [
|
||||||
|
[
|
||||||
|
.alderisFeature: kStylisticAlternativesType,
|
||||||
|
.alderisSelector: kStylisticAltSixOnSelector
|
||||||
|
]
|
||||||
|
] as [[UIFontDescriptor.FeatureKey: Int]]
|
||||||
|
])
|
||||||
|
return UIFont(descriptor: fontDescriptor, size: 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - Colors
|
||||||
|
|
||||||
|
private static func color(userInterfaceStyles colors: [UIUserInterfaceStyle: UIColor], fallback: UIUserInterfaceStyle = .light) -> UIColor {
|
||||||
|
if #available(iOS 13, *) {
|
||||||
|
return UIColor { colors[$0.userInterfaceStyle] ?? colors[fallback] ?? colors.values.first! }
|
||||||
|
}
|
||||||
|
return colors[fallback] ?? colors.values.first!
|
||||||
|
}
|
||||||
|
|
||||||
|
static let backdropColor = UIColor(white: 0, alpha: 0.2)
|
||||||
|
static let separatorColor = UIColor(white: 1, alpha: 0.15)
|
||||||
|
|
||||||
|
static let labelColor: UIColor = {
|
||||||
|
if #available(iOS 13, *) {
|
||||||
|
return .label
|
||||||
|
}
|
||||||
|
return .black
|
||||||
|
}()
|
||||||
|
|
||||||
|
static let secondaryLabelColor: UIColor = {
|
||||||
|
if #available(iOS 13, *) {
|
||||||
|
return .secondaryLabel
|
||||||
|
}
|
||||||
|
return UIColor(white: 60 / 255, alpha: 0.6)
|
||||||
|
}()
|
||||||
|
|
||||||
|
static let borderColor: UIColor = {
|
||||||
|
if #available(iOS 13, *) {
|
||||||
|
return .separator
|
||||||
|
}
|
||||||
|
return UIColor(white: 1, alpha: 0.35)
|
||||||
|
}()
|
||||||
|
|
||||||
|
@available(iOS 13, *)
|
||||||
|
static let macTabBarSelectionColor = color(userInterfaceStyles: [
|
||||||
|
.light: .black,
|
||||||
|
.dark: .label
|
||||||
|
])
|
||||||
|
|
||||||
|
static let red = UIColor.systemRed
|
||||||
|
|
||||||
|
// .systemGreen adjusted to be more consistent / easier to read
|
||||||
|
static let green = color(userInterfaceStyles: [
|
||||||
|
.light: UIColor(red: 15 / 255, green: 189 / 255, blue: 59 / 255, alpha: 1),
|
||||||
|
// swiftlint:disable:next colon
|
||||||
|
.dark: UIColor(red: 41 / 255, green: 179 / 255, blue: 76 / 255, alpha: 1)
|
||||||
|
])
|
||||||
|
|
||||||
|
static let checkerboardPatternColor = color(userInterfaceStyles: [
|
||||||
|
.light: renderCheckerboardPattern(colors: (UIColor(white: 200 / 255, alpha: 1),
|
||||||
|
UIColor(white: 255 / 255, alpha: 1))),
|
||||||
|
// swiftlint:disable:next colon
|
||||||
|
.dark: renderCheckerboardPattern(colors: (UIColor(white: 140 / 255, alpha: 1),
|
||||||
|
UIColor(white: 186 / 255, alpha: 1)))
|
||||||
|
])
|
||||||
|
|
||||||
|
private static func renderCheckerboardPattern(colors: (dark: UIColor, light: UIColor)) -> UIColor {
|
||||||
|
let size = 11
|
||||||
|
let image = UIGraphicsImageRenderer(size: CGSize(width: size * 2, height: size * 2)).image { context in
|
||||||
|
colors.dark.setFill()
|
||||||
|
context.fill(CGRect(x: 0, y: 0, width: size * 2, height: size * 2))
|
||||||
|
colors.light.setFill()
|
||||||
|
context.fill(CGRect(x: size, y: 0, width: size, height: size))
|
||||||
|
context.fill(CGRect(x: 0, y: size, width: size, height: size))
|
||||||
|
}
|
||||||
|
return UIColor(patternImage: image)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|