add toutiao ad

This commit is contained in:
mwang 2019-06-01 22:01:34 +08:00
parent c3f6a7bc13
commit 7a5c051bad
58 changed files with 1756 additions and 470 deletions

View File

@ -31,7 +31,7 @@ android {
multiDexEnabled true //65535
manifestPlaceholders = [UMENG_CHANNEL_CALUE: "umeng"] //uMeng
// flavorDimensions "default" //debug时注销
// flavorDimensions "default" //debug时注销
}
buildTypes {
debug {
@ -39,6 +39,9 @@ android {
buildConfigField "boolean", "LOG_DEBUG", "true"
buildConfigField "String", "MAIN_HOST", '"http://xiaoshuofenxiang.com/api/"'
buildConfigField "String", "API_HOST", '"{\\"master\\":[\\"http:\\\\/\\\\/g.xiaoshuofenxiang.com\\"],\\"page\\":[\\"http:\\\\/\\\\/p.xiaoshuofenxiang.com\\"],\\"report\\":[\\"http:\\\\/\\\\/r.xiaoshuofenxiang.com\\"],\\"search\\":[\\"http:\\\\/\\\\/s.xiaoshuofenxiang.com\\"],\\"novel\\":[\\"http:\\\\/\\\\/n.xiaoshuofenxiang.com\\"],\\"novelsbydot\\":[\\"http:\\\\/\\\\/nbd.xiaoshuofenxiang.com\\"],\\"user\\":[\\"http:\\\\/\\\\/u.xiaoshuofenxiang.com\\"]}"'
buildConfigField "String","AD_SLOT_TOUTIAO_SPLASH_ID",'"819267134"'
buildConfigField "String","AD_SLOT_TOUTIAO_BANNER_ID",'"919267016"'
buildConfigField "String","AD_SLOT_TOUTIAO_BANNER_NATIVE_ID",'"919267816"'
// buildConfigField "String", "API_HOST", '""'
versionNameSuffix "-debug"
minifyEnabled false
@ -56,7 +59,8 @@ android {
// resource文件
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
/* applicationVariants.all { variant ->
/* applicationVariants.all { variant ->
variant.outputs.all { output ->
def outFile = output.outputFile
if (outFile != null && outFile.name.endsWith(".apk")) {
@ -73,6 +77,30 @@ android {
//
/* productFlavors {
// googleplay {}
kuan {
applicationId "com.novelbook.android"
versionName "v-kuan-1.0"
buildConfigField "String", "MAIN_HOST", '"http://xiaoshuofenxiang.com/api/"'
buildConfigField "String", "API_HOST", '"{\\"master\\":[\\"http:\\\\/\\\\/g.xiaoshuofenxiang.com\\"],\\"page\\":[\\"http:\\\\/\\\\/p.xiaoshuofenxiang.com\\"],\\"report\\":[\\"http:\\\\/\\\\/r.xiaoshuofenxiang.com\\"],\\"search\\":[\\"http:\\\\/\\\\/s.xiaoshuofenxiang.com\\"],\\"novel\\":[\\"http:\\\\/\\\\/n.xiaoshuofenxiang.com\\"],\\"novelsbydot\\":[\\"http:\\\\/\\\\/nbd.xiaoshuofenxiang.com\\"],\\"user\\":[\\"http:\\\\/\\\\/u.xiaoshuofenxiang.com\\"]}"'
//buildConfigField "String", "API_HOST", '""'
buildConfigField "String", "CHANNEL",'"kuan"'
}
xiaomi {
applicationId "com.novelbook.android"
versionName "v-xiaomi-1.0"
buildConfigField "String", "MAIN_HOST", '"http://xiaoshuofenxiang.com/api/"'
buildConfigField "String", "API_HOST", '"{\\"master\\":[\\"http:\\\\/\\\\/g.xiaoshuofenxiang.com\\"],\\"page\\":[\\"http:\\\\/\\\\/p.xiaoshuofenxiang.com\\"],\\"report\\":[\\"http:\\\\/\\\\/r.xiaoshuofenxiang.com\\"],\\"search\\":[\\"http:\\\\/\\\\/s.xiaoshuofenxiang.com\\"],\\"novel\\":[\\"http:\\\\/\\\\/n.xiaoshuofenxiang.com\\"],\\"novelsbydot\\":[\\"http:\\\\/\\\\/nbd.xiaoshuofenxiang.com\\"],\\"user\\":[\\"http:\\\\/\\\\/u.xiaoshuofenxiang.com\\"]}"'
//buildConfigField "String", "API_HOST", '""'
buildConfigField "String", "CHANNEL",'"xiaomi"'
}
qq {
applicationId "com.novelbook.android.qq"
versionName "v-qq-1.0"
buildConfigField "String", "MAIN_HOST", '"http://xiaoshuofenxiang.com/api/"'
buildConfigField "String", "API_HOST", '"{\\"master\\":[\\"http:\\\\/\\\\/g.xiaoshuofenxiang.com\\"],\\"page\\":[\\"http:\\\\/\\\\/p.xiaoshuofenxiang.com\\"],\\"report\\":[\\"http:\\\\/\\\\/r.xiaoshuofenxiang.com\\"],\\"search\\":[\\"http:\\\\/\\\\/s.xiaoshuofenxiang.com\\"],\\"novel\\":[\\"http:\\\\/\\\\/n.xiaoshuofenxiang.com\\"],\\"novelsbydot\\":[\\"http:\\\\/\\\\/nbd.xiaoshuofenxiang.com\\"],\\"user\\":[\\"http:\\\\/\\\\/u.xiaoshuofenxiang.com\\"]}"'
//buildConfigField "String", "API_HOST", '""'
}
qxs {
applicationId "com.novelbook.android.qxs"
versionName "v-qxs-5.0"
@ -176,4 +204,7 @@ dependencies {
implementation 'q.rorbin:VerticalTabLayout:1.2.5'
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.16'
implementation(name: 'open_ad_sdk', ext:'aar')
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.6'
}

Binary file not shown.

Binary file not shown.

View File

@ -261,17 +261,22 @@
void *(**On*Listener);
}
# -assumenosideeffects class android.util.Log {
# public static boolean isLoggable(java.lang.String,int);
# public static int v(...);
# public static int i(...);
# public static int w(...);
# public static int d(...);
# public static int e(...);
# }
-assumenosideeffects class android.util.Log {
public static boolean isLoggable(java.lang.String,int);
public static int v(...);
public static int i(...);
public static int w(...);
public static int d(...);
public static int e(...);
}
# 嵌入广点通sdk时必须添加
-keep class com.qq.e.** {
public protected *;
}
#穿山甲广告
-keep class com.bytedance.sdk.openadsdk.** { *; }
-keep class com.androidquery.callback.** {*;}
-keep public interface com.bytedance.sdk.openadsdk.downloadnew.** {*;}
-keep class com.ss.sys.ces.* {*;}

View File

@ -9,6 +9,9 @@
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<!-- chanshanjia-->
<uses-permission android:name="android.permission.GET_TASKS"/>
<!--<uses-permission android:name="android.permission.WAKE_LOCK" />-->
<application
android:name=".MyApp"
@ -26,71 +29,81 @@
android:label="@string/title_activity_cate_books"
android:launchMode="singleTask"
android:parentActivityName=".activity_cates"
android:screenOrientation="portrait"
android:theme="@style/ToolBarTheme.NoActionBar" />
<activity
android:name=".Activity_Search"
android:screenOrientation="portrait"
android:label="@string/title_activity_cates"
android:launchMode="singleTask"
android:parentActivityName=".Main2Activity"
android:theme="@style/ToolBarTheme.NoActionBar" />
<activity
android:name=".Activity_paihangbang"
android:screenOrientation="portrait"
android:label="@string/title_activity_paihangbang"
android:parentActivityName=".Main2Activity"
android:theme="@style/ToolBarTheme.NoActionBar" />
<activity
android:name=".Activity_ChgSource"
android:screenOrientation="portrait"
android:label="@string/title_Activity_ChgSource" />
<activity
android:name=".BookActivity"
android:label="@string/title_activity_book"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:launchMode="standard"
android:theme="@style/ToolBarTheme.NoActionBar" />
<activity
android:name=".ReadActivity"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:launchMode="singleTask"
android:theme="@style/ToolBarTheme.NoActionBar" />
<activity
android:name=".Main2Activity"
android:launchMode="singleTop"
android:screenOrientation="portrait"
android:theme="@style/ToolBarTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".FileActivity"
android:screenOrientation="portrait"
android:label="@string/app_name"
android:theme="@style/ToolBarTheme.NoActionBar" />
<activity
android:name=".MarkActivity"
android:screenOrientation="portrait"
android:label="@string/app_name"
android:theme="@style/ToolBarTheme.NoActionBar" />
<activity
android:name=".filechooser.FileChooserActivity"
android:screenOrientation="portrait"
android:label="@string/app_name"
android:theme="@style/ToolBarTheme.NoActionBar" />
<activity
android:name=".Activity_cache"
android:screenOrientation="portrait"
android:label="@string/title_download"
android:theme="@style/ToolBarTheme.NoActionBar" />
<activity
android:name=".AD.AdvertisementViewActivity"
android:label="@string/title_download"
android:screenOrientation="portrait"
android:label="@string/title_ad"
android:theme="@style/ToolBarTheme.NoActionBar" />
<activity
android:name=".ActivitySetup"
android:screenOrientation="portrait"
android:label="@string/title_setup"
android:theme="@style/ToolBarTheme.NoActionBar" />
<service
android:name=".service.ServiceDownload"
android:exported="false" /> <!-- qq ad -->
<service
android:exported="false" />
<!-- qq ad -->
<!-- <service
android:name="com.qq.e.comm.DownloadService"
android:exported="false" />
@ -108,7 +121,7 @@
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />
android:required="false" />-->
<provider
android:name="android.support.v4.content.FileProvider"
@ -119,6 +132,38 @@
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/gdt_file_path" />
</provider> <!-- qq ad end -->
<!-- chuanshanjia ad -->
<activity
android:name=".AD.toutiao.SplashActivity"
android:configChanges="keyboard|orientation|screenSize"
android:screenOrientation="portrait"
android:theme="@style/Theme.Splash">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />
<provider
android:name="com.bytedance.sdk.openadsdk.TTFileProvider"
android:authorities="${applicationId}.TTFileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
<provider
android:name="com.bytedance.sdk.openadsdk.multipro.TTMultiProvider"
android:authorities="${applicationId}.TTMultiProvider"
android:exported="false" />
<!-- chuanshanjia ad end-->
<!--
<provider
android:name="android.support.v4.content.FileProvider"
@ -134,8 +179,8 @@
<meta-data
android:name="UMENG_APPKEY"
android:value="5cd6238a570df375c3000cc9" /> <!-- <meta-data android:name="UMENG_CHANNEL" android:value="${UMENG_CHANNEL_VALUE}"/> -->
<meta-data android:name="UMENG_CHANNEL" android:value="debug" />
<!--<meta-data android:name="UMENG_CHANNEL" android:value="${UMENG_CHANNEL_VALUE}" />-->
<meta-data android:name="UMENG_CHANNEL" android:value="debug" />
<!--<meta-data android:name="UMENG_CHANNEL" android:value="${UMENG_CHANNEL_VALUE}" />-->
</application>
</manifest>

View File

@ -47,7 +47,7 @@ public class Activity_ChgSource extends Activity_base {
PageFactory pageFactory;
boolean isFromCate;
List<Site> mSites;
SiteAdapter mAdapter;
@Override
public int getLayoutRes() {
return R.layout.activity_chgsource;
@ -80,9 +80,30 @@ public class Activity_ChgSource extends Activity_base {
@Override
protected void initData() {
showProgressDialog(false,"正在加载源网站列表");
mSites = new ArrayList<Site>();
pageFactory =PageFactory.getInstance(getApplicationContext());
mSites = new ArrayList<Site>(Arrays.asList(pageFactory.getNovelSites().getSites()));
SiteAdapter mAdapter = new SiteAdapter(this, mSites, R.layout.recycle_list_one_item, new OnItemClickListener() {
new Thread() {
@Override
public void run() {
super.run();
while(pageFactory.getNovelSites()==null){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
mSites = new ArrayList<Site>(Arrays.asList(pageFactory.getNovelSites().getSites()));
handler.sendEmptyMessage(1);
}}.start();;
mAdapter = new SiteAdapter(this, mSites, R.layout.recycle_list_one_item, new OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
@ -111,7 +132,7 @@ public class Activity_ChgSource extends Activity_base {
@Override
public void fillData() {
mAdapter.setData(mSites);
}
interface OnItemClickListener
@ -229,6 +250,11 @@ public class Activity_ChgSource extends Activity_base {
notifyItemRemoved(position);
}
public void setData(List<Site> mSites) {
mDatas = mSites;
notifyDataSetChanged();
}
public class SiteViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.tvText)

View File

@ -14,14 +14,30 @@ import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.androidquery.callback.AQuery2;
import com.androidquery.callback.ImageOptions;
import com.bytedance.sdk.openadsdk.AdSlot;
import com.bytedance.sdk.openadsdk.TTAdConstant;
import com.bytedance.sdk.openadsdk.TTAdDislike;
import com.bytedance.sdk.openadsdk.TTAdNative;
import com.bytedance.sdk.openadsdk.TTAppDownloadListener;
import com.bytedance.sdk.openadsdk.TTBannerAd;
import com.bytedance.sdk.openadsdk.TTImage;
import com.bytedance.sdk.openadsdk.TTNativeAd;
import com.google.gson.Gson;
import com.novelbook.android.AD.toutiao.TTAdManagerHolder;
import com.novelbook.android.AD.toutiao.TToast;
import com.novelbook.android.db.Novel;
import com.novelbook.android.netsubscribe.MovieSubscribe;
import com.novelbook.android.netutils.NetUtil;
@ -29,6 +45,7 @@ import com.novelbook.android.netutils.OnSuccessAndFaultListener;
import com.novelbook.android.netutils.OnSuccessAndFaultSub;
import com.novelbook.android.upgrade.UpdateManager;
import com.novelbook.android.utils.CommonUtil;
import com.novelbook.android.utils.Constants;
import com.novelbook.android.utils.ImageUtil;
import com.novelbook.android.utils.MyImageLoader;
import com.novelbook.android.utils.OnItemClickListener;
@ -42,6 +59,7 @@ import butterknife.BindView;
import butterknife.ButterKnife;
public abstract class Activity_base extends AppCompatActivity {
private static String TAG ="Activity_base";
private ProgressDialog mProgressDialog;
private MyApp application;
private Activity_base oContext;
@ -50,6 +68,9 @@ public abstract class Activity_base extends AppCompatActivity {
@BindView(R.id.toolbar)
Toolbar toolbar;
@Nullable
@BindView(R.id.banner_container)
FrameLayout mBannerContainer;
@Nullable
@BindView(R.id.recycleViewBookList)
RecyclerView rvshudan;
void showBook(String bookName) { //show paihangbang activity
@ -80,6 +101,8 @@ public abstract class Activity_base extends AppCompatActivity {
ButterKnife.bind(this);
setupToolbar();
// 初始化View注入
initAD_TouTiao();
setTitle();
initData();
initViews();
@ -108,7 +131,7 @@ public abstract class Activity_base extends AppCompatActivity {
}
protected void closeCurrentActitivty(){
if( this instanceof BookActivity ) {
return;
// return;
}
finish();
}
@ -142,6 +165,14 @@ public abstract class Activity_base extends AppCompatActivity {
return mAdapter;
}
void showBookDetail(Novel book) {
List<Activity> acts = application.getActivityList();
for(Activity activity :acts){
if(activity instanceof BookActivity){
activity.finish();
break;
}
}
Intent intent = new Intent(this, BookActivity.class);
intent.putExtra(BookActivity.EXTRA_BOOK,book);
@ -291,6 +322,343 @@ public abstract class Activity_base extends AppCompatActivity {
super.finish();
}
//------ 头条 ad -----
AQuery2 mAQuery;
Button mCreativeButton;
TTAdNative mTTAdNative;
void initAD_TouTiao(){
mTTAdNative = TTAdManagerHolder.get().createAdNative(this);
//step3:(可选强烈建议在合适的时机调用):申请部分权限如read_phone_state,防止获取不了imei时候下载类广告没有填充的问题
TTAdManagerHolder.get().requestPermissionIfNecessary(this);
this.mAQuery = new AQuery2(this);
}
//----toutiao ad ----
public void loadBannerAd(FrameLayout bannerContainer, String codeId, int width, int height) {
//step4:创建广告请求参数AdSlot,具体参数含义参考文档
/* if(height >390){
width =(int)(height*1.78);
if(width > Constants.SCREEN_WIDTH_PIX-50 ){
width= Constants.SCREEN_WIDTH_PIX-50;
height =(int)(width/1.78);
}
}else if(height >150){
width =(int)(height*1.78);
}*/
// width =990;
//height=150;
height=height > 500 ? 500: height;
Log.d(TAG, String.format("loadBannerAd:finial width %s, height %s ",width,height));
AdSlot adSlot = new AdSlot.Builder()
.setCodeId(codeId) //广告位id
.setSupportDeepLink(true)
.setImageAcceptedSize(width, height)
.build();
//step5:请求广告对请求回调的广告作渲染处理
mTTAdNative.loadBannerAd(adSlot, new TTAdNative.BannerAdListener() {
@Override
public void onError(int code, String message) {
// TToast.show(oContext, "load error : " + code + ", " + message);
Log.e(TAG, String.format("loadBannerAd:code %s, message %s ", code,message));
bannerContainer.removeAllViews();
}
@Override
public void onBannerAdLoad(final TTBannerAd ad) {
if (ad == null) {
return;
}
View bannerView = ad.getBannerView();
if (bannerView == null) {
return;
}
//设置轮播的时间间隔 间隔在30s到120秒之间的值不设置默认不轮播
ad.setSlideIntervalTime(30 * 1000);
bannerContainer.removeAllViews();
bannerContainer.addView(bannerView);
//设置广告互动监听回调
ad.setBannerInteractionListener(new TTBannerAd.AdInteractionListener() {
@Override
public void onAdClicked(View view, int type) {
// TToast.show(oContext, "广告被点击");
}
@Override
public void onAdShow(View view, int type) {
// TToast.show(oContext, "广告展示");
}
});
//可选设置下载类广告的下载监听
bindDownloadListener(ad);
//在banner中显示网盟提供的dislike icon有助于广告投放精准度提升
ad.setShowDislikeIcon(new TTAdDislike.DislikeInteractionCallback() {
@Override
public void onSelected(int position, String value) {
// TToast.show(oContext, "点击 " + value);
//用户选择不喜欢原因后移除广告展示
bannerContainer.removeAllViews();
}
@Override
public void onCancel() {
// TToast.show(oContext, "点击取消 ");
}
});
//获取网盟dislike dialog您可以在您应用中本身自定义的dislike icon 按钮中设置 mTTAdDislike.showDislikeDialog();
/*mTTAdDislike = ad.getDislikeDialog(new TTAdDislike.DislikeInteractionCallback() {
@Override
public void onSelected(int position, String value) {
TToast.show(mContext, "点击 " + value);
}
@Override
public void onCancel() {
TToast.show(mContext, "点击取消 ");
}
});
if (mTTAdDislike != null) {
XXX.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mTTAdDislike.showDislikeDialog();
}
});
} */
}
});
}
private boolean mHasShowDownloadActive = false;
private void bindDownloadListener(TTBannerAd ad) {
ad.setDownloadListener(new TTAppDownloadListener() {
@Override
public void onIdle() {
// TToast.show(oContext, "点击图片开始下载", Toast.LENGTH_LONG);
}
@Override
public void onDownloadActive(long totalBytes, long currBytes, String fileName, String appName) {
if (!mHasShowDownloadActive) {
mHasShowDownloadActive = true;
// TToast.show(oContext, "下载中,点击图片暂停", Toast.LENGTH_LONG);
}
}
@Override
public void onDownloadPaused(long totalBytes, long currBytes, String fileName, String appName) {
// TToast.show(oContext, "下载暂停,点击图片继续", Toast.LENGTH_LONG);
}
@Override
public void onDownloadFailed(long totalBytes, long currBytes, String fileName, String appName) {
// TToast.show(oContext, "下载失败,点击图片重新下载", Toast.LENGTH_LONG);
}
@Override
public void onInstalled(String fileName, String appName) {
// TToast.show(oContext, "安装完成,点击图片打开", Toast.LENGTH_LONG);
}
@Override
public void onDownloadFinished(long totalBytes, String fileName, String appName) {
// TToast.show(oContext, "点击图片安装", Toast.LENGTH_LONG);
}
});
}
//-------------native toutiao ad
void loadNativeBannerAd(FrameLayout bannerContainer,String codeId) {
//step4:创建广告请求参数AdSlot,注意其中的setNativeAdtype方法具体参数含义参考文档
if(bannerContainer==null) return;
final AdSlot adSlot = new AdSlot.Builder()
.setCodeId(codeId)
.setSupportDeepLink(true)
.setImageAcceptedSize(690, 388)
.setNativeAdType(AdSlot.TYPE_BANNER) //请求原生广告时候请务必调用该方法设置参数为TYPE_BANNER或TYPE_INTERACTION_AD
.setAdCount(1)
.build();
//step5:请求广告对请求回调的广告作渲染处理
mTTAdNative.loadNativeAd(adSlot, new TTAdNative.NativeAdListener() {
@Override
public void onError(int code, String message) {
// TToast.show(oContext, "load error : " + code + ", " + message);
Log.e(TAG, "loadBannerAd: " + code + ", " + message);
}
@Override
public void onNativeAdLoad(List<TTNativeAd> ads) {
if (ads.get(0) == null) {
return;
}
View bannerView = LayoutInflater.from(oContext).inflate(R.layout.ad_toutiao_native_ad , bannerContainer, false);
if (bannerView == null) {
return;
}
if (mCreativeButton != null) {
//防止内存泄漏
mCreativeButton = null;
}
bannerContainer.removeAllViews();
bannerContainer.addView(bannerView);
//绑定原生广告的数据
setAdData(bannerContainer,bannerView, ads.get(0));
}
});
}
@SuppressWarnings("RedundantCast")
private void setAdData(FrameLayout bannerContainer,View nativeView, TTNativeAd nativeAd) {
((TextView) nativeView.findViewById(R.id.tv_native_ad_title)).setText(nativeAd.getTitle());
((TextView) nativeView.findViewById(R.id.tv_native_ad_desc)).setText(nativeAd.getDescription());
ImageView imgDislike = nativeView.findViewById(R.id.img_native_dislike);
bindDislikeAction( bannerContainer,nativeAd, imgDislike);
if (nativeAd.getImageList() != null && !nativeAd.getImageList().isEmpty()) {
TTImage image = nativeAd.getImageList().get(0);
if (image != null && image.isValid()) {
mAQuery.id(nativeView.findViewById(R.id.iv_native_image)).image(image.getImageUrl());
}
}
TTImage icon = nativeAd.getIcon();
if (icon != null && icon.isValid()) {
ImageOptions options = new ImageOptions();
mAQuery.id((nativeView.findViewById(R.id.iv_native_icon))).image(icon.getImageUrl(), options);
}
mCreativeButton = (Button) nativeView.findViewById(R.id.btn_native_creative);
//可根据广告类型为交互区域设置不同提示信息
switch (nativeAd.getInteractionType()) {
case TTAdConstant.INTERACTION_TYPE_DOWNLOAD:
//如果初始化ttAdManager.createAdNative(getApplicationContext())没有传入activity 则需要在此传activity否则影响使用Dislike逻辑
nativeAd.setActivityForDownloadApp(this);
mCreativeButton.setVisibility(View.VISIBLE);
nativeAd.setDownloadListener(mDownloadListener); // 注册下载监听器
break;
case TTAdConstant.INTERACTION_TYPE_DIAL:
mCreativeButton.setVisibility(View.VISIBLE);
mCreativeButton.setText("立即拨打");
break;
case TTAdConstant.INTERACTION_TYPE_LANDING_PAGE:
case TTAdConstant.INTERACTION_TYPE_BROWSER:
mCreativeButton.setVisibility(View.VISIBLE);
mCreativeButton.setText("查看详情");
break;
default:
mCreativeButton.setVisibility(View.GONE);
// TToast.show(oContext, "交互类型异常");
}
//可以被点击的view, 也可以把nativeView放进来意味整个广告区域可被点击
List<View> clickViewList = new ArrayList<>();
clickViewList.add(nativeView);
//触发创意广告的view点击下载或拨打电话
List<View> creativeViewList = new ArrayList<>();
//如果需要点击图文区域也能进行下载或者拨打电话动作请将图文区域的view传入
//creativeViewList.add(nativeView);
creativeViewList.add(mCreativeButton);
//重要! 这个涉及到广告计费必须正确调用convertView必须使用ViewGroup
nativeAd.registerViewForInteraction((ViewGroup) nativeView, clickViewList, creativeViewList, imgDislike, new TTNativeAd.AdInteractionListener() {
@Override
public void onAdClicked(View view, TTNativeAd ad) {
if (ad != null) {
// TToast.show(oContext, "广告" + ad.getTitle() + "被点击");
}
}
@Override
public void onAdCreativeClick(View view, TTNativeAd ad) {
if (ad != null) {
// TToast.show(oContext, "广告" + ad.getTitle() + "被创意按钮被点击");
}
}
@Override
public void onAdShow(TTNativeAd ad) {
if (ad != null) {
// TToast.show(oContext, "广告" + ad.getTitle() + "展示");
}
}
});
}
//接入网盟的dislike 逻辑有助于提示广告精准投放度
private void bindDislikeAction(FrameLayout bannerContainer,TTNativeAd ad, View dislikeView) {
final TTAdDislike ttAdDislike = ad.getDislikeDialog(this);
if (ttAdDislike != null) {
ttAdDislike.setDislikeInteractionCallback(new TTAdDislike.DislikeInteractionCallback() {
@Override
public void onSelected(int position, String value) {
bannerContainer.removeAllViews();
}
@Override
public void onCancel() {
}
});
}
dislikeView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (ttAdDislike != null)
ttAdDislike.showDislikeDialog();
}
});
}
private final TTAppDownloadListener mDownloadListener = new TTAppDownloadListener() {
@Override
public void onIdle() {
if (mCreativeButton != null) {
mCreativeButton.setText("开始下载");
}
}
@Override
public void onDownloadActive(long totalBytes, long currBytes, String fileName, String appName) {
if (mCreativeButton != null) {
if (totalBytes <= 0L) {
mCreativeButton.setText("下载中 percent: 0");
} else {
mCreativeButton.setText("下载中 percent: " + (currBytes * 100 / totalBytes));
}
}
}
@Override
public void onDownloadPaused(long totalBytes, long currBytes, String fileName, String appName) {
if (mCreativeButton != null) {
mCreativeButton.setText("下载暂停 percent: " + (currBytes * 100 / totalBytes));
}
}
@Override
public void onDownloadFailed(long totalBytes, long currBytes, String fileName, String appName) {
if (mCreativeButton != null) {
mCreativeButton.setText("重新下载");
}
}
@Override
public void onInstalled(String fileName, String appName) {
if (mCreativeButton != null) {
mCreativeButton.setText("点击打开");
}
}
@Override
public void onDownloadFinished(long totalBytes, String fileName, String appName) {
if (mCreativeButton != null) {
mCreativeButton.setText("点击安装");
}
}
};
}

View File

@ -22,6 +22,7 @@ import android.widget.TextView;
import com.novelbook.android.Activity_base;
import com.novelbook.android.R;
import com.novelbook.android.adapter.BookListAdapter;
import com.novelbook.android.bean.Cataloge;
import com.novelbook.android.db.Chapter;
import com.novelbook.android.db.DownloadTask;
@ -48,6 +49,7 @@ public class Activity_cache extends Activity_base {
TextView tvMsg;
private List<DownloadTask> mData;
private CacheAdapter mAdapter;
// private String cacheSize;
@Override
public int getLayoutRes() {
return R.layout.activitycache;
@ -76,6 +78,7 @@ public class Activity_cache extends Activity_base {
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
mData = LitePal.where("id >0").order("id desc").find(DownloadTask.class);//findAll(DownloadTask.class);
//cacheSize = FileUtils.getCachedSize();
/* mData.sort(new Comparator<DownloadTask>(){
public int compare(DownloadTask arg0, DownloadTask arg1) {
int i = arg0.getFinishedChpats()/arg0.getTotalChapts() > arg1.getFinishedChpats()/arg1.getTotalChapts() ?1:-1;
@ -147,6 +150,11 @@ public class Activity_cache extends Activity_base {
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.setAdapter(mAdapter );
if( mData.size()>0){
tvMsg.setText(String.format("共有%s条下载记录",mData.size()));
}else{
tvMsg.setText("您还没有没有缓存过小说");
}
}
private IntentFilter filter;
@ -164,7 +172,7 @@ public class Activity_cache extends Activity_base {
int progress=0;
int status=0;
tvMsg.setVisibility(View.GONE);
// tvMsg.setVisibility(View.GONE);
if( intent.hasExtra("network")){
String txt = intent.getStringExtra("network");
tvMsg.setText(txt);
@ -230,7 +238,7 @@ public class Activity_cache extends Activity_base {
unregisterReceiver(receiver);
}
class CacheAdapter extends RecyclerView.Adapter<CacheAdapter.MyViewHolder> {
class CacheAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final int EMPTY_VIEW = 1;
private final int PROGRESS_VIEW = 2;
private final int IMAGE_VIEW = 3;
@ -239,6 +247,7 @@ public class Activity_cache extends Activity_base {
private List<DownloadTask> mDatas = new ArrayList<DownloadTask>();
private OnItemClickLitener mOnItemClickLitener;
private int listItemID;
private String norecord ="还没有下载记录";
public CacheAdapter(Context context, List<DownloadTask> mDatas, int listItemID, OnItemClickLitener clickLitener) {
this.context = context;
@ -265,7 +274,12 @@ public class Activity_cache extends Activity_base {
}
@Override
public CacheAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if(viewType == EMPTY_VIEW){
EmptyViewHolder holder = new EmptyViewHolder (LayoutInflater.from(context).inflate(R.layout.recycle_list_empty_item, parent, false));
return holder;
}
CacheAdapter.MyViewHolder holder = new CacheAdapter.MyViewHolder(LayoutInflater.from(
context).inflate(listItemID, parent,
false));
@ -283,34 +297,42 @@ public class Activity_cache extends Activity_base {
}
@Override
public void onBindViewHolder(CacheAdapter.MyViewHolder holder, int position) {
public void onBindViewHolder( RecyclerView.ViewHolder hd, int position) {
if (hd instanceof EmptyViewHolder) {
EmptyViewHolder holder = ( EmptyViewHolder)hd;
holder.tvEmpty.setVisibility(View.VISIBLE);
holder.tvEmpty.setText(norecord);
return;
}
MyViewHolder holder = ( MyViewHolder)hd;
holder.tvTitle.setText(mDatas.get(position).getNovelTitle());
holder.tvSource.setText(mDatas.get(position).getDomainName());
boolean finished = mData.get(position).getFinishedChpats() == mData.get(position).getTotalChapts();
holder.tvSize.setText( FileUtils.getCacheSizeK(mData.get(position).getNovelId()));
if( mData.get(position).getTotalChapts() >0) {
float progress = mData.get(position).getFinishedChpats() *100/ mData.get(position).getTotalChapts() ;
holder.tvProgress.setText(String.format("%s/%s",mData.get(position).getFinishedChpats() >mData.get(position).getTotalChapts()?mData.get(position).getTotalChapts():mData.get(position).getFinishedChpats() , mData.get(position).getTotalChapts()));
holder.barProgress.setProgress((int) progress);
float progress = mData.get(position).getFinishedChpats() * 100 / mData.get(position).getTotalChapts();
holder.tvProgress.setText(String.format("%s/%s", mData.get(position).getFinishedChpats() > mData.get(position).getTotalChapts() ? mData.get(position).getTotalChapts() : mData.get(position).getFinishedChpats(), mData.get(position).getTotalChapts()));
holder.barProgress.setProgress((int) progress);
holder.tvStatus.setText( mData.get(position).getDownSatus() == DownloadTask.DownStatus.正在下载 ?"正在下载"
: mData.get(position).getDownSatus() == DownloadTask.DownStatus.暂停下载? "暂停下载" :"休眠中");
holder.tvStatus.setText(mData.get(position).getDownSatus() == DownloadTask.DownStatus.正在下载 ? "正在下载"
: mData.get(position).getDownSatus() == DownloadTask.DownStatus.暂停下载 ? "暂停下载" : "休眠中");
holder.tvStatus.setText( mData.get(position).getStatus()==1 || mData.get(position).getFinishedChpats() >=mData.get(position).getTotalChapts()
? "下载完成" : holder.tvStatus.getText() );
holder.tvStatus.setText(mData.get(position).getStatus() == 1 || mData.get(position).getFinishedChpats() >= mData.get(position).getTotalChapts()
? "下载完成" : holder.tvStatus.getText());
holder.tvStatus.setText( mData.get(position).getDownSatus() == DownloadTask.DownStatus.排队中?"排队中": holder.tvStatus.getText() );
holder.tvStatus.setText(mData.get(position).getDownSatus() == DownloadTask.DownStatus.排队中 ? "排队中" : holder.tvStatus.getText());
int img = R.mipmap.play;
img = mData.get(position).getDownSatus() == DownloadTask.DownStatus.正在下载 ? R.mipmap.pause : R.mipmap.play;
int img = R.mipmap.play;
img = mData.get(position).getDownSatus() == DownloadTask.DownStatus.正在下载 ? R.mipmap.pause : R.mipmap.play;
holder.imgStart.setImageResource( img);
holder.imgStart.setImageResource(img);
holder.imgStart.setEnabled(true);
if( mData.get(position).getStatus()==1|| mData.get(position).getFinishedChpats() >=mData.get(position).getTotalChapts()) {
holder.tvStatus.setText( "下载完成");
holder.imgStart.setEnabled(false);
holder.imgStart.setImageResource( R.mipmap.pause);
if (mData.get(position).getStatus() == 1 || mData.get(position).getFinishedChpats() >= mData.get(position).getTotalChapts()) {
holder.tvStatus.setText("下载完成");
holder.imgStart.setEnabled(false);
holder.imgStart.setImageResource(R.mipmap.pause);
}
@ -380,7 +402,15 @@ public class Activity_cache extends Activity_base {
mData = data;
notifyDataSetChanged();
}
class EmptyViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.tvLoadText)
TextView tvEmpty;
public EmptyViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
}
class MyViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.tvTitle)
TextView tvTitle;

View File

@ -21,6 +21,7 @@ import android.util.Log;
import android.view.Gravity;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
@ -159,6 +160,7 @@ public class BookActivity extends Activity_base {
tvTonglei.setVisibility(View.GONE);
tvAuthorMore.setText( "");
initiDownloadReceiver();
loadNativeBannerAd(mBannerContainer,BuildConfig.AD_SLOT_TOUTIAO_BANNER_NATIVE_ID);
}
@Override
@ -183,7 +185,7 @@ public class BookActivity extends Activity_base {
public final static String EXTRA_BOOK ="book";
@Override
protected void setTitle() {
// getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.book_activity_custom_title);
}
@ -212,6 +214,10 @@ public class BookActivity extends Activity_base {
novelId = mNovel.getNovelId();
this.setTitle(mNovel.getName());
btnCach.setText(R.string.cache_novel);
// ((TextView) findViewById(R.id.left_text)).setText(mNovel.getName());
if(toolbar!=null) {
toolbar.setTitle(mNovel.getName());
}
}
@Override
protected void onNewIntent(Intent intent) {
@ -582,7 +588,7 @@ public class BookActivity extends Activity_base {
@Override
public void onFault(String errorMsg) {
//失败
Toast.makeText(BookActivity.this, "Novel 请求失败:" + errorMsg, Toast.LENGTH_SHORT).show();
Toast.makeText(BookActivity.this, mNovel.getName() +" 加载失败", Toast.LENGTH_SHORT).show();
mNovel = Novel.getNovelBySvrId(novelId);
if (null != mNovel) {
handler.sendEmptyMessage(1);

View File

@ -25,21 +25,30 @@ import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.bumptech.glide.Glide;
import com.bytedance.sdk.openadsdk.AdSlot;
import com.bytedance.sdk.openadsdk.TTAdDislike;
import com.bytedance.sdk.openadsdk.TTAdNative;
import com.bytedance.sdk.openadsdk.TTAppDownloadListener;
import com.bytedance.sdk.openadsdk.TTBannerAd;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.novelbook.android.AD.toutiao.TToast;
import com.novelbook.android.Activity_base;
import com.novelbook.android.Activity_paihangbang;
import com.novelbook.android.Activity_shudan;
import com.novelbook.android.BookActivity;
import com.novelbook.android.BuildConfig;
import com.novelbook.android.Main2Activity;
import com.novelbook.android.R;
import com.novelbook.android.ReadActivity;
import com.novelbook.android.adapter.BookListAdapter;
@ -75,7 +84,7 @@ import butterknife.ButterKnife;
*/
public abstract class BasicFragment extends Fragment {
public static String TAG = BasicFragment.class.getSimpleName();
private static String TAG = BasicFragment.class.getSimpleName();
protected View rootView;
protected int pageNo=1;
protected int pageCount;
@ -91,9 +100,14 @@ public abstract class BasicFragment extends Fragment {
@Nullable
@BindView(R.id.swipeLayout)
SwipeRefreshLayout mSwipeRefresh;
@Nullable
@BindView(R.id.banner_container)
FrameLayout mBannerContainer;
int MSG_INIT_TAB =99;
int error_try=0;
int error_try_max=5;
public BasicFragment() {
// Required empty public constructor
}
@ -126,6 +140,7 @@ public abstract class BasicFragment extends Fragment {
initData();
initViews();
initSwipeRefreshLayout();
showBanner(mBannerContainer,185);
return view;
// Inflate the layout for this fragment
@ -295,6 +310,7 @@ void initTabs(){
// 开始刷新设置当前为刷新状态
//swipeRefreshLayout.setRefreshing(true);
pageNo=1;
error_try=0;
initData();
// TODO 获取数据
@ -409,12 +425,41 @@ void initTabs(){
@Override
public void onResume() {
super.onResume();
MobclickAgent.onPageStart(TAG);
error_try=0;
// MobclickAgent.onPageStart(TAG);
}
@Override
public void onPause(){
super.onPause();
hideProgress();
MobclickAgent.onPageEnd(TAG);
// MobclickAgent.onPageEnd(TAG);
}
void retryErorr(int msg){
if(error_try<error_try_max){
error_try++;
initData();
}else {
handler.sendEmptyMessage(msg);
}
}
void initRetryCnt(){
error_try=0;
}
//---------toutiao ad------
public void showBanner(FrameLayout bannerContainer , int adHeight ) {
if(bannerContainer==null){
return;
}
bannerContainer.setVisibility(View.GONE);
if (!Constants.SHOWAD) {
return;
}
((Main2Activity) activity).loadBannerAd(bannerContainer, BuildConfig.AD_SLOT_TOUTIAO_BANNER_ID, Constants.SCREEN_WIDTH_PIX, adHeight);
mBannerContainer.setVisibility(View.VISIBLE);
}
}

View File

@ -16,6 +16,7 @@ import com.novelbook.android.adapter.MarkAdapter;
import com.novelbook.android.db.BookMarks;
import com.novelbook.android.db.Novel;
import com.novelbook.android.utils.PageFactory;
import com.umeng.analytics.MobclickAgent;
import org.litepal.LitePal;
@ -176,4 +177,15 @@ public class BookMarkFragment extends BasicFragment implements MarkActivity.Sor
public void refresh() {
}
@Override
public void onResume() {
super.onResume();
MobclickAgent.onPageStart(TAG);
}
@Override
public void onPause(){
super.onPause();
MobclickAgent.onPageEnd(TAG);
}
}

View File

@ -24,6 +24,7 @@ import com.novelbook.android.db.DownloadTask;
import com.novelbook.android.db.Novel;
import com.novelbook.android.netutils.NetUtil;
import com.novelbook.android.utils.PageFactory;
import com.umeng.analytics.MobclickAgent;
import org.litepal.LitePal;
@ -285,4 +286,15 @@ public class CatalogFragment extends BasicFragment implements MarkActivity.Sortc
public void refresh() {
refresh(null);
}
@Override
public void onResume() {
super.onResume();
MobclickAgent.onPageStart(TAG);
}
@Override
public void onPause(){
super.onPause();
MobclickAgent.onPageEnd(TAG);
}
}

View File

@ -27,6 +27,7 @@ import com.novelbook.android.netutils.OnSuccessAndFaultListener;
import com.novelbook.android.netutils.OnSuccessAndFaultSub;
import com.novelbook.android.utils.Constants;
import com.novelbook.android.utils.ImageUtil;
import com.umeng.analytics.MobclickAgent;
import org.json.JSONObject;
@ -57,7 +58,8 @@ public class FragmentCates extends BasicFragment {
BookSubscribe.getCates(Constants.SEX,new OnSuccessAndFaultSub(new OnSuccessAndFaultListener() {
@Override
public void onSuccess(String result) {
Log.d(TAG, String.format("init data HttpMethods successed on init, trycnt %s " ,error_try));
error_try =0;
// mFirstPage= gson.fromJson(result, FirstPage.class);
try {
JSONObject jsonObject = new JSONObject(result);
@ -75,8 +77,8 @@ public class FragmentCates extends BasicFragment {
@Override
public void onFault(String errorMsg) {
//失败
Log.d(TAG, "error on get firstpage: " + errorMsg);
handler.sendEmptyMessage(2);
// Log.d(TAG, String.format("init data HttpMethods error on init, trycnt %s " ,error_try ));
retryErorr(2);
}
}, getActivity()));
@ -295,4 +297,17 @@ public class FragmentCates extends BasicFragment {
}
return list;
}
@Override
public void onResume() {
super.onResume();
MobclickAgent.onPageStart(TAG);
}
@Override
public void onPause(){
super.onPause();
MobclickAgent.onPageEnd(TAG);
}
}

View File

@ -19,11 +19,15 @@ import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.androidquery.callback.AQuery2;
import com.novelbook.android.AD.toutiao.TTAdManagerHolder;
import com.novelbook.android.BuildConfig;
import com.novelbook.android.Main2Activity;
import com.novelbook.android.R;
import com.novelbook.android.db.Chapter;
@ -44,6 +48,7 @@ import com.novelbook.android.utils.ImageUtil;
import com.novelbook.android.utils.MyImageLoader;
import com.novelbook.android.utils.OnItemClickListener;
import com.novelbook.android.adapter.BookListAdapter;
import com.umeng.analytics.MobclickAgent;
import org.json.JSONObject;
import org.litepal.LitePal;
@ -64,21 +69,25 @@ import okhttp3.ResponseBody;
public class Fragment_Shelf extends BasicFragment {
public static final String TAG=Fragment_Shelf.class.getSimpleName();
private boolean[] flag ;//此处添加一个boolean类型的数组
private boolean isSelectAll =true;
public static final String TAG = Fragment_Shelf.class.getSimpleName();
private boolean[] flag;//此处添加一个boolean类型的数组
private boolean isSelectAll = true;
private MyImageLoader loader = new MyImageLoader();
@BindView(R.id.llShelfBottom)
LinearLayout llShelfBottom;
@BindView(R.id.id_recyclerview)
RecyclerView mRecyclerView;
// private List<Novel> mDatas;
RecyclerView mRecyclerView;
// private List<Novel> mDatas;
private BookListAdapter mAdapter;
List<Novel> lstUpdate = new ArrayList<Novel>();
private List<Novel> bookLists;
// private ShelfAdapter adapter;
private String noveIds ;
// private ShelfAdapter adapter;
private String noveIds;
BottomSheetDialog bottomSheetDialog;
@BindView(R.id.banner_container)
FrameLayout mBannerContainer;
public Fragment_Shelf() {
// Required empty public constructor
}
@ -92,47 +101,47 @@ public class Fragment_Shelf extends BasicFragment {
return fragment;
}
private void loadNovelsOnShelf(){
private void loadNovelsOnShelf() {
bookLists = Novel.getNovelsOnShelf();
noveIds="";
for(Novel novel:bookLists){
if(novel.isFinished()||novel.isLocalBook() ||novel.isUpdated() ){
noveIds = "";
for (Novel novel : bookLists) {
if (novel.isFinished() || novel.isLocalBook() || novel.isUpdated()) {
continue;
}
noveIds+=novel.getNovelId()+",";
noveIds += novel.getNovelId() + ",";
}
}
void test(int maxAge){
void test(int maxAge) {
String url = "http://xiaoshuofenxiang.com/api/r/need-update";
Request request = new Request.Builder().url(url) // .header("User-Agent", "OkHttp Example")
.removeHeader("Pragma")
.header("Cache-Control", "public, max-age=" + maxAge)
.build();
Request request = new Request.Builder().url(url) // .header("User-Agent", "OkHttp Example")
.removeHeader("Pragma")
.header("Cache-Control", "public, max-age=" + maxAge)
.build();
if (maxAge == -1) {
request = new Request.Builder().url(url).build();
}
HttpMethods.getOkClient().newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
ResponseBody body = response.body();
Log.d(TAG, "onResponse:test " + body.string());
handler.sendEmptyMessage(1);
}
});
if(maxAge==-1){
request = new Request.Builder().url(url) .build();
}
HttpMethods.getOkClient().newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
ResponseBody body = response.body();
Log.d(TAG, "onResponse:test " + body.string());
handler.sendEmptyMessage(1);
}
});
}
@Override
protected int getLayoutRes() {
return R.layout.fragment_fragment__shelf;
@ -141,19 +150,19 @@ void test(int maxAge){
/**
* to get updated info from server,TODO: put it in service ,scheduled
*/
private void getUpdatedData(){
private void getUpdatedData() {
List<Integer> novelIds;
OnSuccessAndFaultListener successAndFaultListener = new OnSuccessAndFaultListener() {
OnSuccessAndFaultListener successAndFaultListener = new OnSuccessAndFaultListener() {
@Override
public void onSuccess(String result) {
// mFirstPage= gson.fromJson(result, FirstPage.class);
try {
lstUpdate = GsonUtil. parserJsonArray(result, Constants.BLOCK_TITLE_NOVELS);
if(lstUpdate.size()>0) {
lstUpdate = GsonUtil.parserJsonArray(result, Constants.BLOCK_TITLE_NOVELS);
if (lstUpdate.size() > 0) {
for (Novel novel2 : lstUpdate) {
novel2.checkAndUpdate();
}
@ -181,12 +190,12 @@ void test(int maxAge){
};
if(TextUtils.isEmpty(noveIds)){
if (TextUtils.isEmpty(noveIds)) {
loadNovelsOnShelf();
}
if(!TextUtils.isEmpty(noveIds)){
BookSubscribe.getNovelsByIds(noveIds , new OnSuccessAndFaultSub(successAndFaultListener, getActivity()));
}else{
if (!TextUtils.isEmpty(noveIds)) {
BookSubscribe.getNovelsByIds(noveIds, new OnSuccessAndFaultSub(successAndFaultListener, getActivity()));
} else {
handler.sendEmptyMessage(1);
}
@ -196,11 +205,11 @@ void test(int maxAge){
public void initData() {
// mDatas = initData(mDatas,'X');
// mDatas = initData(mDatas,'X');
// bookLists = LitePal.where("isOnShelf=? or novelId=? ","1","").find(Novel.class);
// bookLists = LitePal.where("isOnShelf=? or novelId=? ","1","").find(Novel.class);
loadNovelsOnShelf();
// getUpdatedData();
// getUpdatedData();
flag = new boolean[bookLists.size()];
/* if(bookLists.size()>0) { //TODO: to remove
@ -208,10 +217,9 @@ void test(int maxAge){
// bookLists.get(bookLists.size()-1).setUpdated(true);
}*/
mAdapter = new BookListAdapter(activity,bookLists,R.layout.recycle_list_item,new OnItemClickListener()
{
private long lastTimeMillis;
private static final long MIN_CLICK_INTERVAL =1000;
mAdapter = new BookListAdapter(activity, bookLists, R.layout.recycle_list_item, new OnItemClickListener() {
private long lastTimeMillis;
private static final long MIN_CLICK_INTERVAL = 1000;
protected boolean isTimeEnabled() {
long currentTimeMillis = System.currentTimeMillis();
@ -223,26 +231,24 @@ void test(int maxAge){
}
@Override
public void onItemClick(View view, int position)
{
if(isTimeEnabled()) {
public void onItemClick(View view, int position) {
if (isTimeEnabled()) {
Novel book = bookLists.get(position);
openBook(book, mAdapter);
}else{
} else {
Log.d(TAG, "onclickInterval: bad click");
}
}
@Override
public void onItemLongClick(View view, int position)
{
public void onItemLongClick(View view, int position) {
initDialog(position);
// mAdapter.removeData(position);
}
@Override
public void onLinearOutClick(View view, int position ,int llId) {
public void onLinearOutClick(View view, int position, int llId) {
}
});
@ -250,80 +256,84 @@ void test(int maxAge){
mAdapter.setNorecord(R.string.noRecordInshelf);
((Main2Activity) activity).setShelfFragment(this);
((Main2Activity) activity).setShelfFragment(this);
}
@Override
void initSwipeRefreshLayout(){
super.initSwipeRefreshLayout();
void initSwipeRefreshLayout() {
super.initSwipeRefreshLayout();
mSwipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
// 开始刷新设置当前为刷新状态
//swipeRefreshLayout.setRefreshing(true);
pageNo=1;
pageNo = 1;
getUpdatedData();
// TODO 获取数据
}
});
}
@Override
public void initViews(){
public void initViews() {
initReceyleView();
}
protected void processArguments(){
if (getArguments() != null) {
Bundle bundle = getArguments() ;
}
protected void processArguments() {
if (getArguments() != null) {
Bundle bundle = getArguments();
}
}
@Override
protected void fillData() {
protected void fillData() {
mAdapter.setData(bookLists);
}
public void initReceyleView() {
// initData();
// mRecyclerView.setLayoutManager(new LinearLayoutManager(this.activity));
mRecyclerView.setLayoutManager(new GridLayoutManager(activity,3));
mRecyclerView.setAdapter(mAdapter );
llShelfBottom.setVisibility(View.GONE);
public void initReceyleView() {
// initData();
// mRecyclerView.setLayoutManager(new LinearLayoutManager(this.activity));
mRecyclerView.setLayoutManager(new GridLayoutManager(activity, 3));
mRecyclerView.setAdapter(mAdapter);
llShelfBottom.setVisibility(View.GONE);
}
}
public void showShelfMoreSheet() {
BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this.activity );
BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this.activity);
bottomSheetDialog.setContentView(R.layout.fragment_shelf_more_sheet);
//给布局设置透明背景色
bottomSheetDialog.getDelegate().findViewById(android.support.design.R.id.design_bottom_sheet)
.setBackgroundColor(getResources().getColor(android.R.color.transparent));
Button btnZhengli = bottomSheetDialog.findViewById(R.id.btnZhengli);
btnZhengli.setOnClickListener(new View.OnClickListener() {
btnZhengli.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
bottomSheetDialog.dismiss();
initZhengliDialog();
initZhengliDialog();
}
});
Button btnImport = bottomSheetDialog.findViewById(R.id.btnImport);
btnImport.setOnClickListener(new View.OnClickListener() {
Button btnImport = bottomSheetDialog.findViewById(R.id.btnImport);
btnImport.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
bottomSheetDialog.dismiss();
Intent intent = new Intent(activity, FileChooserActivity.class);
startActivityForResult(intent, Activity.RESULT_FIRST_USER);
// startActivity(intent);
// startActivity(intent);
}
});
Button btnCancel = bottomSheetDialog.findViewById(R.id.btnCancel);
btnCancel.setOnClickListener(new View.OnClickListener() {
btnCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
bottomSheetDialog.dismiss();
@ -331,13 +341,13 @@ void test(int maxAge){
});
bottomSheetDialog.show();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data){
// bookLists = LitePal.findAll(Novel.class);
// mAdapter.notifyDataSetChanged();
public void onActivityResult(int requestCode, int resultCode, Intent data) {
// bookLists = LitePal.findAll(Novel.class);
// mAdapter.notifyDataSetChanged();
initViews();
}
@ -359,84 +369,80 @@ void test(int maxAge){
TextView tvLatest = (TextView) bottomSheetDialog.findViewById(R.id.txtLatestUpdate);
tvLatestChapt.setText(bookLists.get(position).getChapterName());
tvLatest.setText(CommonUtil.getDateString( bookLists.get(position).getLastUpdateTime()) );
}else{
tvLatest.setText(CommonUtil.getDateString(bookLists.get(position).getLastUpdateTime()));
} else {
tvLatestChapt.setText("本地导入");
tvAuthor.setText("");
}
ImageView imageView = (ImageView) bottomSheetDialog.findViewById(R.id.imageG1);
ImageUtil.loadImage(activity,bookLists.get(position).getCover(),imageView);
ImageUtil.loadImage(activity, bookLists.get(position).getCover(), imageView);
LinearLayout lldetail=(LinearLayout) bottomSheetDialog.findViewById(R.id.llBookdetail);
if(!bookLists.get(position).isLocalBook())
lldetail.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
showBookDetail(bookLists.get(position));
}
});
TextView tvCache =(TextView) bottomSheetDialog.findViewById(R.id.tvCache);
LinearLayout lldetail = (LinearLayout) bottomSheetDialog.findViewById(R.id.llBookdetail);
if (!bookLists.get(position).isLocalBook())
lldetail.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
showBookDetail(bookLists.get(position));
}
});
TextView tvCache = (TextView) bottomSheetDialog.findViewById(R.id.tvCache);
tvCache.setText(FileUtils.getCacheSizeK(bookLists.get(position).getId()));
tvCache.setText(FileUtils.getCacheSizeK(bookLists.get(position).getId()));
if(!bookLists.get(position).isLocalBook()) {
LinearLayout llClearCache = (LinearLayout) bottomSheetDialog.findViewById(R.id.llClearCache);
if (!bookLists.get(position).isLocalBook()) {
LinearLayout llClearCache = (LinearLayout) bottomSheetDialog.findViewById(R.id.llClearCache);
llClearCache.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
FileUtils.clearChapterCache(bookLists.get(position).getId());
long size = FileUtils.getCacheSize(bookLists.get(position).getId());
size = size / 1024;
tvCache.setText(String.format("%sK", size));
Toast.makeText(activity, "缓存清除成功", Toast.LENGTH_SHORT);
llClearCache.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
FileUtils.clearChapterCache(bookLists.get(position).getId());
long size = FileUtils.getCacheSize(bookLists.get(position).getId());
size = size / 1024;
tvCache.setText(String.format("%sK", size));
Toast.makeText(activity, "缓存清除成功", Toast.LENGTH_SHORT);
}
});
}else{
TextView tvClearCache = (TextView) bottomSheetDialog.findViewById(R.id.tvClearCache);
tvClearCache.setText("导入文本");
}
}
});
} else {
TextView tvClearCache = (TextView) bottomSheetDialog.findViewById(R.id.tvClearCache);
tvClearCache.setText("导入文本");
}
LinearLayout lltop =(LinearLayout) bottomSheetDialog.findViewById(R.id.llTop);
TextView tvTop =(TextView) bottomSheetDialog.findViewById(R.id.tvTop);
ImageView imgTop =(ImageView) bottomSheetDialog.findViewById(R.id.imageTop);
if( bookLists.get(position).isTop()){
LinearLayout lltop = (LinearLayout) bottomSheetDialog.findViewById(R.id.llTop);
TextView tvTop = (TextView) bottomSheetDialog.findViewById(R.id.tvTop);
ImageView imgTop = (ImageView) bottomSheetDialog.findViewById(R.id.imageTop);
if (bookLists.get(position).isTop()) {
tvTop.setText("取消置顶");
imgTop.setImageResource(R.mipmap.star_inactive);
}else{
} else {
tvTop.setText("置顶显示");
imgTop.setImageResource(R.mipmap.star_active);
}
lltop.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if( bookLists.get(position).isTop()){
bookLists.get(position).setToDefault("isTop");
tvTop.setText("置顶显示");
imgTop.setImageResource(R.mipmap.star_active);
if (bookLists.get(position).isTop()) {
bookLists.get(position).setToDefault("isTop");
tvTop.setText("置顶显示");
imgTop.setImageResource(R.mipmap.star_active);
}else{
bookLists.get(position).setTop(true);
tvTop.setText("取消置顶");
imgTop.setImageResource(R.mipmap.star_inactive);
}
} else {
bookLists.get(position).setTop(true);
tvTop.setText("取消置顶");
imgTop.setImageResource(R.mipmap.star_inactive);
}
bookLists.get(position).update( bookLists.get(position).getId());
bookLists.get(position).update(bookLists.get(position).getId());
loadNovelsOnShelf();
mAdapter.setData(bookLists);
//Toast.makeText(activity,"缓存清除成功",Toast.LENGTH_SHORT);
//Toast.makeText(activity,"缓存清除成功",Toast.LENGTH_SHORT);
}
});
bottomSheetDialog.show();
}
@ -445,35 +451,33 @@ void test(int maxAge){
@BindView(R.id.btnSelect)
Button btnSelectAll;
@OnClick({R.id.btnSelect,R.id.btnDelete})
void shelfZhengliSubmit(View view){
if(view.getId()== R.id.btnSelect) {
@OnClick({R.id.btnSelect, R.id.btnDelete})
void shelfZhengliSubmit(View view) {
if (view.getId() == R.id.btnSelect) {
if(isSelectAll) {
if (isSelectAll) {
btnSelectAll.setText("全不选");
}else
{
} else {
btnSelectAll.setText("全选");
}
for (int i = 0; i < flag.length; i++) {
for (int i = 0; i < flag.length; i++) {
flag[i] = isSelectAll;
}
isSelectAll =!isSelectAll;
isSelectAll = !isSelectAll;
mChkAdapter.notifyDataSetChanged();
}else if(view.getId()== R.id.btnDelete){
} else if (view.getId() == R.id.btnDelete) {
List<Integer> toRemove = new ArrayList<Integer>();
for (int i = 0; i < bookLists.size(); i++) {
if(flag[i] ){
Novel nv = bookLists.get(i);
if(nv.isLocalBook())
{
if (flag[i]) {
Novel nv = bookLists.get(i);
if (nv.isLocalBook()) {
nv.delete();
LitePal.deleteAllAsync(Chapter.class,"novelId=?",nv.getId()+"");
LitePal.deleteAllAsync(Chapter.class, "novelId=?", nv.getId() + "");
//TODO: remove cache on a new thread
FileUtils.clearChapterCache(nv.getId());
}else{
FileUtils.clearChapterCache(nv.getId());
} else {
Log.d(TAG, "shelfZhengliSubmit: to delete novel " + nv.getName());
nv.setToDefault("isOnShelf");
nv.setToDefault("isTop");
@ -482,8 +486,8 @@ void test(int maxAge){
// nv.update(nv.getId()); //not work,,,If you set a default value to a field, the corresponding column won't be updated.
}
// flag = new boolean[bookLists.size()];
// bookLists.remove(i);
// flag = new boolean[bookLists.size()];
// bookLists.remove(i);
}
}
@ -494,60 +498,47 @@ void test(int maxAge){
}
}
*/
bookLists =Novel.getNovelsOnShelf();
bookLists = Novel.getNovelsOnShelf();
flag = new boolean[bookLists.size()];
zhengliShelf();
initData();
// mChkAdapter.notifyDataSetChanged();
// mChkAdapter.notifyDataSetChanged();
}
}
private void initZhengliDialog( ) {
private void initZhengliDialog() {
zhengliShelf();
llShelfBottom.setVisibility(View.VISIBLE);
Main2Activity main2Activity = (Main2Activity)activity;
Main2Activity main2Activity = (Main2Activity) activity;
main2Activity.switchShelfZhengli(false);
}
@Override
public void onResume() {
super.onResume();
getUpdatedData(); //TODO: 更新书的状态是不有更新
if(bottomSheetDialog!=null){
bottomSheetDialog.hide();
}
}
CheckAdapter mChkAdapter;
CheckAdapter mChkAdapter;
void zhengliShelf(){
mChkAdapter = new CheckAdapter(activity,bookLists,R.layout.recycle_list_item,new OnItemClickListener()
{
void zhengliShelf() {
mChkAdapter = new CheckAdapter(activity, bookLists, R.layout.recycle_list_item, new OnItemClickListener() {
@Override
public void onItemClick(View view, int position)
{
public void onItemClick(View view, int position) {
}
@Override
public void onItemLongClick(View view, int position)
{
public void onItemLongClick(View view, int position) {
}
@Override
public void onLinearOutClick(View view, int position ,int llId) {
public void onLinearOutClick(View view, int position, int llId) {
}
});
mRecyclerView.setLayoutManager(new GridLayoutManager(activity,3));
mRecyclerView.setAdapter(mChkAdapter );
mRecyclerView.setLayoutManager(new GridLayoutManager(activity, 3));
mRecyclerView.setAdapter(mChkAdapter);
}
@ -563,12 +554,14 @@ void test(int maxAge){
private List<Novel> mDatas = new ArrayList<Novel>();
private OnItemClickListener mOnItemClickListener;
private int listItemID;
public CheckAdapter(Context context,List<Novel> mDatas,int listItemID,OnItemClickListener clickLitener) {
public CheckAdapter(Context context, List<Novel> mDatas, int listItemID, OnItemClickListener clickLitener) {
this.context = context;
this.mDatas = mDatas;
this.mOnItemClickListener = clickLitener;
this.listItemID = listItemID;
}
public CheckAdapter(Context context, OnItemClickListener clickLitener) {
this.context = context;
this.mOnItemClickListener = clickLitener;
@ -577,9 +570,9 @@ void test(int maxAge){
@Override
public int getItemViewType(int position) {
if(mDatas.size() == 0){
if (mDatas.size() == 0) {
return EMPTY_VIEW;
} else if(mDatas.get(position) == null){
} else if (mDatas.get(position) == null) {
return PROGRESS_VIEW;
} else {
return super.getItemViewType(position);
@ -587,8 +580,7 @@ void test(int maxAge){
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
MyViewHolder holder = new MyViewHolder(LayoutInflater.from(
context).inflate(listItemID, parent,
false));
@ -596,60 +588,51 @@ void test(int maxAge){
}
public void setParameters(List<Novel> mDatas,int listItemID ) {
public void setParameters(List<Novel> mDatas, int listItemID) {
this.mDatas = mDatas;
this.listItemID = listItemID;
}
public void setOnItemClickLitener(OnItemClickListener mOnItemClickLitener)
{
public void setOnItemClickLitener(OnItemClickListener mOnItemClickLitener) {
this.mOnItemClickListener = mOnItemClickLitener;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position)
{
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.tvTitle.setText(mDatas.get(position).getName());
if(holder.tvAuthor!=null) holder.tvAuthor.setText(mDatas.get(position).getAuthor());
if(holder.tvCate!=null) holder.tvCate.setText(mDatas.get(position).getNovelType());
if(holder.tvDesc!=null) holder.tvDesc.setText(mDatas.get(position).getDesc ());
if(holder.checkBox!=null) holder.checkBox.setVisibility(View.VISIBLE);
if (holder.tvAuthor != null) holder.tvAuthor.setText(mDatas.get(position).getAuthor());
if (holder.tvCate != null) holder.tvCate.setText(mDatas.get(position).getNovelType());
if (holder.tvDesc != null) holder.tvDesc.setText(mDatas.get(position).getDesc());
if (holder.checkBox != null) holder.checkBox.setVisibility(View.VISIBLE);
if (holder.imageView != null && !TextUtils.isEmpty(mDatas.get(position).getCover())) {
loader.displayImage(context, NetUtil.getCoverUrl(mDatas.get(position).getCover()) ,holder.imageView);
loader.displayImage(context, NetUtil.getCoverUrl(mDatas.get(position).getCover()), holder.imageView);
}
if( mDatas.get(position).isTop()){
if (mDatas.get(position).isTop()) {
holder.imageTop.setVisibility(View.VISIBLE);
}else{
} else {
holder.imageTop.setVisibility(View.GONE);
}
// 如果设置了回调则设置点击事件
if (mOnItemClickListener != null)
{
if (mOnItemClickListener != null) {
holder.checkBox.setOnCheckedChangeListener(null);//先设置一次CheckBox的选中监听器传入参数null
holder.checkBox.setChecked(flag[position]);//用数组中的值设置CheckBox的选中状态
holder.itemView.setOnClickListener(new View.OnClickListener()
{
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
holder.checkBox.setChecked( !holder.checkBox.isChecked());
public void onClick(View v) {
holder.checkBox.setChecked(!holder.checkBox.isChecked());
}
});
holder.itemView.setOnLongClickListener(new View.OnLongClickListener()
{
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v)
{
public boolean onLongClick(View v) {
return false;
}
});
//再设置一次CheckBox的选中监听器当CheckBox的选中状态发生改变时把改变后的状态储存在数组中
holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
@ -662,12 +645,12 @@ void test(int maxAge){
}
@Override
public int getItemCount()
{
public int getItemCount() {
return mDatas.size();
}
public void addData(int position) {
// mDatas.add(position, "Insert One");
// mDatas.add(position, "Insert One");
notifyItemInserted(position);
}
@ -675,8 +658,8 @@ void test(int maxAge){
mDatas.remove(position);
notifyItemRemoved(position);
}
class MyViewHolder extends RecyclerView.ViewHolder
{
class MyViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.id_check_box)
CheckBox checkBox;
@BindView(R.id.imageView)
@ -695,8 +678,8 @@ void test(int maxAge){
@Nullable
@BindView(R.id.desc)
TextView tvDesc;
public MyViewHolder(View view)
{
public MyViewHolder(View view) {
super(view);
ButterKnife.bind(this, view);
//tvTitle = (TextView) view.findViewById(R.id.title);
@ -706,4 +689,30 @@ void test(int maxAge){
}
}
@Override
public void onResume() {
super.onResume();
getUpdatedData(); //TODO: 更新书的状态是不有更新
if (bottomSheetDialog != null) {
bottomSheetDialog.hide();
}
MobclickAgent.onPageStart(TAG);
}
@Override
public void onPause() {
super.onPause();
MobclickAgent.onPageEnd(TAG);
}
//----------toutiao ad
}

View File

@ -19,6 +19,7 @@ import com.novelbook.android.adapter.BandanAdapter;
import com.novelbook.android.utils.Constants;
import com.novelbook.android.utils.GsonUtil;
import com.novelbook.android.utils.OnItemClickListener;
import com.umeng.analytics.MobclickAgent;
import java.util.ArrayList;
import java.util.Arrays;
@ -123,7 +124,8 @@ public class Fragment_bangdan extends BasicFragment {
BookSubscribe.getPaihangBangByCate( Constants.SEX,cid,new OnSuccessAndFaultSub(new OnSuccessAndFaultListener() {
@Override
public void onSuccess(String result) {
Log.d(TAG, String.format("init data HttpMethods successed on init, trycnt %s " ,error_try));
error_try =0;
// mFirstPage= gson.fromJson(result, FirstPage.class);
try {
mMoreBlocks = GsonUtil.parserNovleBlocks(result,"ranks");
@ -138,8 +140,14 @@ public class Fragment_bangdan extends BasicFragment {
@Override
public void onFault(String errorMsg) {
//失败
Log.d(TAG, "error on : " + errorMsg);
handler.sendEmptyMessage(1);
Log.d(TAG, String.format("init data HttpMethods error on init, trycnt %s " ,error_try ));
if(error_try<error_try_max){
error_try++;
initData();
}else {
handler.sendEmptyMessage(1);
}
}
}, getActivity()));
@ -166,6 +174,15 @@ public class Fragment_bangdan extends BasicFragment {
public void setFTag() {
}
@Override
public void onResume() {
super.onResume();
MobclickAgent.onPageStart(TAG);
}
@Override
public void onPause(){
super.onPause();
MobclickAgent.onPageEnd(TAG);
}
}

View File

@ -15,6 +15,7 @@ import com.novelbook.android.netutils.OnSuccessAndFaultListener;
import com.novelbook.android.netutils.OnSuccessAndFaultSub;
import com.novelbook.android.utils.Constants;
import com.novelbook.android.utils.GsonUtil;
import com.umeng.analytics.MobclickAgent;
import java.util.ArrayList;
import java.util.List;
@ -157,6 +158,8 @@ public class Fragment_bangdans extends BasicFragment {
BookSubscribe.getPaihangBangCateList(Constants.SEX,new OnSuccessAndFaultSub(new OnSuccessAndFaultListener() {
@Override
public void onSuccess(String result) {
Log.d(TAG, String.format("init data HttpMethods successed on init, trycnt %s " ,error_try));
error_try =0;
try {
mCateList = GsonUtil.parserBangdanCate(result,"subCategories");
@ -174,12 +177,21 @@ public class Fragment_bangdans extends BasicFragment {
@Override
public void onFault(String errorMsg) {
//失败
Log.d(TAG, "error on get firstpage: " + errorMsg);
// Log.d(TAG, String.format("init data HttpMethods error on init, trycnt %s " ,error_try ));
// getSearchTabTtitle();
handler.sendEmptyMessage(0);
retryErorr(0);
}
},getActivity()));
}
@Override
public void onResume() {
super.onResume();
MobclickAgent.onPageStart(TAG);
}
@Override
public void onPause(){
super.onPause();
MobclickAgent.onPageEnd(TAG);
}
}

View File

@ -10,6 +10,7 @@ import android.view.View;
import com.novelbook.android.R;
import com.flyco.tablayout.SlidingTabLayout;
import com.umeng.analytics.MobclickAgent;
import java.util.ArrayList;
@ -28,7 +29,7 @@ public class Fragment_bookStore extends BasicFragment {
SlidingTabLayout tabLayout;
private FragmentStatePagerAdapter mAdapter =null;
private ArrayList<BasicFragment> mFragments;
private ArrayList<BasicFragment> mFragments_cp;
// private ArrayList<BasicFragment> mFragments_cp;
ArrayList<View> mList;
String[] mTitle;
Fragment_jingxuan fragment_jingxuan;
@ -111,8 +112,8 @@ public class Fragment_bookStore extends BasicFragment {
mFragments.add(fragment_jingxuan);
mFragments.add(fragmentCates);
mFragments.add(fragment_bangdans);
mFragments_cp = new ArrayList<>();
mFragments_cp.addAll(mFragments);
// mFragments_cp = new ArrayList<>();
// mFragments_cp.addAll(mFragments);
// mFragments.add(new Fragment_shudan());
Log.d(TAG,"initial fragments in tabs ");
}
@ -144,7 +145,16 @@ public class Fragment_bookStore extends BasicFragment {
}
@Override
public void onResume() {
super.onResume();
MobclickAgent.onPageStart(TAG);
}
@Override
public void onPause(){
super.onPause();
MobclickAgent.onPageEnd(TAG);
}

View File

@ -30,6 +30,7 @@ import com.novelbook.android.utils.Constants;
import com.novelbook.android.utils.GsonUtil;
import com.novelbook.android.utils.OnItemClickListener;
import com.novelbook.android.adapter.BookListAdapter;
import com.umeng.analytics.MobclickAgent;
import org.json.JSONObject;
import org.litepal.LitePal;
@ -379,6 +380,12 @@ public class Fragment_booklist extends BasicFragment {
initData();
}
}
MobclickAgent.onPageStart(TAG);
}
@Override
public void onPause(){
super.onPause();
MobclickAgent.onPageEnd(TAG);
}
}

View File

@ -42,6 +42,7 @@ import com.novelbook.android.utils.ImageUtil;
import com.novelbook.android.utils.MyViewPager;
import com.novelbook.android.utils.OnItemClickListener;
import com.novelbook.android.adapter.BookListAdapter;
import com.umeng.analytics.MobclickAgent;
import com.youth.banner.Banner;
import com.youth.banner.BannerConfig;
import com.youth.banner.Transformer;
@ -156,7 +157,8 @@ public class Fragment_jingxuan extends BasicFragment implements OnBannerListener
BookSubscribe.getFirstPage(Constants.SEX,new OnSuccessAndFaultSub(new OnSuccessAndFaultListener() {
@Override
public void onSuccess(String result) {
Log.d(TAG, String.format("init data HttpMethods successed on init, trycnt %s " ,error_try));
error_try=0;
// mFirstPage= gson.fromJson(result, FirstPage.class);
try {
@ -171,8 +173,8 @@ public class Fragment_jingxuan extends BasicFragment implements OnBannerListener
@Override
public void onFault(String errorMsg) {
//失败
Log.d(TAG, "error on get firstpage: " + errorMsg);
handler.sendEmptyMessage(1);
// Log.d(TAG, String.format("init data HttpMethods error on init, trycnt %s " ,error_try ));
retryErorr(1);
}
}, getActivity()));
@ -276,6 +278,7 @@ public class Fragment_jingxuan extends BasicFragment implements OnBannerListener
@Override
public void initViews() {
gridItemSpace = getResources().getDimensionPixelSize(R.dimen._10dp);
}
@ -659,5 +662,14 @@ public class Fragment_jingxuan extends BasicFragment implements OnBannerListener
}
}
@Override
public void onResume() {
super.onResume();
MobclickAgent.onPageStart(TAG);
}
@Override
public void onPause(){
super.onPause();
MobclickAgent.onPageEnd(TAG);
}
}

View File

@ -10,6 +10,7 @@ import android.widget.TextView;
import com.novelbook.android.R;
import com.novelbook.android.db.Novel;
import com.umeng.analytics.MobclickAgent;
import java.util.List;
@ -133,5 +134,14 @@ public class Fragment_jingxuan_tuijian extends BasicFragment {
}
@Override
public void onResume() {
super.onResume();
MobclickAgent.onPageStart(TAG);
}
@Override
public void onPause(){
super.onPause();
MobclickAgent.onPageEnd(TAG);
}
}

View File

@ -30,6 +30,7 @@ import com.novelbook.android.utils.OnItemClickListener;
import com.novelbook.android.adapter.BookListAdapter;
import com.flyco.tablayout.CommonTabLayout;
import com.flyco.tablayout.listener.CustomTabEntity;
import com.umeng.analytics.MobclickAgent;
import org.json.JSONArray;
import org.json.JSONObject;
@ -186,7 +187,8 @@ public static final String TAG = Fragment_paihang.class.getSimpleName();
OnSuccessAndFaultListener successAndFaultListener = new OnSuccessAndFaultListener() {
@Override
public void onSuccess(String result) {
error_try=0;
Log.d(TAG, String.format("init data HttpMethods successed on init, trycnt %s " ,error_try));
// mFirstPage= gson.fromJson(result, FirstPage.class);
try {
JSONObject jsonObject = new JSONObject(result);
@ -204,8 +206,10 @@ public static final String TAG = Fragment_paihang.class.getSimpleName();
@Override
public void onFault(String errorMsg) {
//失败
Log.d(TAG, "error on get firstpage: " + errorMsg);
handler.sendEmptyMessage(1);
// Log.d(TAG, String.format("init data HttpMethods error on init, trycnt %s " ,error_try ));
// getSearchTabTtitle();
retryErorr(0);
}
};
showProgressDialog(false, "正在加载...");
@ -402,13 +406,6 @@ public static final String TAG = Fragment_paihang.class.getSimpleName();
//------------滑动监听
@Override
public void onResume() {
super.onResume();
//mNestedScrollView.smoothScrollBy(1,1);
// tvHint.setVisibility(isShowHint? View.VISIBLE:View.GONE);
// tmp=0;
}
@Override
@ -417,5 +414,14 @@ public static final String TAG = Fragment_paihang.class.getSimpleName();
}
@Override
public void onResume() {
super.onResume();
MobclickAgent.onPageStart(TAG);
}
@Override
public void onPause(){
super.onPause();
MobclickAgent.onPageEnd(TAG);
}
}

View File

@ -15,6 +15,7 @@ import com.novelbook.android.Activity_createShudan;
import com.novelbook.android.Activity_shudan_my;
import com.novelbook.android.R;
import com.flyco.tablayout.SlidingTabLayout;
import com.umeng.analytics.MobclickAgent;
import java.util.ArrayList;
@ -181,5 +182,14 @@ public class Fragment_shudan extends BasicFragment {
if( bottomSheetDialog !=null ){
bottomSheetDialog.dismiss();
}
MobclickAgent.onPageStart(TAG);
}
@Override
public void onPause(){
super.onPause();
MobclickAgent.onPageEnd(TAG);
}
}

View File

@ -13,6 +13,7 @@ import com.novelbook.android.db.Novel;
import com.novelbook.android.db.BookDan;
import com.novelbook.android.utils.OnItemClickListener;
import com.novelbook.android.adapter.BookListAdapter;
import com.umeng.analytics.MobclickAgent;
import java.util.ArrayList;
import java.util.List;
@ -109,13 +110,8 @@ public class Fragment_shudan_list extends BasicFragment {
initialBookList();
}
@Override
public void onResume() {
super.onResume();
}
@Override
public void onAttach(Context context) {
super.onAttach(context);

View File

@ -13,6 +13,7 @@ import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.widget.AppCompatSpinner;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
@ -23,6 +24,7 @@ import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.WindowManager;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
@ -46,6 +48,7 @@ import com.novelbook.android.utils.PageFactory;
import org.json.JSONObject;
import org.litepal.util.Const;
import java.util.Date;
@ -97,6 +100,13 @@ public class Main2Activity extends Activity_base
initialSexOption();
// checkUpdate(true);
CommonUtil.getSearchTabTtitle(this);
DisplayMetrics metric = new DisplayMetrics();
WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
wm.getDefaultDisplay().getMetrics(metric);
Constants.SCREEN_WIDTH_PIX = metric.widthPixels;
// mHeight = metric.heightPixels;
// mHeight = CommonUtil.getDpi(context);
Constants.SCREEN_HEIGHT_PIX = CommonUtil.getScreenHeight(this) - CommonUtil.statusBarDiff(this);
}
@ -249,38 +259,8 @@ public class Main2Activity extends Activity_base
}
/* @Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}*/
/* @Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
if(id==R.id.menuSearch){
Intent intent = new Intent(this,Activity_Search.class);
startActivity(intent);
}
return super.onOptionsItemSelected(item);
}*/
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {

View File

@ -40,10 +40,10 @@ public class MarkActivity extends Activity_base {
SlidingTabLayout tabLayout;
// @Bind(R.id.lv_catalogue)
// ListView lv_catalogue;
@BindView(R.id.btnSort)
/*@BindView(R.id.btnSort)
ImageButton ibSort;
@BindView(R.id.btnRefresh)
ImageButton btnRefresh;
ImageButton btnRefresh;*/
private PageFactory pageFactory;
@ -60,12 +60,20 @@ public class MarkActivity extends Activity_base {
@Override
protected void initViews() {
if(getFactory().getNovle().isLocalBook()) {
/* if(getFactory().getNovle().isLocalBook()) {
// btnRefresh.setEnabled(false);
btnRefresh.setVisibility(View.GONE);
}
}*/
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
Log.e(TAG, "onPrepareOptionsMenu");
if(getFactory().getNovle().isLocalBook()) {
// btnRefresh.setEnabled(false);
menu.findItem(R.id.action_refresh).setVisible(false);
}
return super.onPrepareOptionsMenu(menu);
}
@Override
protected void setTitle() {
@ -107,7 +115,7 @@ public class MarkActivity extends Activity_base {
protected void initListener() {
}
@OnClick({R.id.btnSort,R.id.btnRefresh})
/*@OnClick({R.id.btnSort,R.id.btnRefresh})
void Onclick(View view){
if(view.getId() == R.id.btnSort){
Log.d(TAG, "Onclick: sorted");
@ -131,7 +139,7 @@ public class MarkActivity extends Activity_base {
}}
}
}
}*/
private Sortcat sortcat=null;
private Sortmark sortmark=null;
@ -176,6 +184,25 @@ public class MarkActivity extends Activity_base {
intent.putExtra(Activity_ChgSource.EXTR_cate,true);
startActivity(intent);
finish();
}else
if (id == R.id.action_sort) {
Log.d(TAG, "Onclick: sorted");
if(sortcat!=null){
sortcat.sortList();
}
if(sortmark!=null){
sortmark.sortList();
}
}else
if (id == R.id.action_refresh) {
if(sortcat!=null){
sortcat.refresh();
}
if(sortmark!=null){
sortmark.refresh();
}
}
return super.onOptionsItemSelected(item);
}

View File

@ -5,6 +5,10 @@ import android.app.Application;
import android.content.Context;
import android.util.Log;
import com.bytedance.sdk.openadsdk.TTAdConfig;
import com.bytedance.sdk.openadsdk.TTAdConstant;
import com.bytedance.sdk.openadsdk.TTAdSdk;
import com.novelbook.android.AD.toutiao.TTAdManagerHolder;
import com.novelbook.android.netutils.HttpMethods;
import com.novelbook.android.netutils.NetUtil;
import com.novelbook.android.utils.Config;
@ -36,14 +40,23 @@ public class MyApp extends Application {
LogcatHelper.getInstance(this).start();
// BlurKit.init(this);
LitePal.initialize(this);
// splashAdManager = new SplashAdManager(this);
initApi();
splashAdManager = new SplashAdManager(this);
initUmengApi();
initAD();
}
public void initApi(){
private void initUmengApi(){
UMConfigure.init(applicationContext,UMConfigure.DEVICE_TYPE_PHONE,null);
MobclickAgent.setPageCollectionMode(MobclickAgent.PageMode.AUTO);
}
private void initAD(){
initAD_ChuanShanJia();
}
private void initAD_ChuanShanJia(){
TTAdManagerHolder.init(applicationContext);
}
public boolean exit() {
System.exit(-1);
@ -60,6 +73,8 @@ public class MyApp extends Application {
oList.add(activity);//把当前Activity添加到集合中
}
}
/**
* 销毁单个Activity
*/
@ -82,4 +97,8 @@ public class MyApp extends Application {
}
}
public List<Activity> getActivityList(){
return oList;
}
}

View File

@ -18,21 +18,37 @@ import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Display;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import com.androidquery.callback.AQuery2;
import com.androidquery.callback.ImageOptions;
import com.bytedance.sdk.openadsdk.AdSlot;
import com.bytedance.sdk.openadsdk.TTAdConstant;
import com.bytedance.sdk.openadsdk.TTAdDislike;
import com.bytedance.sdk.openadsdk.TTAdNative;
import com.bytedance.sdk.openadsdk.TTAppDownloadListener;
import com.bytedance.sdk.openadsdk.TTBannerAd;
import com.bytedance.sdk.openadsdk.TTImage;
import com.bytedance.sdk.openadsdk.TTNativeAd;
import com.novelbook.android.AD.SplashAdManager;
import com.novelbook.android.AD.toutiao.TTAdManagerHolder;
import com.novelbook.android.AD.toutiao.TToast;
import com.novelbook.android.db.Chapter;
import com.novelbook.android.db.Novel;
import com.novelbook.android.db.BookMarks;
@ -52,6 +68,7 @@ import org.litepal.LitePal;
import java.io.IOException;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@ -106,8 +123,8 @@ public class ReadActivity extends Activity_base implements AdInterface {
@BindView(R.id.appbar)
AppBarLayout appbar;
@BindView(R.id.llTopAd)
LinearLayout llTopAd;
// @BindView(R.id.banner_container)
// FrameLayout mBannerContainer;
@BindView(R.id.imgLoading)
pl.droidsonroids.gif.GifImageView imgLoading;
@ -151,7 +168,7 @@ public class ReadActivity extends Activity_base implements AdInterface {
@Override
protected void initViews() {
}
@Override
@ -179,7 +196,7 @@ public class ReadActivity extends Activity_base implements AdInterface {
pageFactory = PageFactory.getInstance(getApplicationContext());
pageFactory.clear();
pageFactory.setAd(this);
llTopAd.setVisibility(View.GONE);
mBannerContainer.setVisibility(View.GONE);
// showProgress (false,"读取目录信息");
/* int slept = 0;
@ -406,6 +423,7 @@ public class ReadActivity extends Activity_base implements AdInterface {
}
pageFactory.prePage();
SplashAdManager.plusPage(ReadActivity.this);
if (pageFactory.isfirstPage() || !pageFactory.isReady()) {
return false;
}
@ -426,6 +444,7 @@ public class ReadActivity extends Activity_base implements AdInterface {
}
pageFactory.nextPage();
SplashAdManager.plusPage(ReadActivity.this);
if (pageFactory.islastPage() || !pageFactory.isReady()) {
return false;
}
@ -489,7 +508,7 @@ public class ReadActivity extends Activity_base implements AdInterface {
}*/
hideReadSetting();
pageFactory.updateTime();
}
@ -891,7 +910,7 @@ public class ReadActivity extends Activity_base implements AdInterface {
@OnClick({R.id.tv_progress, R.id.rl_progress, R.id.tv_pre, R.id.sb_progress, R.id.tv_next, R.id.tv_directory,
R.id.tv_dayornight,R.id.tv_pagemode, R.id.tv_setting, R.id.bookpop_bottom, /*R.id.rl_bottom,*/R.id.tv_stop_read
,R.id.llTopAd,R.id.btnRefresh})
,R.id.btnRefresh})
public void onClick(View view) {
pageFactory.setPageWidget(bookpage);
// if( pageFactory.isReady())
@ -943,11 +962,11 @@ public class ReadActivity extends Activity_base implements AdInterface {
isSpeaking = false;
hideReadSetting();
}*/
case R.id.llTopAd:
/* case R.id.mBannerContainer:
Toast.makeText(this,"ad is clicked ",Toast.LENGTH_LONG).show();
Log.d(TAG,"Ad is clicked");
break;
break;*/
case R.id.btnRefresh:
pageFactory.retryChapt(pageFactory.getCurrentChapter());
btnRefresh.setVisibility(View.GONE);
@ -976,13 +995,13 @@ public class ReadActivity extends Activity_base implements AdInterface {
final int contentAdHight=350;
final int contentAdHight=100;
@Override
public void showAd(boolean showAd ,int adHeight,int adY) {
hideSystemUI();
llTopAd.setVisibility(View.GONE);
mBannerContainer.setVisibility(View.GONE);
if(!Constants.SHOWAD){
return;
}
@ -992,16 +1011,351 @@ public class ReadActivity extends Activity_base implements AdInterface {
if(adHeight >contentAdHight){
FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) llTopAd.getLayoutParams();
params.setMargins(20, adY, 20, 10);
llTopAd.setLayoutParams(params);
llTopAd.setVisibility(View.VISIBLE);
FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) mBannerContainer.getLayoutParams();
Log.d(TAG, String.format("loadBannerAd:width %s, height %s ",Constants.SCREEN_WIDTH_PIX-50,adHeight));
if(adHeight>620){
loadNativeBannerAd(mBannerContainer,BuildConfig.AD_SLOT_TOUTIAO_BANNER_NATIVE_ID);
params.setMargins(20, adY-20, 20, 50);
}else{
loadBannerAd(mBannerContainer,BuildConfig.AD_SLOT_TOUTIAO_BANNER_ID, Constants.SCREEN_WIDTH_PIX-50,adHeight);
params.setMargins(20, adY, 20, 10);
}
mBannerContainer.setLayoutParams(params);
mBannerContainer.setVisibility(View.VISIBLE);
}
}
/*private void loadBannerAd(String codeId,int width,int height) {
//step4:创建广告请求参数AdSlot,具体参数含义参考文档
*//* if(height >390){
width =(int)(height*1.78);
if(width > Constants.SCREEN_WIDTH_PIX-50 ){
width= Constants.SCREEN_WIDTH_PIX-50;
height =(int)(width/1.78);
}
}else if(height >150){
width =(int)(height*1.78);
}*//*
width =990;
//height=150;
height=height > 500 ? 500: height;
Log.d(TAG, String.format("loadBannerAd:finial width %s, height %s ",width,height));
AdSlot adSlot = new AdSlot.Builder()
.setCodeId(codeId) //广告位id
.setSupportDeepLink(true)
.setImageAcceptedSize(width, height)
.build();
//step5:请求广告对请求回调的广告作渲染处理
mTTAdNative.loadBannerAd(adSlot, new TTAdNative.BannerAdListener() {
@Override
public void onError(int code, String message) {
TToast.show(ReadActivity.this, "load error : " + code + ", " + message);
mBannerContainer.removeAllViews();
}
@Override
public void onBannerAdLoad(final TTBannerAd ad) {
if (ad == null) {
return;
}
View bannerView = ad.getBannerView();
if (bannerView == null) {
return;
}
//设置轮播的时间间隔 间隔在30s到120秒之间的值不设置默认不轮播
ad.setSlideIntervalTime(30 * 1000);
mBannerContainer.removeAllViews();
mBannerContainer.addView(bannerView);
//设置广告互动监听回调
ad.setBannerInteractionListener(new TTBannerAd.AdInteractionListener() {
@Override
public void onAdClicked(View view, int type) {
TToast.show(ReadActivity.this, "广告被点击");
}
@Override
public void onAdShow(View view, int type) {
TToast.show(ReadActivity.this, "广告展示");
}
});
//可选设置下载类广告的下载监听
bindDownloadListener(ad);
//在banner中显示网盟提供的dislike icon有助于广告投放精准度提升
ad.setShowDislikeIcon(new TTAdDislike.DislikeInteractionCallback() {
@Override
public void onSelected(int position, String value) {
TToast.show(ReadActivity.this, "点击 " + value);
//用户选择不喜欢原因后移除广告展示
mBannerContainer.removeAllViews();
}
@Override
public void onCancel() {
TToast.show(ReadActivity.this, "点击取消 ");
}
});
//获取网盟dislike dialog您可以在您应用中本身自定义的dislike icon 按钮中设置 mTTAdDislike.showDislikeDialog();
*//*mTTAdDislike = ad.getDislikeDialog(new TTAdDislike.DislikeInteractionCallback() {
@Override
public void onSelected(int position, String value) {
TToast.show(mContext, "点击 " + value);
}
@Override
public void onCancel() {
TToast.show(mContext, "点击取消 ");
}
});
if (mTTAdDislike != null) {
XXX.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mTTAdDislike.showDislikeDialog();
}
});
} *//*
}
});
}
private boolean mHasShowDownloadActive = false;
private void bindDownloadListener(TTBannerAd ad) {
ad.setDownloadListener(new TTAppDownloadListener() {
@Override
public void onIdle() {
TToast.show(ReadActivity.this, "点击图片开始下载", Toast.LENGTH_LONG);
}
@Override
public void onDownloadActive(long totalBytes, long currBytes, String fileName, String appName) {
if (!mHasShowDownloadActive) {
mHasShowDownloadActive = true;
TToast.show(ReadActivity.this, "下载中,点击图片暂停", Toast.LENGTH_LONG);
}
}
@Override
public void onDownloadPaused(long totalBytes, long currBytes, String fileName, String appName) {
TToast.show(ReadActivity.this, "下载暂停,点击图片继续", Toast.LENGTH_LONG);
}
@Override
public void onDownloadFailed(long totalBytes, long currBytes, String fileName, String appName) {
TToast.show(ReadActivity.this, "下载失败,点击图片重新下载", Toast.LENGTH_LONG);
}
@Override
public void onInstalled(String fileName, String appName) {
TToast.show(ReadActivity.this, "安装完成,点击图片打开", Toast.LENGTH_LONG);
}
@Override
public void onDownloadFinished(long totalBytes, String fileName, String appName) {
TToast.show(ReadActivity.this, "点击图片安装", Toast.LENGTH_LONG);
}
});
}
*/
/* //-------------native toutiao ad
private void loadNativeBannerAd(String codeId) {
//step4:创建广告请求参数AdSlot,注意其中的setNativeAdtype方法具体参数含义参考文档
final AdSlot adSlot = new AdSlot.Builder()
.setCodeId(codeId)
.setSupportDeepLink(true)
.setImageAcceptedSize(690, 388)
.setNativeAdType(AdSlot.TYPE_BANNER) //请求原生广告时候请务必调用该方法设置参数为TYPE_BANNER或TYPE_INTERACTION_AD
.setAdCount(1)
.build();
//step5:请求广告对请求回调的广告作渲染处理
mTTAdNative.loadNativeAd(adSlot, new TTAdNative.NativeAdListener() {
@Override
public void onError(int code, String message) {
TToast.show(ReadActivity.this, "load error : " + code + ", " + message);
}
@Override
public void onNativeAdLoad(List<TTNativeAd> ads) {
if (ads.get(0) == null) {
return;
}
View bannerView = LayoutInflater.from(ReadActivity.this).inflate(R.layout.ad_toutiao_native_ad , mBannerContainer, false);
if (bannerView == null) {
return;
}
if (mCreativeButton != null) {
//防止内存泄漏
mCreativeButton = null;
}
mBannerContainer.removeAllViews();
mBannerContainer.addView(bannerView);
//绑定原生广告的数据
setAdData(bannerView, ads.get(0));
}
});
}
@SuppressWarnings("RedundantCast")
private void setAdData(View nativeView, TTNativeAd nativeAd) {
((TextView) nativeView.findViewById(R.id.tv_native_ad_title)).setText(nativeAd.getTitle());
((TextView) nativeView.findViewById(R.id.tv_native_ad_desc)).setText(nativeAd.getDescription());
ImageView imgDislike = nativeView.findViewById(R.id.img_native_dislike);
bindDislikeAction(nativeAd, imgDislike);
if (nativeAd.getImageList() != null && !nativeAd.getImageList().isEmpty()) {
TTImage image = nativeAd.getImageList().get(0);
if (image != null && image.isValid()) {
mAQuery.id(nativeView.findViewById(R.id.iv_native_image)).image(image.getImageUrl());
}
}
TTImage icon = nativeAd.getIcon();
if (icon != null && icon.isValid()) {
ImageOptions options = new ImageOptions();
mAQuery.id((nativeView.findViewById(R.id.iv_native_icon))).image(icon.getImageUrl(), options);
}
mCreativeButton = (Button) nativeView.findViewById(R.id.btn_native_creative);
//可根据广告类型为交互区域设置不同提示信息
switch (nativeAd.getInteractionType()) {
case TTAdConstant.INTERACTION_TYPE_DOWNLOAD:
//如果初始化ttAdManager.createAdNative(getApplicationContext())没有传入activity 则需要在此传activity否则影响使用Dislike逻辑
nativeAd.setActivityForDownloadApp(this);
mCreativeButton.setVisibility(View.VISIBLE);
nativeAd.setDownloadListener(mDownloadListener); // 注册下载监听器
break;
case TTAdConstant.INTERACTION_TYPE_DIAL:
mCreativeButton.setVisibility(View.VISIBLE);
mCreativeButton.setText("立即拨打");
break;
case TTAdConstant.INTERACTION_TYPE_LANDING_PAGE:
case TTAdConstant.INTERACTION_TYPE_BROWSER:
mCreativeButton.setVisibility(View.VISIBLE);
mCreativeButton.setText("查看详情");
break;
default:
mCreativeButton.setVisibility(View.GONE);
TToast.show(ReadActivity.this, "交互类型异常");
}
//可以被点击的view, 也可以把nativeView放进来意味整个广告区域可被点击
List<View> clickViewList = new ArrayList<>();
clickViewList.add(nativeView);
//触发创意广告的view点击下载或拨打电话
List<View> creativeViewList = new ArrayList<>();
//如果需要点击图文区域也能进行下载或者拨打电话动作请将图文区域的view传入
//creativeViewList.add(nativeView);
creativeViewList.add(mCreativeButton);
//重要! 这个涉及到广告计费必须正确调用convertView必须使用ViewGroup
nativeAd.registerViewForInteraction((ViewGroup) nativeView, clickViewList, creativeViewList, imgDislike, new TTNativeAd.AdInteractionListener() {
@Override
public void onAdClicked(View view, TTNativeAd ad) {
if (ad != null) {
TToast.show(ReadActivity.this, "广告" + ad.getTitle() + "被点击");
}
}
@Override
public void onAdCreativeClick(View view, TTNativeAd ad) {
if (ad != null) {
TToast.show(ReadActivity.this, "广告" + ad.getTitle() + "被创意按钮被点击");
}
}
@Override
public void onAdShow(TTNativeAd ad) {
if (ad != null) {
TToast.show(ReadActivity.this, "广告" + ad.getTitle() + "展示");
}
}
});
}
//接入网盟的dislike 逻辑有助于提示广告精准投放度
private void bindDislikeAction(TTNativeAd ad, View dislikeView) {
final TTAdDislike ttAdDislike = ad.getDislikeDialog(this);
if (ttAdDislike != null) {
ttAdDislike.setDislikeInteractionCallback(new TTAdDislike.DislikeInteractionCallback() {
@Override
public void onSelected(int position, String value) {
mBannerContainer.removeAllViews();
}
@Override
public void onCancel() {
}
});
}
dislikeView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (ttAdDislike != null)
ttAdDislike.showDislikeDialog();
}
});
}
private final TTAppDownloadListener mDownloadListener = new TTAppDownloadListener() {
@Override
public void onIdle() {
if (mCreativeButton != null) {
mCreativeButton.setText("开始下载");
}
}
@Override
public void onDownloadActive(long totalBytes, long currBytes, String fileName, String appName) {
if (mCreativeButton != null) {
if (totalBytes <= 0L) {
mCreativeButton.setText("下载中 percent: 0");
} else {
mCreativeButton.setText("下载中 percent: " + (currBytes * 100 / totalBytes));
}
}
}
@Override
public void onDownloadPaused(long totalBytes, long currBytes, String fileName, String appName) {
if (mCreativeButton != null) {
mCreativeButton.setText("下载暂停 percent: " + (currBytes * 100 / totalBytes));
}
}
@Override
public void onDownloadFailed(long totalBytes, long currBytes, String fileName, String appName) {
if (mCreativeButton != null) {
mCreativeButton.setText("重新下载");
}
}
@Override
public void onInstalled(String fileName, String appName) {
if (mCreativeButton != null) {
mCreativeButton.setText("点击打开");
}
}
@Override
public void onDownloadFinished(long totalBytes, String fileName, String appName) {
if (mCreativeButton != null) {
mCreativeButton.setText("点击安装");
}
}
};*/
}

View File

@ -5,6 +5,7 @@ import android.content.Context;
import android.graphics.Typeface;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.Display;
import android.view.Gravity;
import android.view.View;
@ -13,7 +14,7 @@ import android.widget.SeekBar;
import android.widget.TextView;
import com.baidu.android.common.logging.Log;
import com.novelbook.android.utils.CommonUtil;
import com.novelbook.android.utils.Config;
import com.novelbook.android.R;
@ -266,7 +267,7 @@ public class SettingDialog extends Dialog {
mSettingListener.changeTypeFace(tface);
}
}catch (Exception e){
Log.e("SettingDialog",e.getMessage());
Log.e("SettingDialog", "setTypeface: ",e );
}
}

View File

@ -45,8 +45,9 @@ public class RetryInterceptor implements Interceptor {
{
int i=0;
while(response==null && i<3){
request = chain.request();
response = doRequest(chain, request);
i++;
Log.d(TAG, String.format("HttpMethods intercept:a retried %s, response is null? %s",i, response == null));
}
if(response==null) {
throw new IOException();
@ -70,8 +71,15 @@ public class RetryInterceptor implements Interceptor {
{
int i=0;
while(response==null && i<3){
request = chain.request();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
response = doRequest(chain, request);
i++;
Log.d(TAG, String.format("HttpMethods intercept:b retried %s,%s,response is null? %s",i,request.url(), response == null));
}
if(response==null) {
throw new IOException();
@ -129,13 +137,19 @@ public class RetryInterceptor implements Interceptor {
response = doRequest(chain, newRequest);
Log.d(TAG, String.format("HttpMethods intercept: response is null? %s", response == null));
Log.d(TAG, String.format("HttpMethods intercept: %s, response is null? %s",newRequest.url(), response == null));
int i=0;
while((response==null || !response.isSuccessful() )&& i<3){
request = chain.request();
/* int i=0;
while((response==null || !response.isSuccessful() )&& i<5){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
response = doRequest(chain, newRequest);
i++;
}
Log.d(TAG, String.format("HttpMethods intercept:C retried %s,%s, response is null? %s",i,newRequest.url(), response == null));
}*/
if (response != null) {
Log.d(TAG, String.format("HttpMethods intercept: response .code? %s", response.code()));

View File

@ -9,10 +9,15 @@ public class Constants {
public static final String BLOCK_TITLE_NOVELS = "ns";
public static final String HOT_KEYS = "keywords";
public static final int NOVEL_SPAN_CNT =3 ; //grid columns
public static final boolean SHOWAD =false ;
public static final int MAXAGE_MAX =60*60*24*28; //28 ;
public static final int MAXAGE_MULU = 60*60*24*7*2; //2周;;
public static final String VERSION_ADDRESS ="version.xml";
public static final boolean SHOWAD =true ;
public static final long AD_SPLASH_INVTERVAL = 5*60*1000;//间隔5分钟
public static final int AD_SPLASH_PAGES = 15;
public static int SCREEN_HEIGHT_PIX =0 ;
public static int SCREEN_WIDTH_PIX = 0;
public static long LAST_G = 0;//主目录API上次访问时间
public static long MAXAGE_G = 3600;//主目录API上次访问时间
public static String[] HOT_KEYS_VALUE = {};

View File

@ -988,7 +988,7 @@ private void hideSysUI(){
private void showAd(int adHeight,int adY) {
boolean showAd = getCurrentPage().getPageNo() > 2
boolean showAd = getCurrentPage().getPageNo() > 1
&&NetWorkUtil.isNetworkConnected(mContext);
if (mAd != null) {
@ -1154,7 +1154,7 @@ private void hideSysUI(){
this.mBookUtil.getTargetSites();
}
public void initBookUtil() {
mBookUtil = null;
mBookUtil = new BookUtil();
}
/**
* 打开书本
@ -1168,7 +1168,7 @@ private void hideSysUI(){
if(book.isLocalBook()){ //离线书籍重新初始化加载mBookUtil
mBookUtil = new BookUtil();
mBookUtil.setNovel(book);
}else if(mBookUtil==null){
}else if(getNovle()==null){
Log.d(TAG, "prepare book: preparing in openBook method" + book.getName());
prepareBook(book);
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="@color/white"/>
</shape>
</item>
<!-- <item android:bottom="25dp">
<bitmap
android:gravity="bottom|center_horizontal"
android:src="@drawable/toutiao_splash_banner"/>
</item>-->
</layer-list>

View File

@ -42,12 +42,17 @@
/>
<TextView
style="@style/tvRightMore"
android:textSize="20sp"
android:text=">"
style="@style/buttonRightMore"
android:text="详细"
android:gravity="center_vertical"
android:layout_marginRight="5dp"
/>
<TextView
style="@style/tvRightMore"
android:text=" "
/>
</LinearLayout>
<View style="@style/llGraySplit.2dp.gray" />
@ -64,7 +69,7 @@
<TextView
style="@style/NovelBlockTitle"
android:id="@+id/tvVersion"
android:text="1234455 "
android:gravity="right"
android:layout_marginRight="5dp"
/>
@ -89,7 +94,7 @@
<TextView
style="@style/NovelBlockTitle"
android:id="@+id/tvCache"
android:text="1234455 "
android:gravity="right"
android:layout_marginRight="5dp"
/>

View File

@ -22,22 +22,30 @@
</android.support.v7.widget.Toolbar>
</android.support.design.widget.AppBarLayout>
<TextView
android:id="@+id/tvMsg"
android:textColor="@color/red"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<android.support.v7.widget.RecyclerView
android:id="@+id/recycleView"
style="@style/llOutside"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_marginTop="50dp"
android:divider="@color/list_item_divider"
>
</android.support.v7.widget.RecyclerView>
<TextView
android:layout_marginStart="@dimen/_20dp"
android:id="@+id/tvMsg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/noRecord"
/>
<android.support.v7.widget.RecyclerView
android:id="@+id/recycleView"
style="@style/llOutside"
android:layout_marginTop="5dp"
android:divider="@color/list_item_divider"
>
</android.support.v7.widget.RecyclerView>
</LinearLayout>
</android.support.design.widget.CoordinatorLayout>

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#000000"
tools:context=".AD.toutiao.SplashActivity">
<FrameLayout
android:id="@+id/splash_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000000"
>
</FrameLayout>
</LinearLayout>

View File

@ -0,0 +1,74 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_native_ad_title"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:singleLine="true"
android:textSize="14sp" />
<ImageView
android:id="@+id/iv_native_image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/tv_native_ad_title"
android:layout_marginBottom="5dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:scaleType="centerCrop" />
<ImageView
android:id="@+id/iv_native_icon"
android:layout_width="15dp"
android:layout_height="15dp"
android:layout_below="@id/iv_native_image"
android:layout_marginLeft="3dp"
android:layout_marginStart="3dp" />
<LinearLayout
android:id="@+id/tv_source_desc_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_below="@id/iv_native_image"
android:layout_toRightOf="@id/iv_native_icon"
android:layout_toEndOf="@id/iv_native_icon"
tools:ignore="UseCompoundDrawables">
<TextView
android:id="@+id/tv_native_ad_desc"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:layout_marginLeft="5dp"
android:layout_marginStart="5dp"
android:layout_marginTop="15dp"
android:ellipsize="end"
android:singleLine="true"
android:textSize="14sp" />
<ImageView
android:id="@+id/img_native_dislike"
android:layout_width="20dp"
android:layout_height="20dp"
android:background="@drawable/tt_dislike_icon" />
</LinearLayout>
<Button
android:id="@+id/btn_native_creative"
android:layout_width="90dp"
android:layout_height="40dp"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_marginRight="14dp"
android:layout_marginEnd="14dp"
android:layout_alignTop="@+id/tv_source_desc_layout"
android:textSize="10sp"
/>
</RelativeLayout>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/screen"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical">
<TextView android:id="@+id/left_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
/>
</RelativeLayout>

View File

@ -14,7 +14,7 @@
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
<!-- <LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_gravity="bottom"
@ -64,7 +64,7 @@
android:layout_weight="1" />
</LinearLayout>
</LinearLayout>-->
<LinearLayout style="@style/llGraySplit" />
@ -207,7 +207,10 @@
</LinearLayout>
</LinearLayout>
</LinearLayout>
<FrameLayout
style="@style/frmBannerContainer"
android:layout_height="wrap_content"
android:id="@+id/banner_container"/>
<LinearLayout style="@style/llGraySplit" />
<!--
@ -293,6 +296,7 @@
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/tvTonglei"
style="@style/NovelBlockTitle"

View File

@ -35,6 +35,8 @@
app:tl_indicator_bounce_enable ="true"
/>-->
<!-- app:tl_indicator_color="@color/crimson" -->
<android.support.v4.view.ViewPager
android:paddingTop="20dp"
android:paddingLeft="2dp"

View File

@ -1,11 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
style="@style/llOutside"
android:orientation="vertical"
tools:context=".Fragments.FragmentCates">
<FrameLayout
android:id="@+id/banner_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0"
android:layout_centerInParent="true"
android:background="#D5D5D5" />
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swipeLayout"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
@ -21,4 +30,4 @@
/>
</android.support.v4.widget.SwipeRefreshLayout>
</FrameLayout>
</LinearLayout>

View File

@ -7,12 +7,20 @@
android:layout_marginRight="@dimen/marginRight"
android:orientation="vertical">
<FrameLayout
android:id="@+id/banner_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:background="#D5D5D5" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swipeLayout"
android:layout_width="match_parent"
@ -30,6 +38,7 @@
/>
</android.support.v4.widget.SwipeRefreshLayout>
<LinearLayout
android:id="@+id/llShelfBottom"
android:layout_width="match_parent"

View File

@ -27,8 +27,22 @@
-->
<!-- TODO: Update blank fragment layout -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<FrameLayout
android:id="@+id/banner_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0"
android:layout_centerInParent="true"
android:background="@color/white" />
<android.support.v7.widget.RecyclerView
android:id="@+id/rvBangdan"
android:layout_weight="1"
android:divider="#ffff0000"
android:dividerHeight="5dp"
android:layout_width="match_parent"
@ -37,5 +51,5 @@
android:paddingBottom="30dp"
android:layout_marginBottom="-2dp"
/>
</LinearLayout>
</android.support.v4.widget.SwipeRefreshLayout>

View File

@ -4,7 +4,12 @@
xmlns:tools="http://schemas.android.com/tools"
style="@style/llOutside.vertical"
tools:context=".Fragments.Fragment_jingxuan">
<FrameLayout
android:id="@+id/banner_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:background="#D5D5D5" />
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swipeLayout"
android:layout_width="match_parent"

View File

@ -17,15 +17,15 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/nav_header_desc"
android:paddingTop="@dimen/nav_header_vertical_spacing" android:visibility="gone"
app:srcCompat="@mipmap/ic_launcher" />
<TextView
android:id="@+id/tvUser"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/nav_header_vertical_spacing"
android:text="欢迎您的光临"
android:text="@string/app_name"
android:layout_gravity="center_vertical"
android:gravity="center_horizontal"
android:textColor="@color/white"

View File

@ -17,7 +17,7 @@
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay">
<ImageButton
<!--<ImageButton
android:id="@+id/btnRefresh"
android:layout_weight="0"
android:layout_gravity ="right|center_vertical"
@ -32,11 +32,11 @@
android:id="@+id/btnSort"
android:layout_weight="0"
android:layout_gravity ="right|center_vertical"
android:layout_marginRight="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_format_line_spacing_black_24dp"
style="@style/buttonCates"/>
style="@style/buttonCates"/>-->
</android.support.v7.widget.Toolbar>
</android.support.design.widget.AppBarLayout>

View File

@ -45,8 +45,8 @@
/>
<pl.droidsonroids.gif.GifImageView
android:id="@+id/imgLoading"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_width="35dp"
android:layout_height="35dp"
android:src="@mipmap/loading"
android:scaleType="centerCrop"
android:layout_gravity="center"
@ -64,7 +64,7 @@
android:text="@string/refresh"
android:visibility="gone"
/>
<LinearLayout
<!-- <LinearLayout
android:id="@+id/llTopAd"
android:layout_width="match_parent"
android:layout_height="150dp"
@ -72,15 +72,13 @@
android:layout_marginTop="520dp"
android:visibility="gone">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@color/whitesmoke"
android:scaleType="centerCrop"
android:contentDescription="TODO" />
</LinearLayout>
</LinearLayout>-->
<FrameLayout
style="@style/frmBannerContainer"
android:layout_height="wrap_content"
android:id="@+id/banner_container"
/>
</FrameLayout>

View File

@ -1,10 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_sort"
android:orderInCategory="20"
android:title=""
android:icon= "@drawable/ic_format_line_spacing_black_24dp"
app:showAsAction="always" />
<item
android:id="@+id/action_refresh"
android:orderInCategory="30"
android:title=""
android:icon= "@drawable/ic_refresh_black_24dp"
app:showAsAction="always" />
<item
android:id="@+id/action_change_source"
android:title="@string/action_change_source"
android:orderInCategory="90"
android:icon= "@drawable/ic_call_split_black_24dp"
android:orderInCategory="40"
app:showAsAction="always" />
</menu>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.8 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 9.0 KiB

View File

@ -48,6 +48,7 @@
<dimen name="_10dp">10dp</dimen>
<dimen name="toolbarHeight">40dp</dimen>
<dimen name="app_bar_height_250">240dp</dimen>
<dimen name="_20dp">20dp</dimen>
<!-- Default screen margins, per the Android Design guidelines. -->

View File

@ -42,7 +42,7 @@
<string name="title_activity_main5">Main5Activity</string>
<string name="title_on_shelf">加入书架</string>
<string name="title_read">立即阅读</string>
<string name="title_download">下载管理</string>
<string name="title_download">缓存管理</string>
<string name="title_activity_paihangbang"></string>
<string name="title_activity_main6">Main6Activity</string>
<string name="section_format">Hello World from section: %1$d</string>
@ -136,6 +136,8 @@
<string name="title_setup">设置</string>
<string name="title_annouce">免责声明</string>
<string name="cache_novel">全本缓存</string>
<string name="title_navi">如意阅读</string>
<string name="title_ad">广告</string>
<string-array name="voicer_cloud_entries">
<item>小燕—女青、中英、普通话</item>

View File

@ -23,6 +23,18 @@
</style>
<!-- toutiao chuanshanjia-->
<style name="Theme.Light" parent="Theme.AppCompat.Light">
<item name="android:windowBackground">@color/white</item>
</style>
<style name="Theme.Splash" parent="Theme.Light">
<!--<item name="android:windowBackground">@drawable/toutiao_splash_banner</item>-->
<item name="windowActionBar">false</item>
<item name="android:windowNoTitle">true</item>
<item name="windowNoTitle">true</item>
</style>
<!-- toutiao chuanshanjia end -->
<style name="ToolBarTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
@ -433,7 +445,12 @@
<item name="android:clickable">true</item>
</style>
<style name="frmBannerContainer">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">50dp</item>
<item name="android:layout_centerInParent">true</item>
<item name="android:background">@color/transparent</item>
</style>
</resources>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-files-path name="external_files_path" path="Download" />
<!--为了适配所有路径可以设置 path = "." -->
</paths>

View File

@ -106,17 +106,13 @@
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/legacy_multidex_aapt_derived_proguard_rules" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/legacy_multidex_main_dex_list" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifest-checker" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/merged-not-compiled-resources" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/merged_assets" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/merged_manifests" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/metadata_feature_manifest" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/prebuild" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/processed_res" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/proguard-files" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/proguard-rules" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/reload-dex" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/res_stripped" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/resources" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/shader_assets" />
@ -126,104 +122,102 @@
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/transforms" />
<excludeFolder url="file://$MODULE_DIR$/build/outputs" />
<excludeFolder url="file://$MODULE_DIR$/build/reports" />
<excludeFolder url="file://$MODULE_DIR$/build/tmp" />
</content>
<orderEntry type="jdk" jdkName="Android API 28 Platform" jdkType="Android SDK" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Gradle: com.android.support:design:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: :open_ad_sdk:@aar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-fragment:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:localbroadcastmanager:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:animated-vector-drawable:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: jp.wasabeef:glide-transformations:2.0.1@aar" level="project" />
<orderEntry type="library" name="Gradle: com.github.bumptech.glide:annotations:4.9.0@jar" level="project" />
<orderEntry type="library" name="Gradle: android.arch.lifecycle:viewmodel:1.1.1@aar" level="project" />
<orderEntry type="library" name="Gradle: __local_aars__:E.\reading\android\asProjects\zhuike\libs\juniversalchardet-1.0.3.jar:unspecified@jar" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test.espresso:espresso-idling-resource:3.0.2@aar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:loader:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: android.arch.core:runtime:1.1.1@aar" level="project" />
<orderEntry type="library" name="Gradle: android.arch.lifecycle:extensions:1.1.1@aar" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test:runner:1.0.2@aar" level="project" />
<orderEntry type="library" name="Gradle: com.github.bumptech.glide:disklrucache:4.9.0@jar" level="project" />
<orderEntry type="library" name="Gradle: android.arch.lifecycle:livedata-core:1.1.1@aar" level="project" />
<orderEntry type="library" name="Gradle: com.packetzoom:pz-android-sdk:3.2.43@aar" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: com.squareup:javawriter:2.1.1@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:cursoradapter:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.github.bumptech.glide:gifdecoder:4.9.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.squareup.okio:okio:1.17.2@jar" level="project" />
<orderEntry type="library" name="Gradle: com.squareup.retrofit2:adapter-rxjava2:2.5.0@jar" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test.espresso:espresso-core:3.0.2@aar" level="project" />
<orderEntry type="library" name="Gradle: android.arch.lifecycle:runtime:1.1.1@aar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-compat:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: __local_aars__:E.\reading\android\asProjects\zhuike\libs\galaxy-v2.0.jar:unspecified@jar" level="project" />
<orderEntry type="library" name="Gradle: __local_aars__:E.\reading\android\asProjects\zhuike\libs\android-query-full.0.26.7.jar:unspecified@jar" level="project" />
<orderEntry type="library" name="Gradle: q.rorbin:badgeview:1.1.2@aar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:cardview-v7:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.google.android.gms:play-services-audience:16.0.0@aar" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: javax.inject:javax.inject:1@jar" level="project" />
<orderEntry type="library" name="Gradle: com.astuetz:pagerslidingtabstrip:1.0.1@aar" level="project" />
<orderEntry type="library" name="Gradle: com.youth.banner:banner:1.4.10@aar" level="project" />
<orderEntry type="library" name="Gradle: com.github.chengzipi:Searchbox:v1.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: org.litepal.android:java:3.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-vector-drawable:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-core-utils:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:recyclerview-v7:28.0.0@aar" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test:monitor:1.0.2@aar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-annotations:28.0.0@jar" level="project" />
<orderEntry type="library" name="Gradle: __local_aars__:D.\android\sdk\build-tools\28.0.3\renderscript\lib\renderscript-v8.jar:unspecified@jar" level="project" />
<orderEntry type="library" name="Gradle: io.alterac.blurkit:blurkit:1.1.1@aar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:interpolator:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:transition:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: android.arch.lifecycle:livedata:1.1.1@aar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:drawerlayout:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.google.android.gms:play-services-plus:16.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.flyco.tablayout:FlycoTabLayout_Lib:2.1.2@aar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-v4:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support.constraint:constraint-layout-solver:1.1.3@jar" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: net.sf.kxml:kxml2:2.3.0@jar" level="project" />
<orderEntry type="library" name="Gradle: io.reactivex.rxjava2:rxandroid:2.1.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.google.code.gson:gson:2.8.5@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:multidex:1.0.2@aar" level="project" />
<orderEntry type="library" name="Gradle: org.litepal.android:core:3.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: org.reactivestreams:reactive-streams:1.0.2@jar" level="project" />
<orderEntry type="library" name="Gradle: com.timqi.collapsibletextview:library:1.1.2@aar" level="project" />
<orderEntry type="library" name="Gradle: com.squareup.retrofit2:converter-gson:2.5.0@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-core-ui:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.squareup.okhttp3:logging-interceptor:3.14.0@jar" level="project" />
<orderEntry type="library" name="Gradle: com.umeng.umsdk:common:2.0.2@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:asynclayoutinflater:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support.constraint:constraint-layout:1.1.3@aar" level="project" />
<orderEntry type="library" name="Gradle: com.github.bumptech.glide:glide:4.9.0@aar" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: com.google.code.findbugs:jsr305:2.0.1@jar" level="project" />
<orderEntry type="library" name="Gradle: android.arch.core:common:1.1.1@jar" level="project" />
<orderEntry type="library" name="Gradle: com.squareup.retrofit2:retrofit:2.5.0@jar" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: org.hamcrest:hamcrest-core:1.3@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:viewpager:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: __local_aars__:E.\reading\android\asProjects\zhuike\libs\GDTSDK.union.4.40.910.jar:unspecified@jar" level="project" />
<orderEntry type="library" name="Gradle: pl.droidsonroids.gif:android-gif-drawable:1.2.16@aar" level="project" />
<orderEntry type="library" name="Gradle: com.google.android.gms:play-services-basement:16.0.1@aar" level="project" />
<orderEntry type="library" name="Gradle: com.github.ixiaow:multilayout:1.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: android.arch.lifecycle:common:1.1.1@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:customview:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:design:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-fragment:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:animated-vector-drawable:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: jp.wasabeef:glide-transformations:2.0.1@aar" level="project" />
<orderEntry type="library" name="Gradle: com.github.bumptech.glide:annotations:4.9.0@jar" level="project" />
<orderEntry type="library" name="Gradle: android.arch.lifecycle:viewmodel:1.1.1@aar" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test.espresso:espresso-idling-resource:3.0.2@aar" level="project" />
<orderEntry type="library" name="Gradle: android.arch.core:runtime:1.1.1@aar" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test:runner:1.0.2@aar" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: com.squareup:javawriter:2.1.1@jar" level="project" />
<orderEntry type="library" name="Gradle: com.squareup.okio:okio:1.17.2@jar" level="project" />
<orderEntry type="library" name="Gradle: q.rorbin:badgeview:1.1.2@aar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:cardview-v7:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.google.android.gms:play-services-audience:16.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.astuetz:pagerslidingtabstrip:1.0.1@aar" level="project" />
<orderEntry type="library" name="Gradle: com.youth.banner:banner:1.4.10@aar" level="project" />
<orderEntry type="library" name="Gradle: com.github.chengzipi:Searchbox:v1.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-vector-drawable:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-core-utils:28.0.0@aar" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test:monitor:1.0.2@aar" level="project" />
<orderEntry type="library" name="Gradle: io.alterac.blurkit:blurkit:1.1.1@aar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:interpolator:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:transition:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: android.arch.lifecycle:livedata:1.1.1@aar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:drawerlayout:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.umeng.umsdk:analytics:8.0.2@jar" level="project" />
<orderEntry type="library" name="Gradle: com.jakewharton:butterknife-annotations:9.0.0@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:documentfile:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.jakewharton:butterknife:9.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.google.code.gson:gson:2.8.5@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:slidingpanelayout:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: __local_aars__:E.\reading\android\asProjects\zhuike\libs\Msc.jar:unspecified@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:appcompat-v7:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.squareup.okhttp3:okhttp:3.14.0@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:multidex:1.0.2@aar" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: com.android.support:multidex-instrumentation:1.0.2@aar" level="project" />
<orderEntry type="library" name="Gradle: org.litepal.android:core:3.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: org.reactivestreams:reactive-streams:1.0.2@jar" level="project" />
<orderEntry type="library" name="Gradle: com.packetzoom:pz-okhttp3-interceptor:3.2.43@aar" level="project" />
<orderEntry type="library" name="Gradle: io.reactivex.rxjava2:rxjava:2.2.7@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:collections:28.0.0@jar" level="project" />
<orderEntry type="library" name="Gradle: com.timqi.collapsibletextview:library:1.1.2@aar" level="project" />
<orderEntry type="library" name="Gradle: com.squareup.retrofit2:converter-gson:2.5.0@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-core-ui:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.umeng.umsdk:common:2.0.2@jar" level="project" />
<orderEntry type="library" name="Gradle: com.squareup.okhttp3:logging-interceptor:3.14.0@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:asynclayoutinflater:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support.constraint:constraint-layout:1.1.3@aar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:print:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.jakewharton:butterknife-runtime:9.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.github.bumptech.glide:glide:4.9.0@aar" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: com.google.code.findbugs:jsr305:2.0.1@jar" level="project" />
<orderEntry type="library" name="Gradle: android.arch.core:common:1.1.1@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:versionedparcelable:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.google.android.gms:play-services-base:16.0.1@aar" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: junit:junit:4.12@jar" level="project" />
<orderEntry type="library" name="Gradle: com.squareup.retrofit2:retrofit:2.5.0@jar" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: org.hamcrest:hamcrest-core:1.3@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:viewpager:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.google.android.gms:play-services-basement:16.0.1@aar" level="project" />
<orderEntry type="library" name="Gradle: pl.droidsonroids.gif:android-gif-drawable:1.2.16@aar" level="project" />
<orderEntry type="library" name="Gradle: com.github.ixiaow:multilayout:1.0.0@aar" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: org.hamcrest:hamcrest-integration:1.3@jar" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: org.hamcrest:hamcrest-library:1.3@jar" level="project" />
<orderEntry type="library" name="Gradle: android.arch.lifecycle:common:1.1.1@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:coordinatorlayout:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:customview:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:swiperefreshlayout:28.0.0@aar" level="project" />
<orderEntry type="library" name="Gradle: q.rorbin:VerticalTabLayout:1.2.5@aar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-media-compat:28.0.0@aar" level="project" />