Commit 86228b372bd7ee59ef51913a26c8cbfb62676450
1 parent
83292208
增加推流鉴权
Showing
10 changed files
with
378 additions
and
23 deletions
app/src/main/AndroidManifest.xml
| ... | ... | @@ -2,6 +2,7 @@ |
| 2 | 2 | <manifest xmlns:android="http://schemas.android.com/apk/res/android" |
| 3 | 3 | xmlns:tools="http://schemas.android.com/tools" |
| 4 | 4 | package="com.cnlive.gundam"> |
| 5 | + | |
| 5 | 6 | <uses-permission android:name="android.permission.BLUETOOTH" /> |
| 6 | 7 | <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" /> |
| 7 | 8 | <uses-permission android:name="android.permission.GET_ACCOUNTS" /> |
| ... | ... | @@ -54,10 +55,16 @@ |
| 54 | 55 | android:screenOrientation="portrait" |
| 55 | 56 | android:windowSoftInputMode="adjustResize" /> |
| 56 | 57 | |
| 57 | - <activity android:name=".user.activity.LoginActivity"/> | |
| 58 | + <activity | |
| 59 | + android:name=".main.ui.activity.WebViewActivity" | |
| 60 | + android:configChanges="keyboardHidden|screenSize|orientation" | |
| 61 | + android:launchMode="singleTop" | |
| 62 | + android:screenOrientation="portrait" | |
| 63 | + android:windowSoftInputMode="adjustResize" /> | |
| 64 | + | |
| 65 | + <activity android:name=".user.activity.LoginActivity" /> | |
| 58 | 66 | |
| 59 | - <receiver | |
| 60 | - android:name=".video.utils.NetworkChangeReceive"> | |
| 67 | + <receiver android:name=".video.utils.NetworkChangeReceive"> | |
| 61 | 68 | <intent-filter> |
| 62 | 69 | <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> |
| 63 | 70 | </intent-filter> | ... | ... |
app/src/main/java/com/cnlive/gundam/main/application/CNLiveApplication.java
| ... | ... | @@ -13,6 +13,8 @@ public class CNLiveApplication extends Application { |
| 13 | 13 | @Override |
| 14 | 14 | public void onCreate() { |
| 15 | 15 | super.onCreate(); |
| 16 | - Config.init(getApplicationContext(), "60_j4fc7dsm83", "4c8658abc5d66f270f9bf5dcd1ef11e3597fab4c4e0af9",true); | |
| 16 | + //TODO 测试ID 在正式与测试环境均可通过,正式ID则不行~! | |
| 17 | +// Config.init(getApplicationContext(), "60_j4fc7dsm83", "4c8658abc5d66f270f9bf5dcd1ef11e3597fab4c4e0af9",true); | |
| 18 | + Config.init(getApplicationContext(), "60_j4faozoq85", "7b6da5a6e2955aaf7f73a06b5bdc6d50e6d5bfda3da86b"); | |
| 17 | 19 | } |
| 18 | 20 | } | ... | ... |
app/src/main/java/com/cnlive/gundam/main/network/ApiService.java
| ... | ... | @@ -3,6 +3,7 @@ package com.cnlive.gundam.main.network; |
| 3 | 3 | import com.cnlive.gundam.main.model.ActiveListModel; |
| 4 | 4 | import com.cnlive.gundam.main.model.ActivePlayInfo; |
| 5 | 5 | import com.cnlive.gundam.main.model.VodListPage; |
| 6 | +import com.cnlive.gundam.user.model.ChannelInfoModel; | |
| 6 | 7 | |
| 7 | 8 | import java.util.Map; |
| 8 | 9 | |
| ... | ... | @@ -27,4 +28,8 @@ public interface ApiService { |
| 27 | 28 | //判断活动的状态 |
| 28 | 29 | @GET("vod_epg/getVodInfo4App") |
| 29 | 30 | Call<VodListPage> getVodInfoList(@QueryMap Map<String, String> options); |
| 31 | + | |
| 32 | + //主播信息接口 | |
| 33 | + @GET("live_epg/channel/info4App") | |
| 34 | + Call<ChannelInfoModel> getChannelInfo(@QueryMap Map<String, String> params); | |
| 30 | 35 | } | ... | ... |
app/src/main/java/com/cnlive/gundam/main/network/util/SignUtil.java
| ... | ... | @@ -3,19 +3,13 @@ package com.cnlive.gundam.main.network.util; |
| 3 | 3 | import android.content.Context; |
| 4 | 4 | import android.util.Log; |
| 5 | 5 | |
| 6 | -import com.cnlive.gundam.main.network.util.SHA1; | |
| 7 | 6 | import com.cnlive.libs.util.Config; |
| 8 | -import com.cnlive.libs.util.data.okhttp3.Headers; | |
| 9 | -import com.cnlive.libs.util.data.okhttp3.OkHttpClient; | |
| 10 | -import com.cnlive.libs.util.data.okhttp3.Request; | |
| 11 | -import com.cnlive.libs.util.data.okhttp3.Response; | |
| 12 | 7 | |
| 13 | 8 | import java.io.UnsupportedEncodingException; |
| 14 | 9 | import java.net.URLEncoder; |
| 15 | 10 | import java.util.ArrayList; |
| 16 | 11 | import java.util.Collections; |
| 17 | 12 | import java.util.Comparator; |
| 18 | -import java.util.Date; | |
| 19 | 13 | import java.util.HashMap; |
| 20 | 14 | import java.util.LinkedHashMap; |
| 21 | 15 | import java.util.List; |
| ... | ... | @@ -66,17 +60,17 @@ public class SignUtil { |
| 66 | 60 | } |
| 67 | 61 | |
| 68 | 62 | private static long getTime() { |
| 69 | - OkHttpClient okHttpClient = new OkHttpClient(); | |
| 70 | - try { | |
| 71 | - Request request = new Request.Builder().url(URL_TIME_SERVICE).build(); | |
| 72 | - Response response = okHttpClient.newCall(request).execute(); | |
| 73 | - Headers headers = response.headers(); | |
| 74 | - | |
| 75 | - Date date = headers.getDate("Date"); | |
| 76 | - return date == null ? System.currentTimeMillis() : date.getTime(); | |
| 77 | - } catch (Exception e) { | |
| 78 | - e.printStackTrace(); | |
| 79 | - } | |
| 63 | +// OkHttpClient okHttpClient = new OkHttpClient(); | |
| 64 | +// try { | |
| 65 | +// Request request = new Request.Builder().url(URL_TIME_SERVICE).build(); | |
| 66 | +// Response response = okHttpClient.newCall(request).execute(); | |
| 67 | +// Headers headers = response.headers(); | |
| 68 | +// | |
| 69 | +// Date date = headers.getDate("Date"); | |
| 70 | +// return date == null ? System.currentTimeMillis() : date.getTime(); | |
| 71 | +// } catch (Exception e) { | |
| 72 | +// e.printStackTrace(); | |
| 73 | +// } | |
| 80 | 74 | |
| 81 | 75 | return System.currentTimeMillis(); |
| 82 | 76 | } | ... | ... |
app/src/main/java/com/cnlive/gundam/main/presenter/AnchorInfoPresenter.java
0 → 100644
| 1 | +package com.cnlive.gundam.main.presenter; | |
| 2 | + | |
| 3 | +import android.content.Context; | |
| 4 | + | |
| 5 | +import com.cnlive.gundam.main.network.RetrofitUtil; | |
| 6 | +import com.cnlive.gundam.main.network.util.SignUtil; | |
| 7 | +import com.cnlive.gundam.main.presenter.view.AnchorInfoView; | |
| 8 | +import com.cnlive.gundam.user.model.ChannelInfoModel; | |
| 9 | +import com.cnlive.libs.util.Config; | |
| 10 | + | |
| 11 | +import java.util.HashMap; | |
| 12 | +import java.util.Map; | |
| 13 | + | |
| 14 | +import retrofit2.Call; | |
| 15 | +import retrofit2.Callback; | |
| 16 | +import retrofit2.Response; | |
| 17 | + | |
| 18 | +/** | |
| 19 | + * Created by xiansong on 2017/6/28. | |
| 20 | + */ | |
| 21 | + | |
| 22 | +public class AnchorInfoPresenter { | |
| 23 | + | |
| 24 | + private AnchorInfoView mView; | |
| 25 | + | |
| 26 | + public AnchorInfoPresenter(AnchorInfoView view) { | |
| 27 | + this.mView = view; | |
| 28 | + } | |
| 29 | + | |
| 30 | + /** | |
| 31 | + * 查询主播信息 | |
| 32 | + * | |
| 33 | + * @param context Context | |
| 34 | + * @param channelId 主播ID | |
| 35 | + */ | |
| 36 | + public void checkAnchorInfo(Context context, String channelId) { | |
| 37 | + Map<String, String> params = new HashMap<>(); | |
| 38 | + params.put("appId", Config.getAppId()); | |
| 39 | + params.put("channelId", channelId); | |
| 40 | + RetrofitUtil.getApiService().getChannelInfo(SignUtil.getSignParamM(context, params)).enqueue(new Callback<ChannelInfoModel>() { | |
| 41 | + @Override | |
| 42 | + public void onResponse(Call<ChannelInfoModel> call, Response<ChannelInfoModel> response) { | |
| 43 | + if (response.isSuccessful()) { | |
| 44 | + ChannelInfoModel info = response.body(); | |
| 45 | + if (info != null && "0".equals(info.getErrorCode())) { | |
| 46 | + if (mView != null) mView.onAnchorInfo(info); | |
| 47 | + } else { | |
| 48 | + if (mView != null) mView.getAnchorFailure(); | |
| 49 | + } | |
| 50 | + } | |
| 51 | + } | |
| 52 | + | |
| 53 | + @Override | |
| 54 | + public void onFailure(Call<ChannelInfoModel> call, Throwable t) { | |
| 55 | + if (mView != null) mView.getAnchorFailure(); | |
| 56 | + } | |
| 57 | + }); | |
| 58 | + } | |
| 59 | +} | ... | ... |
app/src/main/java/com/cnlive/gundam/main/presenter/view/AnchorInfoView.java
0 → 100644
app/src/main/java/com/cnlive/gundam/main/ui/activity/MainActivity.java
| 1 | 1 | package com.cnlive.gundam.main.ui.activity; |
| 2 | 2 | |
| 3 | +import android.app.AlertDialog; | |
| 4 | +import android.app.Dialog; | |
| 5 | +import android.content.DialogInterface; | |
| 6 | +import android.content.Intent; | |
| 3 | 7 | import android.databinding.DataBindingUtil; |
| 4 | 8 | import android.os.Bundle; |
| 5 | 9 | import android.support.v7.app.AppCompatActivity; |
| 10 | +import android.widget.Toast; | |
| 6 | 11 | |
| 7 | 12 | import com.cnlive.gundam.R; |
| 8 | 13 | import com.cnlive.gundam.databinding.ActivityMainBinding; |
| 14 | +import com.cnlive.gundam.main.presenter.AnchorInfoPresenter; | |
| 15 | +import com.cnlive.gundam.main.presenter.view.AnchorInfoView; | |
| 9 | 16 | import com.cnlive.gundam.main.ui.fragment.ConfigFragment; |
| 10 | 17 | import com.cnlive.gundam.main.ui.fragment.HomeFragment; |
| 11 | 18 | import com.cnlive.gundam.main.ui.fragment.LiveFragment; |
| 12 | 19 | import com.cnlive.gundam.main.ui.fragment.UGCListFragment; |
| 13 | 20 | import com.cnlive.gundam.main.ui.widget.FragmentTabHost; |
| 21 | +import com.cnlive.gundam.stream.ui.activity.StreamActivity; | |
| 22 | +import com.cnlive.gundam.user.activity.LoginActivity; | |
| 23 | +import com.cnlive.gundam.user.auth.UserService; | |
| 24 | +import com.cnlive.gundam.user.model.ChannelInfoModel; | |
| 25 | +import com.cnlive.gundam.user.model.User; | |
| 26 | +import com.cnlive.libs.util.Config; | |
| 14 | 27 | |
| 15 | 28 | import java.util.Arrays; |
| 16 | 29 | |
| ... | ... | @@ -18,7 +31,11 @@ import java.util.Arrays; |
| 18 | 31 | * Created by xiansong on 2017/6/27. |
| 19 | 32 | */ |
| 20 | 33 | |
| 21 | -public class MainActivity extends AppCompatActivity implements FragmentTabHost.OnSetCurrentTabListener { | |
| 34 | +public class MainActivity extends AppCompatActivity implements FragmentTabHost.OnSetCurrentTabListener, AnchorInfoView { | |
| 35 | + | |
| 36 | + private Dialog verifiedDialog; | |
| 37 | + | |
| 38 | + private AnchorInfoPresenter mAnchorInfoPresenter; | |
| 22 | 39 | |
| 23 | 40 | @Override |
| 24 | 41 | protected void onCreate(Bundle savedInstanceState) { |
| ... | ... | @@ -33,6 +50,8 @@ public class MainActivity extends AppCompatActivity implements FragmentTabHost.O |
| 33 | 50 | FragmentTabHost.newTab("live", R.layout.indicator_main_live, UGCListFragment.class), |
| 34 | 51 | FragmentTabHost.newTab("config", R.layout.indicator_main_mine, ConfigFragment.class) |
| 35 | 52 | )); |
| 53 | + | |
| 54 | + mAnchorInfoPresenter = new AnchorInfoPresenter(this); | |
| 36 | 55 | } |
| 37 | 56 | |
| 38 | 57 | @Override |
| ... | ... | @@ -45,8 +64,72 @@ public class MainActivity extends AppCompatActivity implements FragmentTabHost.O |
| 45 | 64 | return false; |
| 46 | 65 | } |
| 47 | 66 | |
| 48 | - private void onSetStreamTab(){ | |
| 67 | + /** | |
| 68 | + * 直播按钮点击 | |
| 69 | + */ | |
| 70 | + private void onSetStreamTab() { | |
| 71 | + User user = UserService.getInstance(this).getActiveAccountInfo(); | |
| 72 | + if (user.getUid() == 0) { | |
| 73 | + startActivity(new Intent(this, LoginActivity.class)); | |
| 74 | + } else { | |
| 75 | + mAnchorInfoPresenter.checkAnchorInfo(this, user.getUid() + ""); | |
| 76 | + } | |
| 77 | + } | |
| 78 | + | |
| 49 | 79 | |
| 80 | + @Override | |
| 81 | + public void onAnchorInfo(ChannelInfoModel model) { | |
| 82 | + switch (model.getData().getStatus()) { | |
| 83 | + case -1: | |
| 84 | + Toast.makeText(this, "主播不存在", Toast.LENGTH_SHORT).show(); | |
| 85 | + showVerifiedDialog(); | |
| 86 | + break; | |
| 87 | + case 1: | |
| 88 | + Toast.makeText(this, "审核中,请耐心等待", Toast.LENGTH_SHORT).show(); | |
| 89 | + break; | |
| 90 | + case 2: | |
| 91 | + Toast.makeText(this, "审核失败", Toast.LENGTH_SHORT).show(); | |
| 92 | + break; | |
| 93 | + case 3: | |
| 94 | + Toast.makeText(this, "开启直播", Toast.LENGTH_SHORT).show(); | |
| 95 | + String activityId = System.currentTimeMillis() + ""; | |
| 96 | + String channelId = model.getData().getChannelId(); | |
| 97 | + String channelName = model.getData().getChannelName(); | |
| 98 | + String coverImgUrl = model.getData().getCoverImgUrl(); | |
| 99 | + StreamActivity.start(this, activityId, channelId, channelName, coverImgUrl, false); | |
| 100 | + break; | |
| 101 | + case 4: | |
| 102 | + Toast.makeText(this, "主播被禁用", Toast.LENGTH_SHORT).show(); | |
| 103 | + break; | |
| 104 | + } | |
| 105 | + } | |
| 106 | + | |
| 107 | + @Override | |
| 108 | + public void getAnchorFailure() { | |
| 109 | + Toast.makeText(this, getString(R.string.request_state_error), Toast.LENGTH_LONG).show(); | |
| 50 | 110 | } |
| 51 | 111 | |
| 112 | + private void showVerifiedDialog() { | |
| 113 | + verifiedDialog = new AlertDialog.Builder(this) | |
| 114 | + .setMessage("亲,完成实名认证就可以开播啦,现在就去认证吧?") | |
| 115 | + .setPositiveButton("去认证", new DialogInterface.OnClickListener() { | |
| 116 | + @Override | |
| 117 | + public void onClick(DialogInterface dialogInterface, int i) { | |
| 118 | + verifiedDialog.dismiss(); | |
| 119 | + String channelId = UserService.getInstance(MainActivity.this).getActiveAccountInfo().getUid() + ""; | |
| 120 | + String url = String.format(getString(R.string.verified_url), channelId, Config.getAppId()); | |
| 121 | + Intent intent = new Intent(MainActivity.this, WebViewActivity.class); | |
| 122 | + intent.putExtra("url", url); | |
| 123 | + intent.putExtra("title", "主播认证"); | |
| 124 | + startActivity(intent); | |
| 125 | + } | |
| 126 | + }) | |
| 127 | + .setNegativeButton("取消", new DialogInterface.OnClickListener() { | |
| 128 | + @Override | |
| 129 | + public void onClick(DialogInterface dialogInterface, int i) { | |
| 130 | + verifiedDialog.dismiss(); | |
| 131 | + } | |
| 132 | + }) | |
| 133 | + .show(); | |
| 134 | + } | |
| 52 | 135 | } |
| 53 | 136 | \ No newline at end of file | ... | ... |
app/src/main/java/com/cnlive/gundam/main/ui/activity/WebViewActivity.java
0 → 100644
| 1 | +package com.cnlive.gundam.main.ui.activity; | |
| 2 | + | |
| 3 | +import android.databinding.DataBindingUtil; | |
| 4 | +import android.os.Bundle; | |
| 5 | +import android.support.v7.app.AppCompatActivity; | |
| 6 | +import android.view.View; | |
| 7 | +import android.webkit.WebChromeClient; | |
| 8 | +import android.webkit.WebSettings; | |
| 9 | +import android.webkit.WebView; | |
| 10 | +import android.webkit.WebViewClient; | |
| 11 | + | |
| 12 | +import com.cnlive.gundam.R; | |
| 13 | +import com.cnlive.gundam.databinding.ActivityWebviewBinding; | |
| 14 | + | |
| 15 | + | |
| 16 | +/** | |
| 17 | + * Created by Administrator on 2017/1/12. | |
| 18 | + */ | |
| 19 | + | |
| 20 | +public class WebViewActivity extends AppCompatActivity { | |
| 21 | + | |
| 22 | + | |
| 23 | + private String path; | |
| 24 | + private String title; | |
| 25 | + private ActivityWebviewBinding binding; | |
| 26 | + | |
| 27 | + @Override | |
| 28 | + protected void onCreate(Bundle savedInstanceState) { | |
| 29 | + super.onCreate(savedInstanceState); | |
| 30 | + setContentView(R.layout.activity_webview); | |
| 31 | + getBundle(); | |
| 32 | + | |
| 33 | + binding = DataBindingUtil.setContentView(this, R.layout.activity_webview); | |
| 34 | + binding.setTitle(title); | |
| 35 | + binding.webview.loadUrl(path); | |
| 36 | + | |
| 37 | + WebSettings s = binding.webview.getSettings(); | |
| 38 | + | |
| 39 | + s.setBuiltInZoomControls(false); | |
| 40 | + s.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS); | |
| 41 | + | |
| 42 | + // Default zoom is deprecated in Android 4.4 | |
| 43 | + s.setUseWideViewPort(true); | |
| 44 | + s.setLoadWithOverviewMode(true); | |
| 45 | + | |
| 46 | + s.setAllowFileAccess(true); | |
| 47 | + s.setJavaScriptEnabled(true); | |
| 48 | + | |
| 49 | +// s.setUserAgentString(s.getUserAgentString() + "/" + Probe.appid); | |
| 50 | + | |
| 51 | + binding.webview.setWebViewClient(new WebViewClient() { | |
| 52 | + @Override | |
| 53 | + public boolean shouldOverrideUrlLoading(WebView view, String url) { | |
| 54 | + view.loadUrl(url); | |
| 55 | + return true; | |
| 56 | + } | |
| 57 | + }); | |
| 58 | + | |
| 59 | + binding.webview.setWebChromeClient(webChromeClient); | |
| 60 | + } | |
| 61 | + | |
| 62 | + private void getBundle() { | |
| 63 | + if (getIntent().hasExtra("url")) path = getIntent().getStringExtra("url"); | |
| 64 | + if (getIntent().hasExtra("title")) title = getIntent().getStringExtra("title"); | |
| 65 | + } | |
| 66 | + | |
| 67 | + public void onWebViewClick(View view) { | |
| 68 | + onBackPressed(); | |
| 69 | + } | |
| 70 | + | |
| 71 | + @Override | |
| 72 | + public void onBackPressed() { | |
| 73 | + if (binding.webview.canGoBack()) { | |
| 74 | + binding.webview.goBack(); | |
| 75 | + }else super.onBackPressed(); | |
| 76 | + } | |
| 77 | + | |
| 78 | + private WebChromeClient webChromeClient = new WebChromeClient() { | |
| 79 | + @Override | |
| 80 | + public void onProgressChanged(WebView view, int newProgress) { | |
| 81 | + if (newProgress >= 100) { | |
| 82 | + if (binding.webviewProgressbar != null) { | |
| 83 | + binding.webviewProgressbar.setVisibility(View.GONE); | |
| 84 | + } | |
| 85 | + } else { | |
| 86 | + if (binding.webviewProgressbar != null) { | |
| 87 | + binding.webviewProgressbar.setVisibility(View.VISIBLE); | |
| 88 | + binding.webviewProgressbar.setProgress(newProgress); | |
| 89 | + } | |
| 90 | + } | |
| 91 | + } | |
| 92 | + }; | |
| 93 | +} | ... | ... |
app/src/main/res/drawable/downloading_progress_bar.xml
0 → 100644
| 1 | +<?xml version="1.0" encoding="utf-8"?> | |
| 2 | + | |
| 3 | + | |
| 4 | +<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> | |
| 5 | + | |
| 6 | + <item android:id="@android:id/background"> | |
| 7 | + <shape> | |
| 8 | + <corners android:radius="5dip" /> | |
| 9 | + <gradient | |
| 10 | + android:startColor="#D5D5D5" | |
| 11 | + android:centerColor="#D5D5D5" | |
| 12 | + android:endColor="#D5D5D5" /> | |
| 13 | + </shape> | |
| 14 | + </item> | |
| 15 | + | |
| 16 | + <item android:id="@android:id/progress"> | |
| 17 | + <clip> | |
| 18 | + <shape> | |
| 19 | + <corners android:radius="5dip" /> | |
| 20 | + <gradient | |
| 21 | + android:startColor="@color/ff4e51" | |
| 22 | + android:centerColor="@color/ff4e51" | |
| 23 | + android:endColor="@color/ff4e51" /> | |
| 24 | + </shape> | |
| 25 | + </clip> | |
| 26 | + </item> | |
| 27 | + | |
| 28 | +</layer-list> | ... | ... |
app/src/main/res/layout/activity_webview.xml
0 → 100644
| 1 | +<?xml version="1.0" encoding="utf-8"?> | |
| 2 | + | |
| 3 | + | |
| 4 | +<layout xmlns:android="http://schemas.android.com/apk/res/android" | |
| 5 | + xmlns:tools="http://schemas.android.com/tools"> | |
| 6 | + | |
| 7 | + <data> | |
| 8 | + | |
| 9 | + <variable | |
| 10 | + name="title" | |
| 11 | + type="String" /> | |
| 12 | + | |
| 13 | + </data> | |
| 14 | + | |
| 15 | + <RelativeLayout | |
| 16 | + | |
| 17 | + android:id="@+id/linear_web" | |
| 18 | + android:layout_width="match_parent" | |
| 19 | + android:layout_height="match_parent" | |
| 20 | + android:orientation="vertical"> | |
| 21 | + | |
| 22 | + <RelativeLayout | |
| 23 | + android:id="@+id/toobar" | |
| 24 | + android:layout_width="match_parent" | |
| 25 | + android:layout_height="48dp" | |
| 26 | + android:background="@android:color/white"> | |
| 27 | + | |
| 28 | + <ImageButton | |
| 29 | + android:layout_width="32dp" | |
| 30 | + android:layout_height="32dp" | |
| 31 | + android:layout_centerVertical="true" | |
| 32 | + android:layout_marginLeft="10dp" | |
| 33 | + android:background="@null" | |
| 34 | + android:onClick="onWebViewClick" | |
| 35 | + android:scaleType="centerCrop" | |
| 36 | + android:src="@drawable/btn_return" /> | |
| 37 | + | |
| 38 | + | |
| 39 | + <TextView | |
| 40 | + android:id="@+id/title" | |
| 41 | + android:layout_width="wrap_content" | |
| 42 | + android:layout_height="wrap_content" | |
| 43 | + android:layout_centerInParent="true" | |
| 44 | + android:gravity="center" | |
| 45 | + android:text="@{title}" | |
| 46 | + android:textSize="20sp" | |
| 47 | + tools:text="标题" /> | |
| 48 | + </RelativeLayout> | |
| 49 | + | |
| 50 | + <View android:id="@+id/line" | |
| 51 | + android:layout_width="match_parent" | |
| 52 | + android:layout_height="1dp" | |
| 53 | + android:layout_below="@+id/toobar" | |
| 54 | + android:background="@android:color/black" /> | |
| 55 | + | |
| 56 | + <ProgressBar | |
| 57 | + android:id="@+id/webview_progressbar" | |
| 58 | + style="?android:attr/progressBarStyleHorizontal" | |
| 59 | + android:layout_width="match_parent" | |
| 60 | + android:layout_height="1dp" | |
| 61 | + android:layout_below="@+id/toobar" | |
| 62 | + android:focusable="false" | |
| 63 | + android:max="100" | |
| 64 | + android:progress="100" | |
| 65 | + android:progressDrawable="@drawable/downloading_progress_bar" /> | |
| 66 | + | |
| 67 | + <WebView | |
| 68 | + android:id="@+id/webview" | |
| 69 | + android:layout_width="match_parent" | |
| 70 | + android:layout_height="match_parent" | |
| 71 | + android:layout_below="@+id/line" | |
| 72 | + android:background="@android:color/white" /> | |
| 73 | + | |
| 74 | + </RelativeLayout> | |
| 75 | +</layout> | |
| 0 | 76 | \ No newline at end of file | ... | ... |