Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
B
BYLAppRobot
Project
Project
Details
Activity
Releases
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
liuyang
BYLAppRobot
Commits
f6747eed
Commit
f6747eed
authored
Oct 09, 2018
by
liuyang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
APK图片抓取识别及轮播流地址抓取,客户端获取配置信息
#BYLSERVER-1438
parent
25f6fdc3
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
112 additions
and
33 deletions
+112
-33
build.gradle
app/build.gradle
+1
-1
test.json
app/src/main/assets/test.json
+1
-1
MainActivity.kt
app/src/main/java/com/duolebo/blyrobot/MainActivity.kt
+41
-3
AppInfoData.kt
app/src/main/java/com/duolebo/blyrobot/data/AppInfoData.kt
+10
-3
Task.kt
app/src/main/java/com/duolebo/blyrobot/data/Task.kt
+17
-5
GetAppInfoProtocol.kt
.../java/com/duolebo/blyrobot/protocol/GetAppInfoProtocol.kt
+8
-0
BylRobotService.kt
...main/java/com/duolebo/blyrobot/service/BylRobotService.kt
+0
-7
TaskManager.kt
app/src/main/java/com/duolebo/blyrobot/tools/TaskManager.kt
+10
-3
activity_main.xml
app/src/main/res/layout/activity_main.xml
+10
-8
app_config_item.xml
app/src/main/res/layout/app_config_item.xml
+14
-2
No files found.
app/build.gradle
View file @
f6747eed
...
@@ -9,7 +9,7 @@ android {
...
@@ -9,7 +9,7 @@ android {
minSdkVersion
15
minSdkVersion
15
targetSdkVersion
22
targetSdkVersion
22
versionCode
1
versionCode
1
versionName
"1.
0
"
versionName
"1.
1
"
}
}
signingConfigs
{
signingConfigs
{
...
...
app/src/main/assets/test.json
View file @
f6747eed
{
{
"name"
:
"电视家"
,
"name"
:
"电视家
2.0
"
,
"packageName"
:
"com.elinkway.tvlive2"
,
"packageName"
:
"com.elinkway.tvlive2"
,
"launcher"
:
"com.elinkway.tvlive2.activity.SplashActivity"
,
"launcher"
:
"com.elinkway.tvlive2.activity.SplashActivity"
,
"launchDelay"
:
"15"
,
"launchDelay"
:
"15"
,
...
...
app/src/main/java/com/duolebo/blyrobot/MainActivity.kt
View file @
f6747eed
package
com.duolebo.blyrobot
package
com.duolebo.blyrobot
import
android.content.Intent
import
android.content.Intent
import
android.graphics.drawable.Drawable
import
android.os.Bundle
import
android.os.Bundle
import
android.support.v4.content.LocalBroadcastManager
import
android.support.v4.content.LocalBroadcastManager
import
android.support.v7.app.AppCompatActivity
import
android.support.v7.app.AppCompatActivity
...
@@ -12,7 +13,9 @@ import android.widget.Toast
...
@@ -12,7 +13,9 @@ import android.widget.Toast
import
com.duolebo.appbase.AppBaseHandler
import
com.duolebo.appbase.AppBaseHandler
import
com.duolebo.appbase.IAppBaseCallback
import
com.duolebo.appbase.IAppBaseCallback
import
com.duolebo.appbase.IProtocol
import
com.duolebo.appbase.IProtocol
import
com.duolebo.blyrobot.activity.PackageListActivity
import
com.duolebo.blyrobot.data.ApkInfo
import
com.duolebo.blyrobot.data.ApkInfo
import
com.duolebo.blyrobot.data.ApkPackageInfo
import
com.duolebo.blyrobot.data.AppInfoData
import
com.duolebo.blyrobot.data.AppInfoData
import
com.duolebo.blyrobot.data.Task
import
com.duolebo.blyrobot.data.Task
import
com.duolebo.blyrobot.protocol.GetAppInfoProtocol
import
com.duolebo.blyrobot.protocol.GetAppInfoProtocol
...
@@ -22,6 +25,7 @@ import com.duolebo.blyrobot.ui.AppConfigListItem
...
@@ -22,6 +25,7 @@ import com.duolebo.blyrobot.ui.AppConfigListItem
import
com.duolebo.blyrobot.util.AdbUtil
import
com.duolebo.blyrobot.util.AdbUtil
import
com.duolebo.blyrobot.util.Config
import
com.duolebo.blyrobot.util.Config
import
com.duolebo.blyrobot.util.Constants
import
com.duolebo.blyrobot.util.Constants
import
com.minhui.vpn.utils.ThreadProxy
import
kotlinx.android.synthetic.main.activity_main.*
import
kotlinx.android.synthetic.main.activity_main.*
import
java.util.*
import
java.util.*
...
@@ -33,13 +37,14 @@ class MainActivity : AppCompatActivity(), IAppBaseCallback {
...
@@ -33,13 +37,14 @@ class MainActivity : AppCompatActivity(), IAppBaseCallback {
private
lateinit
var
appInfoAdapter
:
AppConfigAdapter
private
lateinit
var
appInfoAdapter
:
AppConfigAdapter
private
lateinit
var
refreshTimer
:
Timer
private
lateinit
var
refreshTimer
:
Timer
private
var
apkPackageInfo
:
List
<
ApkPackageInfo
>?
=
null
override
fun
onCreate
(
savedInstanceState
:
Bundle
?)
{
override
fun
onCreate
(
savedInstanceState
:
Bundle
?)
{
super
.
onCreate
(
savedInstanceState
)
super
.
onCreate
(
savedInstanceState
)
Log
.
i
(
TAG
,
"onCreate...."
)
Log
.
i
(
TAG
,
"onCreate...."
)
setContentView
(
R
.
layout
.
activity_main
)
setContentView
(
R
.
layout
.
activity_main
)
apkInfoProtocol
=
GetAppInfoProtocol
(
this
,
Config
.
instance
)
getLocalAppList
()
this
.
dataHandler
=
AppBaseHandler
(
this
)
this
.
appInfoAdapter
=
AppConfigAdapter
()
this
.
appInfoAdapter
=
AppConfigAdapter
()
listView
.
adapter
=
this
.
appInfoAdapter
listView
.
adapter
=
this
.
appInfoAdapter
...
@@ -65,6 +70,22 @@ class MainActivity : AppCompatActivity(), IAppBaseCallback {
...
@@ -65,6 +70,22 @@ class MainActivity : AppCompatActivity(), IAppBaseCallback {
stopRobot
()
stopRobot
()
}
}
startBtn
.
requestFocus
()
startBtn
.
requestFocus
()
requestAppList
()
}
private
fun
requestAppList
()
{
apkInfoProtocol
=
GetAppInfoProtocol
(
this
,
Config
.
instance
)
this
.
dataHandler
=
AppBaseHandler
(
this
)
apkInfoProtocol
.
execute
(
this
.
dataHandler
)
}
private
fun
getLocalAppList
()
{
ThreadProxy
.
getInstance
().
execute
(
object
:
Runnable
{
override
fun
run
()
{
apkPackageInfo
=
ApkPackageInfo
.
getAppInfos
(
applicationContext
)
}
})
}
}
private
fun
initRefreshTimer
()
{
private
fun
initRefreshTimer
()
{
...
@@ -122,6 +143,21 @@ class MainActivity : AppCompatActivity(), IAppBaseCallback {
...
@@ -122,6 +143,21 @@ class MainActivity : AppCompatActivity(), IAppBaseCallback {
}
}
}
}
private
fun
getAppIcon
(
packageName
:
String
):
Drawable
?
{
var
drawable
:
Drawable
?=
null
apkPackageInfo
?.
run
{
val
targetPackage
=
this
.
find
{
it
.
packageName
==
packageName
}
if
(
targetPackage
!=
null
)
{
drawable
=
targetPackage
.
applicationInfo
.
loadIcon
(
packageManager
)
}
}
return
drawable
}
class
AppConfigAdapter
:
BaseAdapter
()
{
class
AppConfigAdapter
:
BaseAdapter
()
{
private
val
dataList
=
ArrayList
<
ApkInfo
>()
private
val
dataList
=
ArrayList
<
ApkInfo
>()
...
@@ -132,10 +168,12 @@ class MainActivity : AppCompatActivity(), IAppBaseCallback {
...
@@ -132,10 +168,12 @@ class MainActivity : AppCompatActivity(), IAppBaseCallback {
}
}
override
fun
getView
(
position
:
Int
,
convertView
:
View
?,
parent
:
ViewGroup
):
View
{
override
fun
getView
(
position
:
Int
,
convertView
:
View
?,
parent
:
ViewGroup
):
View
{
var
itemView
=
convertView
as
AppConfigListItem
var
itemView
:
AppConfigListItem
if
(
convertView
==
null
)
{
if
(
convertView
==
null
)
{
itemView
=
AppConfigListItem
(
parent
.
context
)
itemView
=
AppConfigListItem
(
parent
.
context
)
}
}
else
itemView
=
convertView
as
AppConfigListItem
itemView
.
setData
(
dataList
[
position
])
itemView
.
setData
(
dataList
[
position
])
...
...
app/src/main/java/com/duolebo/blyrobot/data/AppInfoData.kt
View file @
f6747eed
package
com.duolebo.blyrobot.data
package
com.duolebo.blyrobot.data
import
com.duolebo.appbase.IModel
import
com.duolebo.appbase.prj.XMLHelper
import
com.duolebo.appbase.prj.XMLHelper
import
com.duolebo.appbase.prj.bmtv.model.ModelBase
import
org.json.JSONArray
import
org.json.JSONArray
import
org.json.JSONObject
import
org.json.JSONObject
class
AppInfoData
:
IModel
{
class
AppInfoData
:
ModelBase
()
{
val
apkInfos
=
ArrayList
<
ApkInfo
>()
val
apkInfos
=
ArrayList
<
ApkInfo
>()
var
result
=
-
1
override
fun
from
(
json
:
JSONObject
):
Boolean
{
override
fun
from
(
json
:
JSONObject
):
Boolean
{
val
data
=
json
.
optJSONArray
(
"data"
)
val
data
=
json
.
optJSONArray
(
"data"
)
if
(
data
!=
null
)
{
if
(
data
!=
null
)
{
for
(
i
in
0
..
data
.
length
())
{
for
(
i
in
0
until
data
.
length
())
{
val
apkInfo
=
ApkInfo
()
val
apkInfo
=
ApkInfo
()
apkInfo
.
from
(
data
.
getJSONObject
(
i
))
apkInfo
.
from
(
data
.
getJSONObject
(
i
))
apkInfos
.
add
(
apkInfo
)
apkInfos
.
add
(
apkInfo
)
}
}
}
}
result
=
0
return
true
return
true
}
}
...
@@ -27,4 +30,8 @@ class AppInfoData : IModel {
...
@@ -27,4 +30,8 @@ class AppInfoData : IModel {
override
fun
from
(
p0
:
XMLHelper
?):
Boolean
{
override
fun
from
(
p0
:
XMLHelper
?):
Boolean
{
return
false
return
false
}
}
override
fun
getCode
():
Int
{
return
result
}
}
}
\ No newline at end of file
app/src/main/java/com/duolebo/blyrobot/data/Task.kt
View file @
f6747eed
...
@@ -3,6 +3,7 @@ package com.duolebo.blyrobot.data
...
@@ -3,6 +3,7 @@ package com.duolebo.blyrobot.data
import
android.content.Context
import
android.content.Context
import
android.os.Environment
import
android.os.Environment
import
android.util.Log
import
android.util.Log
import
android.widget.Toast
import
com.duolebo.appbase.AppBaseHandler
import
com.duolebo.appbase.AppBaseHandler
import
com.duolebo.appbase.IAppBaseCallback
import
com.duolebo.appbase.IAppBaseCallback
import
com.duolebo.appbase.IProtocol
import
com.duolebo.appbase.IProtocol
...
@@ -10,10 +11,7 @@ import com.duolebo.blyrobot.protocol.ApkReportProtocol
...
@@ -10,10 +11,7 @@ import com.duolebo.blyrobot.protocol.ApkReportProtocol
import
com.duolebo.blyrobot.util.AdbUtil
import
com.duolebo.blyrobot.util.AdbUtil
import
com.duolebo.blyrobot.util.AppUtil
import
com.duolebo.blyrobot.util.AppUtil
import
com.duolebo.blyrobot.util.Config
import
com.duolebo.blyrobot.util.Config
import
net.gotev.uploadservice.ServerResponse
import
net.gotev.uploadservice.*
import
net.gotev.uploadservice.UploadInfo
import
net.gotev.uploadservice.UploadNotificationConfig
import
net.gotev.uploadservice.UploadStatusDelegate
import
net.gotev.uploadservice.ftp.FTPUploadRequest
import
net.gotev.uploadservice.ftp.FTPUploadRequest
import
net.gotev.uploadservice.ftp.UnixPermissions
import
net.gotev.uploadservice.ftp.UnixPermissions
import
org.json.JSONObject
import
org.json.JSONObject
...
@@ -43,10 +41,12 @@ class Task : IAppBaseCallback {
...
@@ -43,10 +41,12 @@ class Task : IAppBaseCallback {
.
getExternalStorageDirectory
().
absolutePath
+
"/capture.txt"
.
getExternalStorageDirectory
().
absolutePath
+
"/capture.txt"
private
var
uploadImages
=
ArrayList
<
String
>()
private
var
uploadImages
=
ArrayList
<
String
>()
private
var
uploadId
=
""
private
var
channelIndex
=
0
private
var
channelIndex
=
0
private
var
status
=
"0"
private
var
status
=
"0"
private
var
reportProtocol
:
ApkReportProtocol
private
var
reportProtocol
:
ApkReportProtocol
private
var
dataHandler
:
AppBaseHandler
private
var
dataHandler
:
AppBaseHandler
private
lateinit
var
reportJson
:
JSONObject
private
lateinit
var
reportJson
:
JSONObject
...
@@ -91,6 +91,18 @@ class Task : IAppBaseCallback {
...
@@ -91,6 +91,18 @@ class Task : IAppBaseCallback {
AdbUtil
.
stopApp
(
this
.
apkInfo
.
packageName
)
AdbUtil
.
stopApp
(
this
.
apkInfo
.
packageName
)
}
}
fun
destroy
()
{
// 杀掉tcpdump进程
AdbUtil
.
killTcpdump
()
// 退出应用
AdbUtil
.
stopApp
(
this
.
apkInfo
.
packageName
)
// 取消ftp上传
if
(!
uploadId
.
isNullOrEmpty
())
UploadService
.
stopUpload
(
uploadId
)
}
private
fun
finish
(
result
:
Boolean
)
{
private
fun
finish
(
result
:
Boolean
)
{
this
.
taskListener
?.
run
{
this
.
taskListener
?.
run
{
onComplete
(
result
)
onComplete
(
result
)
...
@@ -290,7 +302,7 @@ class Task : IAppBaseCallback {
...
@@ -290,7 +302,7 @@ class Task : IAppBaseCallback {
}
}
}
}
val
uploadId
=
uploadRequest
.
startUpload
()
this
.
uploadId
=
uploadRequest
.
startUpload
()
Log
.
i
(
TAG
,
"upload id $uploadId"
)
Log
.
i
(
TAG
,
"upload id $uploadId"
)
}
catch
(
exc
:
Exception
)
{
}
catch
(
exc
:
Exception
)
{
Log
.
e
(
TAG
,
exc
.
message
,
exc
)
Log
.
e
(
TAG
,
exc
.
message
,
exc
)
...
...
app/src/main/java/com/duolebo/blyrobot/protocol/GetAppInfoProtocol.kt
View file @
f6747eed
...
@@ -2,6 +2,7 @@ package com.duolebo.blyrobot.protocol
...
@@ -2,6 +2,7 @@ package com.duolebo.blyrobot.protocol
import
android.content.Context
import
android.content.Context
import
com.duolebo.appbase.IModel
import
com.duolebo.appbase.IModel
import
com.duolebo.appbase.net.Parser
import
com.duolebo.appbase.prj.bmtv.protocol.IProtocolConfig
import
com.duolebo.appbase.prj.bmtv.protocol.IProtocolConfig
import
com.duolebo.appbase.prj.bmtv.protocol.ProtocolBase
import
com.duolebo.appbase.prj.bmtv.protocol.ProtocolBase
import
com.duolebo.blyrobot.data.AppInfoData
import
com.duolebo.blyrobot.data.AppInfoData
...
@@ -10,6 +11,10 @@ class GetAppInfoProtocol(context: Context?, config: IProtocolConfig?) : Protocol
...
@@ -10,6 +11,10 @@ class GetAppInfoProtocol(context: Context?, config: IProtocolConfig?) : Protocol
val
model
=
AppInfoData
()
val
model
=
AppInfoData
()
override
fun
prepareHttpBody
():
ByteArray
{
return
""
.
toByteArray
()
}
override
fun
prepareProtocolBody
(
p0
:
MutableMap
<
String
,
String
>?)
{
override
fun
prepareProtocolBody
(
p0
:
MutableMap
<
String
,
String
>?)
{
}
}
...
@@ -21,4 +26,7 @@ class GetAppInfoProtocol(context: Context?, config: IProtocolConfig?) : Protocol
...
@@ -21,4 +26,7 @@ class GetAppInfoProtocol(context: Context?, config: IProtocolConfig?) : Protocol
return
""
return
""
}
}
override
fun
requestHttpMethod
():
Parser
.
ParserClient
.
HttpMethod
{
return
Parser
.
ParserClient
.
HttpMethod
.
GET
}
}
}
\ No newline at end of file
app/src/main/java/com/duolebo/blyrobot/service/BylRobotService.kt
View file @
f6747eed
...
@@ -33,7 +33,6 @@ class BylRobotService: Service() {
...
@@ -33,7 +33,6 @@ class BylRobotService: Service() {
Constants
.
CMD_START
->
loadTask
()
Constants
.
CMD_START
->
loadTask
()
Constants
.
CMD_STOP
->
stopTask
()
Constants
.
CMD_STOP
->
stopTask
()
}
}
loadTask
()
}
}
}
}
}
}
...
@@ -78,12 +77,6 @@ class BylRobotService: Service() {
...
@@ -78,12 +77,6 @@ class BylRobotService: Service() {
TaskManager
.
instance
.
stop
()
TaskManager
.
instance
.
stop
()
}
}
private
fun
screenShot
()
{
Thread
(
Runnable
{
}).
start
()
}
private
fun
testKey
()
{
private
fun
testKey
()
{
Thread
(
Runnable
{
Thread
(
Runnable
{
AdbUtil
.
sendMultiKey
(
"down/up/right"
)
AdbUtil
.
sendMultiKey
(
"down/up/right"
)
...
...
app/src/main/java/com/duolebo/blyrobot/tools/TaskManager.kt
View file @
f6747eed
...
@@ -9,9 +9,13 @@ class TaskManager {
...
@@ -9,9 +9,13 @@ class TaskManager {
val
tasks
=
ArrayList
<
Task
>()
val
tasks
=
ArrayList
<
Task
>()
private
var
isRunning
=
false
private
var
isRunning
=
false
private
var
currentTask
:
Task
?=
null
private
var
currentTask
:
Task
?=
null
// 处理时间
var
updateTime
=
0L
private
val
runnable
=
Runnable
{
private
val
runnable
=
Runnable
{
while
(
isRunning
&&
tasks
.
size
>
0
)
{
val
dist
=
System
.
currentTimeMillis
()
-
updateTime
while
(
isRunning
&&
tasks
.
size
>
0
&&
dist
>
6
*
60
*
60
*
1000
)
{
this
.
updateTime
=
System
.
currentTimeMillis
()
currentTask
=
tasks
[
0
]
currentTask
=
tasks
[
0
]
currentTask
!!
.
start
()
currentTask
!!
.
start
()
}
}
...
@@ -20,7 +24,7 @@ class TaskManager {
...
@@ -20,7 +24,7 @@ class TaskManager {
fun
add
(
task
:
Task
)
{
fun
add
(
task
:
Task
)
{
task
.
taskListener
=
object
:
Task
.
OnTaskListener
{
task
.
taskListener
=
object
:
Task
.
OnTaskListener
{
override
fun
onComplete
(
result
:
Boolean
)
{
override
fun
onComplete
(
result
:
Boolean
)
{
remove
(
task
)
Log
.
i
(
TAG
,
"task ${task.apkInfo.name} complete with result: $result"
)
}
}
}
}
this
.
tasks
.
add
(
task
)
this
.
tasks
.
add
(
task
)
...
@@ -55,9 +59,12 @@ class TaskManager {
...
@@ -55,9 +59,12 @@ class TaskManager {
}
}
fun
stop
()
{
fun
stop
()
{
updateTime
=
0L
this
.
tasks
.
forEach
{
this
.
tasks
.
forEach
{
it
.
destroy
()
}
}
this
.
tasks
.
clear
()
this
.
isRunning
=
false
this
.
isRunning
=
false
}
}
...
...
app/src/main/res/layout/activity_main.xml
View file @
f6747eed
...
@@ -5,11 +5,20 @@
...
@@ -5,11 +5,20 @@
android:layout_height=
"match_parent"
android:layout_height=
"match_parent"
android:layout_width=
"match_parent"
>
android:layout_width=
"match_parent"
>
<TextView
android:id=
"@+id/textView"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:textColor=
"@color/colorAccent"
android:layout_alignParentTop=
"true"
android:layout_centerHorizontal=
"true"
android:layout_marginTop=
"5dp"
/>
<LinearLayout
<LinearLayout
android:id=
"@+id/btnGroup"
android:id=
"@+id/btnGroup"
android:layout_width=
"wrap_content"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_
alignParentTop=
"true
"
android:layout_
below=
"@+id/textView
"
android:layout_centerHorizontal=
"true"
android:layout_centerHorizontal=
"true"
android:orientation=
"horizontal"
>
android:orientation=
"horizontal"
>
<Button
<Button
...
@@ -24,13 +33,6 @@
...
@@ -24,13 +33,6 @@
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginLeft=
"10dp"
android:layout_marginLeft=
"10dp"
android:text=
"停止"
/>
android:text=
"停止"
/>
<TextView
android:id=
"@+id/textView"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:textColor=
"@color/colorAccent"
android:layout_marginTop=
"20dp"
/>
</LinearLayout>
</LinearLayout>
<ListView
<ListView
...
...
app/src/main/res/layout/app_config_item.xml
View file @
f6747eed
...
@@ -4,13 +4,24 @@
...
@@ -4,13 +4,24 @@
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
>
android:layout_height=
"wrap_content"
>
<ImageView
android:id=
"@+id/appIcon"
android:layout_width=
"30dp"
android:layout_height=
"30dp"
android:layout_centerVertical=
"true"
android:layout_alignParentLeft=
"true"
android:layout_marginLeft=
"10dp"
tools:src=
"@drawable/sym_def_app_icon"
/>
<TextView
<TextView
android:id=
"@+id/appName"
android:id=
"@+id/appName"
android:layout_width=
"wrap_content"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:minHeight=
"40dp"
android:minHeight=
"40dp"
android:layout_marginLeft=
"10dp"
android:layout_marginLeft=
"10dp"
android:textSize=
"22sp"
android:layout_toRightOf=
"@id/appIcon"
android:textSize=
"18sp"
android:gravity=
"center_vertical"
android:gravity=
"center_vertical"
tools:text=
"电视家"
/>
tools:text=
"电视家"
/>
...
@@ -20,9 +31,10 @@
...
@@ -20,9 +31,10 @@
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:minHeight=
"30dp"
android:minHeight=
"30dp"
android:layout_marginLeft=
"10dp"
android:layout_marginLeft=
"10dp"
android:layout_toRightOf=
"@id/appIcon"
android:layout_below=
"@+id/appName"
android:layout_below=
"@+id/appName"
android:gravity=
"center_vertical"
android:gravity=
"center_vertical"
android:textSize=
"1
8
sp"
android:textSize=
"1
6
sp"
tools:text=
"com.elinkway.tvlive2"
/>
tools:text=
"com.elinkway.tvlive2"
/>
<TextView
<TextView
...
...
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