1 <?xml version="1.0" encoding="utf-8"?>
2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3 xmlns:tools="http://schemas.android.com/tools"
4 package="org.fdroid.fdroid"
5 android:installLocation="auto"
6 android:versionCode="940"
7 android:versionName="0.94-test"
11 tools:overrideLibrary="org.thoughtcrime.ssl.pinning"
12 android:minSdkVersion="8"
13 android:targetSdkVersion="21"
17 android:anyDensity="true"
18 android:largeScreens="true"
19 android:normalScreens="true"
20 android:resizeable="true"
21 android:smallScreens="true"
22 android:xlargeScreens="true"
26 android:name="android.hardware.telephony"
27 android:required="false" />
29 android:name="android.hardware.wifi"
30 android:required="false" />
32 android:name="android.hardware.touchscreen"
33 android:required="false" />
35 android:name="android.hardware.nfc"
36 android:required="false" />
38 android:name="android.hardware.bluetooth"
39 android:required="false" />
41 <uses-permission android:name="android.permission.INTERNET" />
42 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
43 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
44 <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
45 <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
46 <uses-permission android:name="android.permission.BLUETOOTH" />
47 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
48 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
49 android:maxSdkVersion="18" />
50 <uses-permission android:name="android.permission.NFC" />
52 <!-- These permissions are only granted when F-Droid is installed as a system-app! -->
53 <uses-permission android:name="android.permission.INSTALL_PACKAGES"
54 tools:ignore="ProtectedPermissions"/>
55 <uses-permission android:name="android.permission.DELETE_PACKAGES"
56 tools:ignore="ProtectedPermissions"/>
59 android:debuggable="true"
60 android:name="FDroidApp"
61 android:icon="@drawable/ic_launcher"
62 android:label="@string/app_name"
63 android:description="@string/app_description"
64 android:allowBackup="true"
65 android:theme="@style/AppThemeDark"
66 android:supportsRtl="true"
70 android:authorities="org.fdroid.fdroid.data.AppProvider"
71 android:name="org.fdroid.fdroid.data.AppProvider"
72 android:exported="false"/>
75 android:authorities="org.fdroid.fdroid.data.RepoProvider"
76 android:name="org.fdroid.fdroid.data.RepoProvider"
77 android:exported="false"/>
80 android:authorities="org.fdroid.fdroid.data.ApkProvider"
81 android:name="org.fdroid.fdroid.data.ApkProvider"
82 android:exported="false"/>
85 android:authorities="org.fdroid.fdroid.data.InstalledAppProvider"
86 android:name="org.fdroid.fdroid.data.InstalledAppProvider"
87 android:exported="false"/>
90 android:name=".FDroid"
91 android:launchMode="singleTop"
92 android:configChanges="keyboardHidden|orientation|screenSize" >
96 <action android:name="android.intent.action.MAIN" />
98 <category android:name="android.intent.category.LAUNCHER" />
102 <action android:name="android.intent.action.VIEW" />
104 <category android:name="android.intent.category.DEFAULT" />
105 <category android:name="android.intent.category.BROWSABLE" />
107 <data android:scheme="fdroid.app" />
111 <action android:name="android.intent.action.VIEW" />
113 <category android:name="android.intent.category.DEFAULT" />
114 <category android:name="android.intent.category.BROWSABLE" />
116 <data android:scheme="http" />
117 <data android:scheme="https" />
118 <data android:host="f-droid.org" />
119 <data android:host="www.f-droid.org" />
120 <data android:pathPrefix="/app/" />
124 <action android:name="android.intent.action.VIEW" />
126 <category android:name="android.intent.category.DEFAULT" />
127 <category android:name="android.intent.category.BROWSABLE" />
129 <data android:scheme="http" />
130 <data android:scheme="https" />
131 <data android:host="f-droid.org" />
132 <data android:host="www.f-droid.org" />
133 <data android:pathPrefix="/repository/browse" />
137 <action android:name="android.intent.action.VIEW" />
139 <category android:name="android.intent.category.DEFAULT" />
140 <category android:name="android.intent.category.BROWSABLE" />
142 <data android:scheme="market" android:host="details" />
146 <action android:name="android.intent.action.VIEW" />
148 <category android:name="android.intent.category.DEFAULT" />
149 <category android:name="android.intent.category.BROWSABLE" />
151 <data android:scheme="http" />
152 <data android:scheme="https" />
153 <data android:host="play.google.com" /> <!-- they don't do www. -->
154 <data android:path="/store/apps/details" />
158 <action android:name="android.intent.action.VIEW" />
160 <category android:name="android.intent.category.DEFAULT" />
161 <category android:name="android.intent.category.BROWSABLE" />
163 <data android:scheme="amzn" android:host="apps" android:path="/android" />
167 <action android:name="android.intent.action.VIEW" />
169 <category android:name="android.intent.category.DEFAULT" />
170 <category android:name="android.intent.category.BROWSABLE" />
172 <data android:scheme="http" />
173 <data android:scheme="https" />
174 <data android:host="amazon.com" />
175 <data android:host="www.amazon.com" />
176 <data android:path="/gp/mas/dl/android" />
182 <action android:name="android.intent.action.VIEW" />
184 <category android:name="android.intent.category.DEFAULT" />
185 <category android:name="android.intent.category.BROWSABLE" />
187 <data android:scheme="fdroid.search" />
191 <action android:name="android.intent.action.VIEW" />
193 <category android:name="android.intent.category.DEFAULT" />
194 <category android:name="android.intent.category.BROWSABLE" />
196 <data android:scheme="market" android:host="search" />
200 <action android:name="android.intent.action.VIEW" />
202 <category android:name="android.intent.category.DEFAULT" />
203 <category android:name="android.intent.category.BROWSABLE" />
205 <data android:scheme="http" />
206 <data android:scheme="https" />
207 <data android:host="play.google.com" /> <!-- they don't do www. -->
208 <data android:path="/store/search" />
211 <!-- Handle NFC tags detected from outside our application -->
213 <action android:name="android.nfc.action.NDEF_DISCOVERED" />
215 <category android:name="android.intent.category.DEFAULT" />
218 URIs that come in via NFC have scheme/host normalized to all lower case
219 https://developer.android.com/reference/android/nfc/NfcAdapter.html#ACTION_NDEF_DISCOVERED
221 <data android:scheme="fdroidrepo" />
222 <data android:scheme="fdroidrepos" />
228 This intent serves two purposes: Swapping apps between devices and adding a
229 repo from a website (e.g. https://guardianproject.info/fdroid/repo).
230 We intercept both of these situations in the FDroid activity, and then redirect
231 to the appropriate handler (swap handling, manage repos respectively) from there.
233 The reason for this is that the only differentiating factor is the presence
234 of a "swap=1" in the query string, and intent-filter is unable to deal with
235 query parameters. An alternative would be to do something like fdroidswap:// as
236 a scheme, but then we. Need to copy/paste all of this intent-filter stuff and
237 keep it up to date when it changes or a bug is found.
240 <action android:name="android.intent.action.VIEW" />
242 <category android:name="android.intent.category.BROWSABLE" />
243 <category android:name="android.intent.category.DEFAULT" />
246 Android's scheme matcher is case-sensitive, so include
247 ALL CAPS versions to support ALL CAPS URLs in QR Codes.
248 QR Codes have a special ALL CAPS mode that uses a reduced
249 character set, making for more compact QR Codes.
251 <data android:scheme="http" />
252 <data android:scheme="HTTP" />
253 <data android:scheme="https" />
254 <data android:scheme="HTTPS" />
255 <data android:scheme="fdroidrepo" />
256 <data android:scheme="FDROIDREPO" />
257 <data android:scheme="fdroidrepos" />
258 <data android:scheme="FDROIDREPOS" />
260 <data android:host="*" />
263 The pattern matcher here is poorly implemented, in particular the * is
264 non-greedy, so you have to do stupid tricks to match patterns that have
265 repeat characters in them. http://stackoverflow.com/a/8599921/306864
267 <data android:path="/fdroid/repo" />
268 <data android:pathPattern="/fdroid/repo/*" />
269 <data android:pathPattern="/.*/fdroid/repo" />
270 <data android:pathPattern="/.*/fdroid/repo/*" />
271 <data android:pathPattern="/.*/.*/fdroid/repo" />
272 <data android:pathPattern="/.*/.*/fdroid/repo/*" />
273 <data android:pathPattern="/.*/.*/.*/fdroid/repo" />
274 <data android:pathPattern="/.*/.*/.*/fdroid/repo/*" />
275 <data android:path="/fdroid/archive" />
276 <data android:pathPattern="/fdroid/archive/*" />
277 <data android:pathPattern="/.*/fdroid/archive" />
278 <data android:pathPattern="/.*/fdroid/archive/*" />
279 <data android:pathPattern="/.*/.*/fdroid/archive" />
280 <data android:pathPattern="/.*/.*/fdroid/archive/*" />
281 <data android:pathPattern="/.*/.*/.*/fdroid/archive" />
282 <data android:pathPattern="/.*/.*/.*/fdroid/archive/*" />
284 Some QR Code scanners don't respect custom schemes like fdroidrepo://,
285 so this is a workaround, since the local repo URL is all uppercase in
286 the QR Code for sending the local repo to another device.
288 <data android:path="/FDROID/REPO" />
289 <data android:pathPattern="/.*/FDROID/REPO" />
290 <data android:pathPattern="/.*/.*/FDROID/REPO" />
291 <data android:pathPattern="/.*/.*/.*/FDROID/REPO" />
295 android:name="android.app.default_searchable"
296 android:value=".SearchResults" />
299 android:name=".views.swap.ConnectSwapActivity"
300 android:theme="@style/SwapTheme.Wizard.ReceiveSwap"
302 android:noHistory="true"
303 android:parentActivityName=".FDroid"
304 android:screenOrientation="portrait"
305 android:configChanges="orientation|keyboardHidden">
307 android:name="android.support.PARENT_ACTIVITY"
308 android:value=".FDroid" />
311 android:name=".installer.InstallConfirmActivity"
312 android:label="@string/menu_install"
313 android:parentActivityName=".FDroid">
315 android:name="android.support.PARENT_ACTIVITY"
316 android:value=".FDroid" />
319 android:name=".views.ManageReposActivity"
320 android:label="@string/app_name"
321 android:launchMode="singleTask"
322 android:parentActivityName=".FDroid" >
324 android:name="android.support.PARENT_ACTIVITY"
325 android:value=".FDroid" />
327 <action android:name="android.intent.action.VIEW" />
329 <category android:name="android.intent.category.DEFAULT" />
331 <data android:mimeType="application/vnd.org.fdroid.fdroid.repo" />
335 android:name=".NfcNotEnabledActivity"
336 android:noHistory="true" />
337 <!--<activity android:name=".views.QrWizardDownloadActivity" />
338 <activity android:name=".views.QrWizardWifiNetworkActivity" />
340 android:name=".views.LocalRepoActivity"
341 android:configChanges="orientation|keyboardHidden|screenSize"
342 android:label="@string/local_repo"
343 android:launchMode="singleTop"
344 android:parentActivityName=".FDroid"
345 android:screenOrientation="portrait" >
347 android:name="android.support.PARENT_ACTIVITY"
348 android:value=".FDroid" />
351 android:name=".views.SelectLocalAppsActivity"
352 android:label="@string/setup_repo"
353 android:parentActivityName=".views.LocalRepoActivity" >
355 android:name="android.support.PARENT_ACTIVITY"
356 android:value=".views.LocalRepoActivity" />
359 android:name=".views.RepoDetailsActivity"
360 android:label="@string/menu_manage"
361 android:parentActivityName=".views.ManageReposActivity"
362 android:windowSoftInputMode="stateHidden">
364 android:name="android.support.PARENT_ACTIVITY"
365 android:value=".views.ManageReposActivity" />
369 android:name=".AppDetails"
370 android:label="@string/app_details"
371 android:exported="true"
372 android:parentActivityName=".FDroid" >
374 android:name="android.support.PARENT_ACTIVITY"
375 android:value=".FDroid" />
379 android:name=".views.swap.SwapAppListActivity$SwapAppDetails"
380 android:label="@string/app_details"
381 android:parentActivityName=".views.swap.SwapAppListActivity" >
383 android:name="android.support.PARENT_ACTIVITY"
384 android:value=".views.swap.SwapAppListActivity" />
387 android:label="@string/menu_preferences"
388 android:name=".PreferencesActivity"
389 android:parentActivityName=".FDroid" >
391 android:name="android.support.PARENT_ACTIVITY"
392 android:value=".FDroid" />
395 android:label="@string/menu_swap"
396 android:name=".views.swap.SwapActivity"
397 android:parentActivityName=".FDroid"
398 android:theme="@style/SwapTheme.Wizard"
399 android:screenOrientation="portrait"
400 android:configChanges="orientation|keyboardHidden">
402 android:name="android.support.PARENT_ACTIVITY"
403 android:value=".FDroid" />
406 android:label="@string/swap"
407 android:name=".views.swap.SwapAppListActivity"
408 android:parentActivityName=".FDroid"
409 android:theme="@style/SwapTheme.AppList"
410 android:screenOrientation="portrait"
411 android:configChanges="orientation|keyboardHidden">
413 android:name="android.support.PARENT_ACTIVITY"
414 android:value=".FDroid" />
416 <!-- Note: Theme.NoDisplay, this activity shows dialogs only -->
418 android:name=".installer.InstallIntoSystemDialogActivity"
419 android:theme="@android:style/Theme.NoDisplay" />
421 android:name=".installer.InstallIntoSystemBootReceiver" >
423 <action android:name="android.intent.action.BOOT_COMPLETED" />
427 android:name=".SearchResults"
428 android:label="@string/search_results"
429 android:exported="true"
430 android:launchMode="singleTop"
431 android:parentActivityName=".FDroid" >
433 android:name="android.support.PARENT_ACTIVITY"
434 android:value=".FDroid" />
437 <action android:name="android.intent.action.SEARCH" />
441 android:name="android.app.searchable"
442 android:resource="@xml/searchable" />
445 <receiver android:name=".receiver.StartupReceiver" >
447 <action android:name="android.intent.action.BOOT_COMPLETED" />
449 <category android:name="android.intent.category.HOME" />
452 <receiver android:name=".receiver.PackageAddedReceiver" >
454 <action android:name="android.intent.action.PACKAGE_ADDED" />
456 <data android:scheme="package" />
459 <receiver android:name=".receiver.PackageUpgradedReceiver" >
461 <action android:name="android.intent.action.PACKAGE_REPLACED" />
463 <data android:scheme="package" />
466 <receiver android:name=".receiver.PackageRemovedReceiver" >
468 <action android:name="android.intent.action.PACKAGE_REMOVED" />
470 <data android:scheme="package" />
473 <receiver android:name=".receiver.WifiStateChangeReceiver" >
475 <action android:name="android.net.wifi.STATE_CHANGE" />
479 <service android:name=".UpdateService" />
480 <service android:name=".net.WifiStateChangeService" />
481 <service android:name=".localrepo.LocalRepoService" />