Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
M
Magisk
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
Magisk
Commits
f0f87c8e
Commit
f0f87c8e
authored
Dec 02, 2018
by
topjohnwu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Reduce BroadcastReceivers
parent
80dad541
Show whitespace changes
Inline
Side-by-side
Showing
21 changed files
with
133 additions
and
191 deletions
+133
-191
AndroidManifest.xml
app/src/full/AndroidManifest.xml
+4
-8
h.java
app/src/full/java/a/h.java
+2
-2
i.java
app/src/full/java/a/i.java
+2
-2
j.java
app/src/full/java/a/j.java
+2
-2
k.java
app/src/full/java/a/k.java
+2
-2
l.java
app/src/full/java/a/l.java
+17
-2
m.java
app/src/full/java/a/m.java
+2
-2
n.java
app/src/full/java/a/n.java
+0
-7
o.java
app/src/full/java/a/o.java
+0
-22
p.java
app/src/full/java/a/p.java
+0
-7
Const.java
app/src/full/java/com/topjohnwu/magisk/Const.java
+2
-0
Data.java
app/src/full/java/com/topjohnwu/magisk/Data.java
+7
-13
BootReceiver.java
...ull/java/com/topjohnwu/magisk/receivers/BootReceiver.java
+0
-43
GeneralReceiver.java
.../java/com/topjohnwu/magisk/receivers/GeneralReceiver.java
+78
-0
ManagerUpdate.java
...ll/java/com/topjohnwu/magisk/receivers/ManagerUpdate.java
+0
-18
PackageReceiver.java
.../java/com/topjohnwu/magisk/receivers/PackageReceiver.java
+0
-32
RebootReceiver.java
...l/java/com/topjohnwu/magisk/receivers/RebootReceiver.java
+0
-14
Notifications.java
...c/full/java/com/topjohnwu/magisk/utils/Notifications.java
+5
-4
Utils.java
app/src/full/java/com/topjohnwu/magisk/utils/Utils.java
+2
-3
activity_about.xml
app/src/full/res/layout/activity_about.xml
+6
-6
activity_donation.xml
app/src/full/res/layout/activity_donation.xml
+2
-2
No files found.
app/src/full/AndroidManifest.xml
View file @
f0f87c8e
...
...
@@ -48,7 +48,7 @@
<!-- Superuser -->
<activity
android:name=
"a.
p
"
android:name=
"a.
m
"
android:excludeFromRecents=
"true"
android:launchMode=
"singleTask"
android:taskAffinity=
"internal.superuser"
...
...
@@ -69,17 +69,13 @@
<intent-filter>
<action
android:name=
"android.intent.action.BOOT_COMPLETED"
/>
</intent-filter>
</receiver>
<receiver
android:name=
"a.i"
>
<intent-filter>
<action
android:name=
"android.intent.action.PACKAGE_REPLACED"
/>
<action
android:name=
"android.intent.action.PACKAGE_FULLY_REMOVED"
/>
<data
android:scheme=
"package"
/>
</intent-filter>
</receiver>
<receiver
android:name=
"a.j"
/>
<receiver
android:name=
"a.k"
/>
<receiver
android:name=
"a.l"
>
<receiver
android:name=
"a.i"
>
<intent-filter>
<action
android:name=
"android.intent.action.LOCALE_CHANGED"
/>
</intent-filter>
...
...
@@ -88,11 +84,11 @@
<!-- Service -->
<service
android:name=
"a.
m
"
android:name=
"a.
j
"
android:exported=
"true"
android:permission=
"android.permission.BIND_JOB_SERVICE"
/>
<service
android:name=
"a.
n
"
android:name=
"a.
k
"
android:exported=
"true"
android:permission=
"android.permission.BIND_JOB_SERVICE"
/>
...
...
app/src/full/java/a/h.java
View file @
f0f87c8e
package
a
;
import
com.topjohnwu.magisk.receivers.
Boot
Receiver
;
import
com.topjohnwu.magisk.receivers.
General
Receiver
;
public
class
h
extends
Boot
Receiver
{
public
class
h
extends
General
Receiver
{
/* stub */
}
app/src/full/java/a/i.java
View file @
f0f87c8e
package
a
;
import
com.topjohnwu.magisk.receivers.
Package
Receiver
;
import
com.topjohnwu.magisk.receivers.
Shortcut
Receiver
;
public
class
i
extends
Package
Receiver
{
public
class
i
extends
Shortcut
Receiver
{
/* stub */
}
app/src/full/java/a/j.java
View file @
f0f87c8e
package
a
;
import
com.topjohnwu.magisk.
receivers.ManagerUpdat
e
;
import
com.topjohnwu.magisk.
services.OnBootServic
e
;
public
class
j
extends
ManagerUpdat
e
{
public
class
j
extends
OnBootServic
e
{
/* stub */
}
app/src/full/java/a/k.java
View file @
f0f87c8e
package
a
;
import
com.topjohnwu.magisk.
receivers.RebootReceiver
;
import
com.topjohnwu.magisk.
services.UpdateCheckService
;
public
class
k
extends
RebootReceiver
{
public
class
k
extends
UpdateCheckService
{
/* stub */
}
app/src/full/java/a/l.java
View file @
f0f87c8e
package
a
;
import
com.topjohnwu.magisk.receivers.ShortcutReceiver
;
import
android.content.Context
;
import
android.util.AttributeSet
;
public
class
l
extends
ShortcutReceiver
{
import
com.topjohnwu.magisk.components.AboutCardRow
;
public
class
l
extends
AboutCardRow
{
/* stub */
public
l
(
Context
context
)
{
super
(
context
);
}
public
l
(
Context
context
,
AttributeSet
attrs
)
{
super
(
context
,
attrs
);
}
public
l
(
Context
context
,
AttributeSet
attrs
,
int
defStyleAttr
)
{
super
(
context
,
attrs
,
defStyleAttr
);
}
}
app/src/full/java/a/m.java
View file @
f0f87c8e
package
a
;
import
com.topjohnwu.magisk.
services.OnBootService
;
import
com.topjohnwu.magisk.
SuRequestActivity
;
public
class
m
extends
OnBootService
{
public
class
m
extends
SuRequestActivity
{
/* stub */
}
app/src/full/java/a/n.java
deleted
100644 → 0
View file @
80dad541
package
a
;
import
com.topjohnwu.magisk.services.UpdateCheckService
;
public
class
n
extends
UpdateCheckService
{
/* stub */
}
app/src/full/java/a/o.java
deleted
100644 → 0
View file @
80dad541
package
a
;
import
android.content.Context
;
import
android.util.AttributeSet
;
import
com.topjohnwu.magisk.components.AboutCardRow
;
public
class
o
extends
AboutCardRow
{
/* stub */
public
o
(
Context
context
)
{
super
(
context
);
}
public
o
(
Context
context
,
AttributeSet
attrs
)
{
super
(
context
,
attrs
);
}
public
o
(
Context
context
,
AttributeSet
attrs
,
int
defStyleAttr
)
{
super
(
context
,
attrs
,
defStyleAttr
);
}
}
app/src/full/java/a/p.java
deleted
100644 → 0
View file @
80dad541
package
a
;
import
com.topjohnwu.magisk.SuRequestActivity
;
public
class
p
extends
SuRequestActivity
{
/* stub */
}
app/src/full/java/com/topjohnwu/magisk/Const.java
View file @
f0f87c8e
...
...
@@ -100,6 +100,8 @@ public class Const {
public
static
final
String
INTENT_SET_LINK
=
"link"
;
public
static
final
String
FLASH_ACTION
=
"action"
;
public
static
final
String
FLASH_SET_BOOT
=
"boot"
;
public
static
final
String
BROADCAST_MANAGER_UPDATE
=
"manager_update"
;
public
static
final
String
BROADCAST_REBOOT
=
"reboot"
;
// others
public
static
final
String
CHECK_UPDATES
=
"check_update"
;
...
...
app/src/full/java/com/topjohnwu/magisk/Data.java
View file @
f0f87c8e
...
...
@@ -6,10 +6,7 @@ import android.os.Looper;
import
android.util.Xml
;
import
com.topjohnwu.magisk.components.AboutCardRow
;
import
com.topjohnwu.magisk.receivers.BootReceiver
;
import
com.topjohnwu.magisk.receivers.ManagerUpdate
;
import
com.topjohnwu.magisk.receivers.PackageReceiver
;
import
com.topjohnwu.magisk.receivers.RebootReceiver
;
import
com.topjohnwu.magisk.receivers.GeneralReceiver
;
import
com.topjohnwu.magisk.receivers.ShortcutReceiver
;
import
com.topjohnwu.magisk.services.OnBootService
;
import
com.topjohnwu.magisk.services.UpdateCheckService
;
...
...
@@ -75,15 +72,12 @@ public class Data {
classMap
.
put
(
DonationActivity
.
class
,
a
.
e
.
class
);
classMap
.
put
(
FlashActivity
.
class
,
a
.
f
.
class
);
classMap
.
put
(
NoUIActivity
.
class
,
a
.
g
.
class
);
classMap
.
put
(
BootReceiver
.
class
,
a
.
h
.
class
);
classMap
.
put
(
PackageReceiver
.
class
,
a
.
i
.
class
);
classMap
.
put
(
ManagerUpdate
.
class
,
a
.
j
.
class
);
classMap
.
put
(
RebootReceiver
.
class
,
a
.
k
.
class
);
classMap
.
put
(
ShortcutReceiver
.
class
,
a
.
l
.
class
);
classMap
.
put
(
OnBootService
.
class
,
a
.
m
.
class
);
classMap
.
put
(
UpdateCheckService
.
class
,
a
.
n
.
class
);
classMap
.
put
(
AboutCardRow
.
class
,
a
.
o
.
class
);
classMap
.
put
(
SuRequestActivity
.
class
,
a
.
p
.
class
);
classMap
.
put
(
GeneralReceiver
.
class
,
a
.
h
.
class
);
classMap
.
put
(
ShortcutReceiver
.
class
,
a
.
i
.
class
);
classMap
.
put
(
OnBootService
.
class
,
a
.
j
.
class
);
classMap
.
put
(
UpdateCheckService
.
class
,
a
.
k
.
class
);
classMap
.
put
(
AboutCardRow
.
class
,
a
.
l
.
class
);
classMap
.
put
(
SuRequestActivity
.
class
,
a
.
m
.
class
);
}
...
...
app/src/full/java/com/topjohnwu/magisk/receivers/BootReceiver.java
deleted
100644 → 0
View file @
80dad541
package
com
.
topjohnwu
.
magisk
.
receivers
;
import
android.content.BroadcastReceiver
;
import
android.content.Context
;
import
android.content.Intent
;
import
android.text.TextUtils
;
import
com.topjohnwu.magisk.Data
;
import
com.topjohnwu.magisk.SuRequestActivity
;
import
com.topjohnwu.magisk.services.OnBootService
;
import
com.topjohnwu.magisk.utils.SuConnector
;
public
class
BootReceiver
extends
BroadcastReceiver
{
@Override
public
void
onReceive
(
Context
context
,
Intent
intent
)
{
if
(
intent
==
null
)
return
;
if
(
TextUtils
.
equals
(
intent
.
getAction
(),
Intent
.
ACTION_BOOT_COMPLETED
))
{
String
action
=
intent
.
getStringExtra
(
"action"
);
if
(
action
==
null
)
action
=
"boot"
;
switch
(
action
)
{
case
"request"
:
Intent
i
=
new
Intent
(
context
,
Data
.
classMap
.
get
(
SuRequestActivity
.
class
))
.
putExtra
(
"socket"
,
intent
.
getStringExtra
(
"socket"
))
.
putExtra
(
"version"
,
2
)
.
addFlags
(
Intent
.
FLAG_ACTIVITY_NEW_TASK
);
context
.
startActivity
(
i
);
break
;
case
"log"
:
SuConnector
.
handleLogs
(
intent
,
2
);
break
;
case
"notify"
:
SuConnector
.
handleNotify
(
intent
);
break
;
case
"boot"
:
OnBootService
.
enqueueWork
(
context
);
break
;
}
}
}
}
app/src/full/java/com/topjohnwu/magisk/receivers/GeneralReceiver.java
0 → 100644
View file @
f0f87c8e
package
com
.
topjohnwu
.
magisk
.
receivers
;
import
android.content.BroadcastReceiver
;
import
android.content.Context
;
import
android.content.Intent
;
import
com.topjohnwu.magisk.Const
;
import
com.topjohnwu.magisk.Data
;
import
com.topjohnwu.magisk.MagiskManager
;
import
com.topjohnwu.magisk.SuRequestActivity
;
import
com.topjohnwu.magisk.services.OnBootService
;
import
com.topjohnwu.magisk.utils.DlInstallManager
;
import
com.topjohnwu.magisk.utils.Logger
;
import
com.topjohnwu.magisk.utils.SuConnector
;
import
com.topjohnwu.superuser.Shell
;
public
class
GeneralReceiver
extends
BroadcastReceiver
{
private
String
getPkg
(
Intent
i
)
{
return
i
.
getData
()
==
null
?
""
:
i
.
getData
().
getEncodedSchemeSpecificPart
();
}
@Override
public
void
onReceive
(
Context
context
,
Intent
intent
)
{
MagiskManager
mm
=
Data
.
MM
();
if
(
intent
==
null
)
return
;
String
action
=
intent
.
getAction
();
if
(
action
==
null
)
return
;
Logger
.
debug
(
action
);
switch
(
action
)
{
case
Intent
.
ACTION_BOOT_COMPLETED
:
String
bootAction
=
intent
.
getStringExtra
(
"action"
);
if
(
bootAction
==
null
)
bootAction
=
"boot"
;
switch
(
bootAction
)
{
case
"request"
:
Intent
i
=
new
Intent
(
mm
,
Data
.
classMap
.
get
(
SuRequestActivity
.
class
))
.
putExtra
(
"socket"
,
intent
.
getStringExtra
(
"socket"
))
.
putExtra
(
"version"
,
2
)
.
addFlags
(
Intent
.
FLAG_ACTIVITY_NEW_TASK
);
mm
.
startActivity
(
i
);
break
;
case
"log"
:
SuConnector
.
handleLogs
(
intent
,
2
);
break
;
case
"notify"
:
SuConnector
.
handleNotify
(
intent
);
break
;
case
"boot"
:
default
:
/* The actual on-boot trigger */
OnBootService
.
enqueueWork
(
mm
);
break
;
}
break
;
case
Intent
.
ACTION_PACKAGE_REPLACED
:
// This will only work pre-O
if
(
mm
.
prefs
.
getBoolean
(
Const
.
Key
.
SU_REAUTH
,
false
))
{
mm
.
mDB
.
deletePolicy
(
getPkg
(
intent
));
}
break
;
case
Intent
.
ACTION_PACKAGE_FULLY_REMOVED
:
String
pkg
=
getPkg
(
intent
);
mm
.
mDB
.
deletePolicy
(
pkg
);
Shell
.
su
(
"magiskhide --rm "
+
pkg
).
submit
();
break
;
case
Const
.
Key
.
BROADCAST_MANAGER_UPDATE
:
Data
.
managerLink
=
intent
.
getStringExtra
(
Const
.
Key
.
INTENT_SET_LINK
);
DlInstallManager
.
upgrade
(
intent
.
getStringExtra
(
Const
.
Key
.
INTENT_SET_NAME
));
break
;
case
Const
.
Key
.
BROADCAST_REBOOT
:
Shell
.
su
(
"/system/bin/reboot"
).
submit
();
break
;
}
}
}
app/src/full/java/com/topjohnwu/magisk/receivers/ManagerUpdate.java
deleted
100644 → 0
View file @
80dad541
package
com
.
topjohnwu
.
magisk
.
receivers
;
import
android.content.BroadcastReceiver
;
import
android.content.Context
;
import
android.content.Intent
;
import
com.topjohnwu.magisk.Const
;
import
com.topjohnwu.magisk.Data
;
import
com.topjohnwu.magisk.utils.DlInstallManager
;
public
class
ManagerUpdate
extends
BroadcastReceiver
{
@Override
public
void
onReceive
(
Context
context
,
Intent
intent
)
{
Data
.
managerLink
=
intent
.
getStringExtra
(
Const
.
Key
.
INTENT_SET_LINK
);
DlInstallManager
.
upgrade
(
intent
.
getStringExtra
(
Const
.
Key
.
INTENT_SET_NAME
));
}
}
app/src/full/java/com/topjohnwu/magisk/receivers/PackageReceiver.java
deleted
100644 → 0
View file @
80dad541
package
com
.
topjohnwu
.
magisk
.
receivers
;
import
android.content.BroadcastReceiver
;
import
android.content.Context
;
import
android.content.Intent
;
import
com.topjohnwu.magisk.Const
;
import
com.topjohnwu.magisk.Data
;
import
com.topjohnwu.magisk.MagiskManager
;
import
com.topjohnwu.superuser.Shell
;
public
class
PackageReceiver
extends
BroadcastReceiver
{
@Override
public
void
onReceive
(
Context
context
,
Intent
intent
)
{
MagiskManager
mm
=
Data
.
MM
();
String
pkg
=
intent
.
getData
().
getEncodedSchemeSpecificPart
();
switch
(
intent
.
getAction
())
{
case
Intent
.
ACTION_PACKAGE_REPLACED
:
// This will only work pre-O
if
(
mm
.
prefs
.
getBoolean
(
Const
.
Key
.
SU_REAUTH
,
false
))
{
mm
.
mDB
.
deletePolicy
(
pkg
);
}
break
;
case
Intent
.
ACTION_PACKAGE_FULLY_REMOVED
:
mm
.
mDB
.
deletePolicy
(
pkg
);
Shell
.
su
(
"magiskhide --rm "
+
pkg
).
submit
();
break
;
}
}
}
app/src/full/java/com/topjohnwu/magisk/receivers/RebootReceiver.java
deleted
100644 → 0
View file @
80dad541
package
com
.
topjohnwu
.
magisk
.
receivers
;
import
android.content.BroadcastReceiver
;
import
android.content.Context
;
import
android.content.Intent
;
import
com.topjohnwu.superuser.Shell
;
public
class
RebootReceiver
extends
BroadcastReceiver
{
@Override
public
void
onReceive
(
Context
context
,
Intent
intent
)
{
Shell
.
su
(
"/system/bin/reboot"
).
submit
();
}
}
app/src/full/java/com/topjohnwu/magisk/utils/Notifications.java
View file @
f0f87c8e
...
...
@@ -12,8 +12,7 @@ import com.topjohnwu.magisk.Data;
import
com.topjohnwu.magisk.MagiskManager
;
import
com.topjohnwu.magisk.R
;
import
com.topjohnwu.magisk.SplashActivity
;
import
com.topjohnwu.magisk.receivers.ManagerUpdate
;
import
com.topjohnwu.magisk.receivers.RebootReceiver
;
import
com.topjohnwu.magisk.receivers.GeneralReceiver
;
import
androidx.core.app.NotificationCompat
;
import
androidx.core.app.NotificationManagerCompat
;
...
...
@@ -63,7 +62,8 @@ public class Notifications {
String
name
=
Utils
.
fmt
(
"MagiskManager v%s(%d)"
,
Data
.
remoteManagerVersionString
,
Data
.
remoteManagerVersionCode
);
Intent
intent
=
new
Intent
(
mm
,
Data
.
classMap
.
get
(
ManagerUpdate
.
class
));
Intent
intent
=
new
Intent
(
mm
,
Data
.
classMap
.
get
(
GeneralReceiver
.
class
));
intent
.
setAction
(
Const
.
Key
.
BROADCAST_MANAGER_UPDATE
);
intent
.
putExtra
(
Const
.
Key
.
INTENT_SET_LINK
,
Data
.
managerLink
);
intent
.
putExtra
(
Const
.
Key
.
INTENT_SET_NAME
,
name
);
PendingIntent
pendingIntent
=
PendingIntent
.
getBroadcast
(
mm
,
...
...
@@ -84,7 +84,8 @@ public class Notifications {
public
static
void
dtboPatched
()
{
MagiskManager
mm
=
Data
.
MM
();
Intent
intent
=
new
Intent
(
mm
,
Data
.
classMap
.
get
(
RebootReceiver
.
class
));
Intent
intent
=
new
Intent
(
mm
,
Data
.
classMap
.
get
(
GeneralReceiver
.
class
))
.
setAction
(
Const
.
Key
.
BROADCAST_REBOOT
);
PendingIntent
pendingIntent
=
PendingIntent
.
getBroadcast
(
mm
,
Const
.
ID
.
DTBO_NOTIFICATION_ID
,
intent
,
PendingIntent
.
FLAG_UPDATE_CURRENT
);
...
...
app/src/full/java/com/topjohnwu/magisk/utils/Utils.java
View file @
f0f87c8e
...
...
@@ -23,14 +23,13 @@ import com.topjohnwu.magisk.MagiskManager;
import
com.topjohnwu.magisk.R
;
import
com.topjohnwu.magisk.container.Module
;
import
com.topjohnwu.magisk.container.ValueSortedMap
;
import
com.topjohnwu.magisk.services.UpdateCheckService
;
import
com.topjohnwu.superuser.Shell
;
import
com.topjohnwu.superuser.io.SuFile
;
import
java.util.Locale
;
import
java.util.Map
;
import
a.n
;
public
class
Utils
{
public
static
int
getPrefsInt
(
SharedPreferences
prefs
,
String
key
,
int
def
)
{
...
...
@@ -84,7 +83,7 @@ public class Utils {
if
(
mm
.
prefs
.
getBoolean
(
Const
.
Key
.
CHECK_UPDATES
,
true
))
{
if
(
scheduler
.
getAllPendingJobs
().
isEmpty
()
||
Const
.
UPDATE_SERVICE_VER
>
mm
.
prefs
.
getInt
(
Const
.
Key
.
UPDATE_SERVICE_VER
,
-
1
))
{
ComponentName
service
=
new
ComponentName
(
mm
,
n
.
class
);
ComponentName
service
=
new
ComponentName
(
mm
,
Data
.
classMap
.
get
(
UpdateCheckService
.
class
)
);
JobInfo
info
=
new
JobInfo
.
Builder
(
Const
.
ID
.
UPDATE_SERVICE_ID
,
service
)
.
setRequiredNetworkType
(
JobInfo
.
NETWORK_TYPE_ANY
)
.
setPersisted
(
true
)
...
...
app/src/full/res/layout/activity_about.xml
View file @
f0f87c8e
...
...
@@ -54,42 +54,42 @@
android:textAppearance=
"@style/TextAppearance.AppCompat.Headline"
/>
</LinearLayout>
<a.
o
<a.
l
android:id=
"@+id/app_version_info"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
app:icon=
"@drawable/ic_info_outline"
app:text=
"@string/app_version"
/>
<a.
o
<a.
l
android:id=
"@+id/app_changelog"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
app:icon=
"@drawable/ic_history"
app:text=
"@string/app_changelog"
/>
<a.
o
<a.
l
android:id=
"@+id/app_translators"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
app:icon=
"@drawable/ic_language"
app:text=
"@string/app_translators"
/>
<a.
o
<a.
l
android:id=
"@+id/follow_twitter"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
app:icon=
"@drawable/ic_twitter"
app:text=
"@string/follow_twitter"
/>
<a.
o
<a.
l
android:id=
"@+id/app_source_code"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
app:icon=
"@drawable/ic_github"
app:text=
"@string/app_source_code"
/>
<a.
o
<a.
l
android:id=
"@+id/support_thread"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
...
...
app/src/full/res/layout/activity_donation.xml
View file @
f0f87c8e
...
...
@@ -40,14 +40,14 @@
android:text=
"@string/donation"
android:textAppearance=
"@style/TextAppearance.AppCompat.Headline"
/>
<a.
o
<a.
l
android:id=
"@+id/paypal"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
app:icon=
"@drawable/ic_paypal"
app:text=
"PayPal"
/>
<a.
o
<a.
l
android:id=
"@+id/patreon"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment