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
41295e0c
Commit
41295e0c
authored
Sep 18, 2016
by
topjohnwu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Refactor modules fragment
parent
1e09ccb4
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
432 additions
and
682 deletions
+432
-682
BaseModuleFragment.java
...rc/main/java/com/topjohnwu/magisk/BaseModuleFragment.java
+0
-390
ModulesAdapter.java
app/src/main/java/com/topjohnwu/magisk/ModulesAdapter.java
+308
-0
ModulesFragment.java
app/src/main/java/com/topjohnwu/magisk/ModulesFragment.java
+57
-145
ReposFragment.java
app/src/main/java/com/topjohnwu/magisk/ReposFragment.java
+1
-3
WelcomeActivity.java
app/src/main/java/com/topjohnwu/magisk/WelcomeActivity.java
+0
-1
Module.java
app/src/main/java/com/topjohnwu/magisk/module/Module.java
+34
-46
Utils.java
app/src/main/java/com/topjohnwu/magisk/utils/Utils.java
+4
-2
modules_fragment.xml
app/src/main/res/layout/modules_fragment.xml
+28
-64
repos_fragment.xml
app/src/main/res/layout/repos_fragment.xml
+0
-0
single_module_fragment.xml
app/src/main/res/layout/single_module_fragment.xml
+0
-31
No files found.
app/src/main/java/com/topjohnwu/magisk/BaseModuleFragment.java
deleted
100644 → 0
View file @
1e09ccb4
This diff is collapsed.
Click to expand it.
app/src/main/java/com/topjohnwu/magisk/ModulesAdapter.java
0 → 100644
View file @
41295e0c
This diff is collapsed.
Click to expand it.
app/src/main/java/com/topjohnwu/magisk/ModulesFragment.java
View file @
41295e0c
package
com
.
topjohnwu
.
magisk
;
import
android.app.Activity
;
import
android.content.Intent
;
import
android.graphics.Bitmap
;
import
android.graphics.BitmapFactory
;
import
android.net.Uri
;
import
android.content.SharedPreferences
;
import
android.os.AsyncTask
;
import
android.os.Bundle
;
import
android.pr
ovider.MediaStore
;
import
android.pr
eference.PreferenceManager
;
import
android.support.annotation.Nullable
;
import
android.support.design.widget.FloatingActionButton
;
import
android.support.design.widget.TabLayout
;
import
android.support.design.widget.Snackbar
;
import
android.support.v4.app.Fragment
;
import
android.support.v4.app.FragmentManager
;
import
android.support.v4.app.FragmentPagerAdapter
;
import
android.support.v4.view.ViewPager
;
import
android.util.Log
;
import
android.support.v4.widget.SwipeRefreshLayout
;
import
android.support.v7.widget.RecyclerView
;
import
android.view.LayoutInflater
;
import
android.view.Menu
;
import
android.view.MenuInflater
;
import
android.view.View
;
import
android.view.ViewGroup
;
import
android.widget.
ProgressBar
;
import
android.widget.T
oast
;
import
android.widget.
CheckBox
;
import
android.widget.T
extView
;
import
com.ipaulpro.afilechooser.FileInfo
;
import
com.ipaulpro.afilechooser.utils.FileUtils
;
import
com.topjohnwu.magisk.module.Module
;
import
com.topjohnwu.magisk.module.RepoHelper
;
import
com.topjohnwu.magisk.utils.Utils
;
import
java.util.ArrayList
;
import
java.util.Collections
;
import
java.util.Comparator
;
import
java.util.List
;
import
butterknife.BindView
;
import
butterknife.ButterKnife
;
public
class
ModulesFragment
extends
Fragment
{
@BindView
(
R
.
id
.
swipeRefreshLayout
)
SwipeRefreshLayout
mSwipeRefreshLayout
;
@BindView
(
R
.
id
.
recyclerView
)
RecyclerView
recyclerView
;
@BindView
(
R
.
id
.
empty_rv
)
TextView
emptyTv
;
private
static
final
int
FETCH_ZIP_CODE
=
2
;
private
SharedPreferences
prefs
;
public
static
List
<
Module
>
listModules
=
new
ArrayList
<>();
public
static
List
<
Module
>
listModulesCache
=
new
ArrayList
<>();
@BindView
(
R
.
id
.
progressBar
)
ProgressBar
progressBar
;
@BindView
(
R
.
id
.
fab
)
FloatingActionButton
fabio
;
@BindView
(
R
.
id
.
pager
)
ViewPager
viewPager
;
@BindView
(
R
.
id
.
tab_layout
)
TabLayout
tabLayout
;
private
int
viewPagePosition
;
private
RepoHelper
.
TaskDelegate
mTaskDelegate
;
@Nullable
@Override
public
View
onCreateView
(
LayoutInflater
inflater
,
@Nullable
ViewGroup
container
,
@Nullable
Bundle
savedInstanceState
)
{
View
view
=
inflater
.
inflate
(
R
.
layout
.
modules_fragment
,
container
,
false
);
View
view
Main
=
inflater
.
inflate
(
R
.
layout
.
modules_fragment
,
container
,
false
);
ButterKnife
.
bind
(
this
,
view
);
fabio
.
setOnClickListener
(
v
->
{
Intent
getContentIntent
=
FileUtils
.
createGetContentIntent
(
null
);
getContentIntent
.
setType
(
"application/zip"
);
Intent
fileIntent
=
Intent
.
createChooser
(
getContentIntent
,
"Select a file"
);
startActivityForResult
(
fileIntent
,
FETCH_ZIP_CODE
);
ButterKnife
.
bind
(
this
,
viewMain
);
});
mTaskDelegate
=
result
->
{
if
(
result
.
equals
(
"OK"
))
{
RefreshUI
();
}
};
prefs
=
PreferenceManager
.
getDefaultSharedPreferences
(
getActivity
());
mSwipeRefreshLayout
.
setOnRefreshListener
(()
->
{
new
updateUI
().
execute
();
return
view
;
}
recyclerView
.
setVisibility
(
View
.
GONE
);
new
Utils
.
LoadModules
(
getActivity
()).
execute
();
new
updateUI
().
execute
();
prefs
.
edit
().
putBoolean
(
"ignoreUpdateAlerts"
,
false
).
apply
();
@Override
public
void
onActivityResult
(
int
requestCode
,
int
resultCode
,
Intent
data
)
{
if
(
data
!=
null
)
{
// Get the URI of the selected file
final
Uri
uri
=
data
.
getData
();
Log
.
i
(
"Magisk"
,
"ModulesFragment: Uri = "
+
uri
.
toString
()
+
" or "
);
new
Utils
.
FlashZIP
(
getActivity
(),
uri
).
execute
();
try
{
// Get the file path from the URI
FileInfo
fileInfo
=
FileUtils
.
getFileInfo
(
getActivity
(),
uri
);
Toast
.
makeText
(
getActivity
(),
"File Selected: "
+
fileInfo
.
getDisplayName
()
+
" size: "
+
fileInfo
.
getSize
(),
Toast
.
LENGTH_LONG
).
show
();
if
(!
fileInfo
.
isExternal
())
{
});
}
else
{
prefs
.
registerOnSharedPreferenceChangeListener
((
sharedPreferences
,
s
)
->
{
if
(
s
.
contains
(
"updated"
))
{
viewMain
.
invalidate
();
viewMain
.
requestLayout
();
}
}
catch
(
Exception
e
)
{
Log
.
e
(
"FileSelectorTestAc..."
,
"File select error"
,
e
);
}
}
}
@Override
public
void
onCreateOptionsMenu
(
Menu
menu
,
MenuInflater
inflater
)
{
super
.
onCreateOptionsMenu
(
menu
,
inflater
);
inflater
.
inflate
(
R
.
menu
.
menu_module
,
menu
);
}
});
private
void
RefreshUI
()
{
viewPagePosition
=
tabLayout
.
getSelectedTabPosition
();
listModules
.
clear
();
listModulesCache
.
clear
();
progressBar
.
setVisibility
(
View
.
VISIBLE
);
viewPager
.
setAdapter
(
new
TabsAdapter
(
getChildFragmentManager
()));
tabLayout
.
setupWithViewPager
(
viewPager
);
viewPager
.
setCurrentItem
(
viewPagePosition
);
new
Utils
.
LoadModules
(
getActivity
()).
execute
();
Collections
.
sort
(
listModules
,
new
CustomComparator
());
Collections
.
sort
(
listModulesCache
,
new
CustomComparator
());
new
updateUI
().
execute
();
}
void
selectPage
(
int
pageIndex
)
{
tabLayout
.
setScrollPosition
(
pageIndex
,
0
f
,
true
);
viewPager
.
setCurrentItem
(
pageIndex
);
}
public
static
class
NormalModuleFragment
extends
BaseModuleFragment
{
@Override
protected
List
<
Module
>
listModules
()
{
return
listModules
;
}
}
public
static
class
CacheModuleFragment
extends
BaseModuleFragment
{
@Override
protected
List
<
Module
>
listModules
()
{
return
listModulesCache
;
}
return
viewMain
;
}
private
class
updateUI
extends
AsyncTask
<
Void
,
Void
,
Void
>
{
...
...
@@ -154,53 +73,46 @@ public class ModulesFragment extends Fragment {
@Override
protected
void
onPostExecute
(
Void
v
)
{
super
.
onPostExecute
(
v
);
progressBar
.
setVisibility
(
View
.
GONE
);
viewPager
.
setAdapter
(
new
TabsAdapter
(
getChildFragmentManager
()));
tabLayout
.
setupWithViewPager
(
viewPager
);
selectPage
(
viewPagePosition
);
}
}
private
class
TabsAdapter
extends
FragmentPagerAdapter
{
if
(
listModules
().
size
()
==
0
)
{
emptyTv
.
setVisibility
(
View
.
VISIBLE
);
recyclerView
.
setVisibility
(
View
.
GONE
);
}
else
{
recyclerView
.
setVisibility
(
View
.
VISIBLE
);
}
recyclerView
.
setAdapter
(
new
ModulesAdapter
(
listModules
(),
(
chk
,
position
)
->
{
// On Checkbox change listener
CheckBox
chbox
=
(
CheckBox
)
chk
;
String
[]
tabTitles
=
new
String
[]{
getString
(
R
.
string
.
modules
),
getString
(
R
.
string
.
cache_modules
)
};
if
(!
chbox
.
isChecked
())
{
listModules
().
get
(
position
).
createDisableFile
();
Snackbar
.
make
(
chk
,
R
.
string
.
disable_file_created
,
Snackbar
.
LENGTH_SHORT
).
show
();
}
else
{
listModules
().
get
(
position
).
removeDisableFile
();
Snackbar
.
make
(
chk
,
R
.
string
.
disable_file_removed
,
Snackbar
.
LENGTH_SHORT
).
show
();
}
},
(
deleteBtn
,
position
)
->
{
// On delete button click listener
public
TabsAdapter
(
FragmentManager
fm
)
{
super
(
fm
);
}
listModules
().
get
(
position
).
createRemoveFile
();
Snackbar
.
make
(
deleteBtn
,
R
.
string
.
remove_file_created
,
Snackbar
.
LENGTH_SHORT
).
show
();
},
(
undeleteBtn
,
position
)
->
{
// On undelete button click listener
@Override
public
int
getCount
()
{
return
tabTitles
.
length
;
}
listModules
().
get
(
position
).
deleteRemoveFile
();
Snackbar
.
make
(
undeleteBtn
,
R
.
string
.
remove_file_deleted
,
Snackbar
.
LENGTH_SHORT
).
show
();
}));
@Override
public
String
getPageTitle
(
int
position
)
{
return
tabTitles
[
position
];
}
if
(
mSwipeRefreshLayout
.
isRefreshing
())
mSwipeRefreshLayout
.
setRefreshing
(
false
);
@Override
public
Fragment
getItem
(
int
position
)
{
if
(
position
==
0
)
{
NormalModuleFragment
nmf
=
new
NormalModuleFragment
();
nmf
.
SetDelegate
(
mTaskDelegate
);
return
nmf
;
}
else
{
CacheModuleFragment
cmf
=
new
CacheModuleFragment
();
cmf
.
SetDelegate
(
mTaskDelegate
);
return
cmf
;
}
}
}
public
class
CustomComparator
implements
Comparator
<
Module
>
{
@Override
public
int
compare
(
Module
o1
,
Module
o2
)
{
return
o1
.
getName
().
compareTo
(
o2
.
getName
());
}
// protected abstract List<Module> listModules();
protected
List
<
Module
>
listModules
()
{
return
listModules
;
}
}
app/src/main/java/com/topjohnwu/magisk/ReposFragment.java
View file @
41295e0c
package
com
.
topjohnwu
.
magisk
;
import
android.content.Context
;
import
android.content.DialogInterface
;
import
android.content.SharedPreferences
;
import
android.os.AsyncTask
;
import
android.os.Bundle
;
import
android.preference.PreferenceManager
;
import
android.support.annotation.Nullable
;
...
...
@@ -50,7 +48,7 @@ public class ReposFragment extends Fragment {
@Override
public
View
onCreateView
(
LayoutInflater
inflater
,
@Nullable
ViewGroup
container
,
@Nullable
Bundle
savedInstanceState
)
{
View
view
=
inflater
.
inflate
(
R
.
layout
.
single_repo
_fragment
,
container
,
false
);
View
view
=
inflater
.
inflate
(
R
.
layout
.
repos
_fragment
,
container
,
false
);
mView
=
view
;
ButterKnife
.
bind
(
this
,
view
);
prefs
=
PreferenceManager
.
getDefaultSharedPreferences
(
getActivity
());
...
...
app/src/main/java/com/topjohnwu/magisk/WelcomeActivity.java
View file @
41295e0c
package
com
.
topjohnwu
.
magisk
;
import
android.Manifest
;
import
android.content.Context
;
import
android.content.Intent
;
import
android.content.SharedPreferences
;
import
android.content.pm.PackageManager
;
...
...
app/src/main/java/com/topjohnwu/magisk/module/Module.java
View file @
41295e0c
...
...
@@ -15,8 +15,9 @@ public class Module {
private
String
mName
=
null
;
private
String
mVersion
=
"(No version provided)"
;
private
String
mDescription
=
"(No description provided)"
;
private
String
mUrl
,
mSupportUrl
,
mDonateUrl
,
mZipUrl
,
mBaseUrl
,
mManifestUrl
,
mAuthor
,
mLogUrl
;
private
boolean
mEnable
,
mRemove
,
mUpdateAvailable
,
mIsInstalled
,
mIsCacheModule
;
private
String
mSupportUrl
,
mDonateUrl
,
mZipUrl
,
mAuthor
,
mLogUrl
;
private
boolean
mEnable
=
false
,
mRemove
=
false
,
mUpdateAvailable
=
false
,
mIsInstalled
,
mIsCacheModule
=
false
;
private
String
mId
;
...
...
@@ -38,47 +39,32 @@ public class Module {
}
switch
(
props
[
0
])
{
case
"
versionCode
"
:
this
.
m
VersionCode
=
Integer
.
valueOf
(
props
[
1
])
;
case
"
id
"
:
this
.
m
Id
=
props
[
1
]
;
break
;
case
"name"
:
this
.
mName
=
props
[
1
];
break
;
case
"author"
:
this
.
mAuthor
=
props
[
1
];
break
;
case
"id"
:
this
.
mId
=
props
[
1
];
break
;
case
"version"
:
this
.
mVersion
=
props
[
1
];
break
;
case
"
description
"
:
this
.
m
Description
=
props
[
1
]
;
case
"
versionCode
"
:
this
.
m
VersionCode
=
Integer
.
parseInt
(
props
[
1
])
;
break
;
case
"
donate
"
:
this
.
m
DonateUrl
=
props
[
1
];
case
"
author
"
:
this
.
m
Author
=
props
[
1
];
break
;
case
"
cacheModule
"
:
this
.
m
IsCacheModule
=
Boolean
.
valueOf
(
props
[
1
])
;
case
"
description
"
:
this
.
m
Description
=
props
[
1
]
;
break
;
case
"support"
:
this
.
mSupportUrl
=
props
[
1
];
break
;
case
"donate
Url
"
:
case
"donate"
:
this
.
mDonateUrl
=
props
[
1
];
break
;
case
"zipUrl"
:
this
.
mZipUrl
=
props
[
1
];
break
;
case
"baseUrl"
:
this
.
mBaseUrl
=
props
[
1
];
break
;
case
"manifestUrl"
:
this
.
mManifestUrl
=
props
[
1
];
break
;
case
"logUrl"
:
this
.
mLogUrl
=
props
[
1
];
case
"cacheModule"
:
this
.
mIsCacheModule
=
Boolean
.
parseBoolean
(
props
[
1
]);
break
;
default
:
Log
.
d
(
"Magisk"
,
"Module: Manifest string not recognized: "
+
props
[
0
]);
...
...
@@ -165,18 +151,18 @@ public class Module {
}
public
Module
(
Repo
repo
)
{
mName
=
repo
.
getName
();
mVersion
=
repo
.
getmVersion
();
mDescription
=
repo
.
getDescription
();
mId
=
repo
.
getId
();
mVersionCode
=
repo
.
getmVersionCode
();
mUrl
=
repo
.
getmZipUrl
();
mEnable
=
true
;
mRemove
=
false
;
}
//
public Module(Repo repo) {
//
//
mName = repo.getName();
//
mVersion = repo.getmVersion();
//
mDescription = repo.getDescription();
//
mId = repo.getId();
//
mVersionCode = repo.getmVersionCode();
//
mUrl = repo.getmZipUrl();
//
mEnable = true;
//
mRemove = false;
//
//
}
...
...
@@ -224,22 +210,24 @@ public class Module {
return
mRemove
;
}
public
boolean
isCache
()
{
return
mIsCacheModule
;
}
public
void
setCache
()
{
mIsCacheModule
=
true
;
}
public
String
getmDonateUrl
()
{
return
mDonateUrl
;
}
public
String
getmZipUrl
()
{
return
mZipUrl
;
}
public
String
getmManifestUrl
()
{
return
mManifestUrl
;
}
public
String
getmSupportUrl
()
{
return
mSupportUrl
;
}
public
boolean
isInstalled
()
{
return
mIsInstalled
;
}
public
boolean
isUpdateAvailable
()
{
return
mUpdateAvailable
;
}
}
\ No newline at end of file
app/src/main/java/com/topjohnwu/magisk/utils/Utils.java
View file @
41295e0c
...
...
@@ -444,7 +444,6 @@ public class Utils {
@Override
protected
Void
doInBackground
(
Void
...
voids
)
{
ModulesFragment
.
listModules
.
clear
();
ModulesFragment
.
listModulesCache
.
clear
();
List
<
String
>
magisk
=
getModList
(
MAGISK_PATH
);
Log
.
d
(
"Magisk"
,
"Utils: Reload called, loading modules"
);
List
<
String
>
magiskCache
=
getModList
(
MAGISK_CACHE_PATH
);
...
...
@@ -456,7 +455,10 @@ public class Utils {
for
(
String
mod
:
magiskCache
)
{
Log
.
d
(
"Magisk"
,
"Utils: Adding cache module from string "
+
mod
);
ModulesFragment
.
listModulesCache
.
add
(
new
Module
(
mod
,
mContext
));
Module
cacheMod
=
new
Module
(
mod
,
mContext
);
// Prevent people forgot to change module.prop
cacheMod
.
setCache
();
ModulesFragment
.
listModules
.
add
(
cacheMod
);
}
return
null
;
...
...
app/src/main/res/layout/modules_fragment.xml
View file @
41295e0c
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
<android.support.v4.widget.SwipeRefreshLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
android:id=
"@+id/
main_conten
t"
android:id=
"@+id/
swipeRefreshLayou
t"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
>
<RelativeLayout
android:layout_width=
"fill_parent"
android:layout_height=
"wrap_content"
>
<LinearLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
android:id=
"@+id/llayout"
android:layout_width=
"match_parent"
android:layout_height=
"fill_parent"
android:layout_marginTop=
"?attr/actionBarSize"
android:orientation=
"vertical"
>
<android.support.design.widget.TabLayout
android:id=
"@+id/tab_layout"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:background=
"?attr/colorPrimary"
android:elevation=
"4dp"
android:minHeight=
"?attr/actionBarSize"
app:tabGravity=
"fill"
app:tabIndicatorColor=
"?attr/colorAccent"
app:tabMode=
"fixed"
app:tabTextAppearance=
"@style/TextAppearance.Design.Tab"
/>
<ProgressBar
android:id=
"@+id/progressBar"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center"
/>
<android.support.v4.view.ViewPager
android:id=
"@+id/pager"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:animateLayoutChanges=
"true"
/>
</LinearLayout>
<LinearLayout
android:id=
"@+id/ly_bar_bottom"
android:layout_width=
"fill_parent"
android:layout_height=
"wrap_content"
android:layout_alignParentBottom=
"true"
android:gravity=
"center"
android:orientation=
"horizontal"
>
<android.support.design.widget.FloatingActionButton
android:id=
"@+id/fab"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_margin=
"16dp"
android:baselineAlignBottom=
"false"
android:clickable=
"true"
android:src=
"@drawable/ic_add"
app:layout_anchorGravity=
"bottom|right|end"
/>
</LinearLayout>
</RelativeLayout>
</android.support.design.widget.CoordinatorLayout>
\ No newline at end of file
android:layout_height=
"fill_parent"
android:layout_marginTop=
"?attr/actionBarSize"
android:orientation=
"vertical"
>
<android.support.v7.widget.RecyclerView
android:id=
"@+id/recyclerView"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:clipToPadding=
"false"
android:paddingBottom=
"60dip"
app:layoutManager=
"android.support.v7.widget.LinearLayoutManager"
/>
<TextView
android:id=
"@+id/empty_rv"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:layout_gravity=
"center"
android:fontFamily=
"sans-serif-light"
android:gravity=
"center"
android:text=
"@string/no_modules_found"
android:textSize=
"20sp"
android:textStyle=
"italic"
android:visibility=
"gone"
/>
</android.support.v4.widget.SwipeRefreshLayout>
\ No newline at end of file
app/src/main/res/layout/
single_repo
_fragment.xml
→
app/src/main/res/layout/
repos
_fragment.xml
View file @
41295e0c
File moved
app/src/main/res/layout/single_module_fragment.xml
deleted
100644 → 0
View file @
1e09ccb4
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.SwipeRefreshLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
android:id=
"@+id/swipeRefreshLayout"
android:layout_width=
"match_parent"
android:layout_height=
"fill_parent"
android:layout_marginTop=
"?attr/actionBarSize"
android:orientation=
"vertical"
>
<android.support.v7.widget.RecyclerView
android:id=
"@+id/recyclerView"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:clipToPadding=
"false"
android:paddingBottom=
"60dip"
app:layoutManager=
"android.support.v7.widget.LinearLayoutManager"
/>
<TextView
android:id=
"@+id/empty_rv"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:layout_gravity=
"center"
android:fontFamily=
"sans-serif-light"
android:gravity=
"center"
android:text=
"@string/no_modules_found"
android:textSize=
"20sp"
android:textStyle=
"italic"
android:visibility=
"gone"
/>
</android.support.v4.widget.SwipeRefreshLayout>
\ No newline at end of file
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