diff --git a/.gradle/2.10/taskArtifacts/cache.properties.lock b/.gradle/2.10/taskArtifacts/cache.properties.lock index 8028ab66..37a76d8b 100644 Binary files a/.gradle/2.10/taskArtifacts/cache.properties.lock and b/.gradle/2.10/taskArtifacts/cache.properties.lock differ diff --git a/.gradle/2.10/taskArtifacts/fileHashes.bin b/.gradle/2.10/taskArtifacts/fileHashes.bin index 8a7f154f..1370cc4a 100644 Binary files a/.gradle/2.10/taskArtifacts/fileHashes.bin and b/.gradle/2.10/taskArtifacts/fileHashes.bin differ diff --git a/.gradle/2.10/taskArtifacts/fileSnapshots.bin b/.gradle/2.10/taskArtifacts/fileSnapshots.bin index 3ea7460a..60dcdc67 100644 Binary files a/.gradle/2.10/taskArtifacts/fileSnapshots.bin and b/.gradle/2.10/taskArtifacts/fileSnapshots.bin differ diff --git a/.gradle/2.10/taskArtifacts/outputFileStates.bin b/.gradle/2.10/taskArtifacts/outputFileStates.bin index f2e8147b..5b1e1523 100644 Binary files a/.gradle/2.10/taskArtifacts/outputFileStates.bin and b/.gradle/2.10/taskArtifacts/outputFileStates.bin differ diff --git a/.gradle/2.10/taskArtifacts/taskArtifacts.bin b/.gradle/2.10/taskArtifacts/taskArtifacts.bin index 1719f5d5..0ed21563 100644 Binary files a/.gradle/2.10/taskArtifacts/taskArtifacts.bin and b/.gradle/2.10/taskArtifacts/taskArtifacts.bin differ diff --git a/.idea/codeStyleSettings.xml b/.idea/codeStyleSettings.xml new file mode 100644 index 00000000..99254f0b --- /dev/null +++ b/.idea/codeStyleSettings.xml @@ -0,0 +1,229 @@ + + + + + + \ No newline at end of file diff --git a/.idea/dictionaries/AriaL.xml b/.idea/dictionaries/AriaL.xml new file mode 100644 index 00000000..5ba04945 --- /dev/null +++ b/.idea/dictionaries/AriaL.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 5d199810..fbb68289 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -37,7 +37,7 @@ - + diff --git a/app/build.gradle b/app/build.gradle index cbb42cdc..c04ac203 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,7 +1,7 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 'Google Inc.:Google APIs:23' + compileSdkVersion 23 buildToolsVersion "23.0.2" defaultConfig { diff --git a/app/src/androidTest/java/com/example/arial/downloaddemo/ApplicationTest.java b/app/src/androidTest/java/com/example/arial/downloaddemo/ApplicationTest.java index d9b0087c..b0b6aa45 100644 --- a/app/src/androidTest/java/com/example/arial/downloaddemo/ApplicationTest.java +++ b/app/src/androidTest/java/com/example/arial/downloaddemo/ApplicationTest.java @@ -7,7 +7,7 @@ import android.test.ApplicationTestCase; * Testing Fundamentals */ public class ApplicationTest extends ApplicationTestCase { - public ApplicationTest() { - super(Application.class); - } + public ApplicationTest() { + super(Application.class); + } } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2f14585f..bad1ec85 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,29 +1,32 @@ + package="com.arialyy.simple"> - - - + + + - + + - - - - + android:theme="@style/AppTheme.NoActionBar"> + + - - - - + + + + + + + diff --git a/app/src/main/java/com/arialyy/simple/activity/MainActivity.java b/app/src/main/java/com/arialyy/simple/activity/MainActivity.java index ee122586..728b6215 100644 --- a/app/src/main/java/com/arialyy/simple/activity/MainActivity.java +++ b/app/src/main/java/com/arialyy/simple/activity/MainActivity.java @@ -1,90 +1,38 @@ package com.arialyy.simple.activity; -import android.content.BroadcastReceiver; -import android.content.Context; import android.content.Intent; import android.os.Bundle; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; - -import com.arialyy.downloadutil.core.DownloadManager; -import com.arialyy.downloadutil.entity.DownloadEntity; -import com.arialyy.frame.util.show.L; +import android.support.v7.widget.Toolbar; +import android.view.View; +import butterknife.Bind; import com.arialyy.simple.R; -import com.arialyy.simple.adapter.DownloadAdapter; import com.arialyy.simple.base.BaseActivity; import com.arialyy.simple.databinding.ActivityMainBinding; -import com.arialyy.simple.module.DownloadModule; - -import butterknife.Bind; /** - * Created by Lyy on 2016/9/27. + * Created by Lyy on 2016/10/13. */ public class MainActivity extends BaseActivity { - @Bind(R.id.list) RecyclerView mList; - DownloadAdapter mAdapter; + @Bind(R.id.toolbar) Toolbar mBar; - @Override protected int setLayoutId() { - return R.layout.activity_main; - } - - @Override protected void init(Bundle savedInstanceState) { - super.init(savedInstanceState); - mAdapter = new DownloadAdapter(this, getModule(DownloadModule.class).getDownloadData()); - mList.setLayoutManager(new LinearLayoutManager(this)); - mList.setAdapter(mAdapter); - } - - - private BroadcastReceiver mReceiver = new BroadcastReceiver() { - long len = 0; - - @Override public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); - DownloadEntity entity = intent.getParcelableExtra(DownloadManager.ENTITY); - switch (action) { - case DownloadManager.ACTION_PRE: - len = entity.getFileSize(); - L.d(TAG, "download pre"); - break; - case DownloadManager.ACTION_START: - L.d(TAG, "download start"); - break; - case DownloadManager.ACTION_RESUME: - L.d(TAG, "download resume"); - long location = intent.getLongExtra(DownloadManager.CURRENT_LOCATION, 1); - mAdapter.updateState(entity); - break; - case DownloadManager.ACTION_RUNNING: - long current = intent.getLongExtra(DownloadManager.CURRENT_LOCATION, 0); - mAdapter.setProgress(entity.getDownloadUrl(), current); - break; - case DownloadManager.ACTION_STOP: - L.d(TAG, "download stop"); - mAdapter.updateState(entity); - break; - case DownloadManager.ACTION_COMPLETE: - L.d(TAG, "download complete"); - mAdapter.updateState(entity); - break; - case DownloadManager.ACTION_CANCEL: - L.d(TAG, "download cancel"); - break; - case DownloadManager.ACTION_FAIL: - L.d(TAG, "download fail"); - break; - } - } - }; - - @Override protected void onResume() { - super.onResume(); - registerReceiver(mReceiver, getModule(DownloadModule.class).getDownloadFilter()); - } - - @Override protected void onDestroy() { - super.onDestroy(); - unregisterReceiver(mReceiver); + @Override protected int setLayoutId() { + return R.layout.activity_main; + } + + @Override protected void init(Bundle savedInstanceState) { + super.init(savedInstanceState); + setSupportActionBar(mBar); + mBar.setTitle("多线程多任务下载"); + } + + public void onClick(View view) { + switch (view.getId()) { + case R.id.single_task: + startActivity(new Intent(this, SingleTaskActivity.class)); + break; + case R.id.multi_task: + startActivity(new Intent(this, MultiTaskActivity.class)); + break; } + } } diff --git a/app/src/main/java/com/arialyy/simple/activity/MultiTaskActivity.java b/app/src/main/java/com/arialyy/simple/activity/MultiTaskActivity.java new file mode 100644 index 00000000..96073554 --- /dev/null +++ b/app/src/main/java/com/arialyy/simple/activity/MultiTaskActivity.java @@ -0,0 +1,91 @@ +package com.arialyy.simple.activity; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.Toolbar; +import butterknife.Bind; +import com.arialyy.downloadutil.core.DownloadManager; +import com.arialyy.downloadutil.entity.DownloadEntity; +import com.arialyy.frame.util.show.L; +import com.arialyy.simple.R; +import com.arialyy.simple.adapter.DownloadAdapter; +import com.arialyy.simple.base.BaseActivity; +import com.arialyy.simple.databinding.ActivityMultiBinding; +import com.arialyy.simple.module.DownloadModule; + +/** + * Created by Lyy on 2016/9/27. + */ +public class MultiTaskActivity extends BaseActivity { + @Bind(R.id.list) RecyclerView mList; + @Bind(R.id.toolbar) Toolbar mBar; + DownloadAdapter mAdapter; + + @Override protected int setLayoutId() { + return R.layout.activity_multi; + } + + @Override protected void init(Bundle savedInstanceState) { + super.init(savedInstanceState); + setSupportActionBar(mBar); + mBar.setTitle("多任务下载"); + mAdapter = new DownloadAdapter(this, getModule(DownloadModule.class).getDownloadData()); + mList.setLayoutManager(new LinearLayoutManager(this)); + mList.setAdapter(mAdapter); + } + + private BroadcastReceiver mReceiver = new BroadcastReceiver() { + long len = 0; + + @Override public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + DownloadEntity entity = intent.getParcelableExtra(DownloadManager.ENTITY); + switch (action) { + case DownloadManager.ACTION_PRE: + len = entity.getFileSize(); + L.d(TAG, "download pre"); + break; + case DownloadManager.ACTION_START: + L.d(TAG, "download start"); + break; + case DownloadManager.ACTION_RESUME: + L.d(TAG, "download resume"); + long location = intent.getLongExtra(DownloadManager.CURRENT_LOCATION, 1); + mAdapter.updateState(entity); + break; + case DownloadManager.ACTION_RUNNING: + long current = intent.getLongExtra(DownloadManager.CURRENT_LOCATION, 0); + mAdapter.setProgress(entity.getDownloadUrl(), current); + break; + case DownloadManager.ACTION_STOP: + L.d(TAG, "download stop"); + mAdapter.updateState(entity); + break; + case DownloadManager.ACTION_COMPLETE: + L.d(TAG, "download complete"); + mAdapter.updateState(entity); + break; + case DownloadManager.ACTION_CANCEL: + L.d(TAG, "download cancel"); + break; + case DownloadManager.ACTION_FAIL: + L.d(TAG, "download fail"); + break; + } + } + }; + + @Override protected void onResume() { + super.onResume(); + registerReceiver(mReceiver, getModule(DownloadModule.class).getDownloadFilter()); + } + + @Override protected void onDestroy() { + super.onDestroy(); + unregisterReceiver(mReceiver); + } +} diff --git a/app/src/main/java/com/arialyy/simple/activity/SimpleTestActivity.java b/app/src/main/java/com/arialyy/simple/activity/SimpleTestActivity.java deleted file mode 100644 index 5844b0c2..00000000 --- a/app/src/main/java/com/arialyy/simple/activity/SimpleTestActivity.java +++ /dev/null @@ -1,248 +0,0 @@ -package com.arialyy.simple.activity; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.os.Environment; -import android.os.Handler; -import android.os.Message; -import android.support.v7.widget.Toolbar; -import android.view.View; -import android.widget.Button; -import android.widget.ProgressBar; -import android.widget.TextView; -import android.widget.Toast; - -import com.arialyy.downloadutil.core.DownloadManager; -import com.arialyy.downloadutil.core.command.CommandFactory; -import com.arialyy.downloadutil.core.command.IDownloadCommand; -import com.arialyy.downloadutil.entity.DownloadEntity; -import com.arialyy.downloadutil.orm.DbEntity; -import com.arialyy.downloadutil.util.Util; -import com.arialyy.frame.util.show.L; -import com.arialyy.simple.R; -import com.arialyy.simple.base.BaseActivity; -import com.arialyy.simple.databinding.ActivitySimpleBinding; -import com.arialyy.simple.module.DownloadModule; - -import java.util.ArrayList; -import java.util.List; - -import butterknife.Bind; - -public class SimpleTestActivity extends BaseActivity { - private static final int DOWNLOAD_PRE = 0x01; - private static final int DOWNLOAD_STOP = 0x02; - private static final int DOWNLOAD_FAILE = 0x03; - private static final int DOWNLOAD_CANCEL = 0x04; - private static final int DOWNLOAD_RESUME = 0x05; - private static final int DOWNLOAD_COMPLETE = 0x06; - private ProgressBar mPb; - private String mDownloadUrl = "http://static.gaoshouyou.com/d/12/0d/7f120f50c80d2e7b8c4ba24ece4f9cdd.apk"; - private Button mStart, mStop, mCancel; - private TextView mSize; - @Bind(R.id.toolbar) Toolbar toolbar; - private CommandFactory mFactory; - private DownloadManager mManager; - private DownloadEntity mEntity; - - private Handler mUpdateHandler = new Handler() { - @Override public void handleMessage(Message msg) { - super.handleMessage(msg); - switch (msg.what) { - case DOWNLOAD_PRE: - mSize.setText(Util.formatFileSize((Long) msg.obj)); - setBtState(false); - break; - case DOWNLOAD_FAILE: - Toast.makeText(SimpleTestActivity.this, "下载失败", Toast.LENGTH_SHORT).show(); - setBtState(true); - break; - case DOWNLOAD_STOP: - Toast.makeText(SimpleTestActivity.this, "暂停下载", Toast.LENGTH_SHORT).show(); - mStart.setText("恢复"); - setBtState(true); - break; - case DOWNLOAD_CANCEL: - mPb.setProgress(0); - Toast.makeText(SimpleTestActivity.this, "取消下载", Toast.LENGTH_SHORT).show(); - mStart.setText("开始"); - setBtState(true); - break; - case DOWNLOAD_RESUME: - Toast.makeText(SimpleTestActivity.this, - "恢复下载,恢复位置 ==> " + Util.formatFileSize((Long) msg.obj), - Toast.LENGTH_SHORT).show(); - setBtState(false); - break; - case DOWNLOAD_COMPLETE: - Toast.makeText(SimpleTestActivity.this, "下载完成", Toast.LENGTH_SHORT).show(); - mStart.setText("重新开始?"); - mCancel.setEnabled(false); - setBtState(true); - break; - } - } - }; - - /** - * 设置start 和 stop 按钮状态 - * - * @param state - */ - private void setBtState(boolean state) { - mStart.setEnabled(state); - mStop.setEnabled(!state); - } - - private BroadcastReceiver mReceiver = new BroadcastReceiver() { - long len = 0; - - @Override public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); - switch (action) { - case DownloadManager.ACTION_PRE: - DownloadEntity entity = intent.getParcelableExtra(DownloadManager.ENTITY); - len = entity.getFileSize(); - L.d(TAG, "download pre"); - mUpdateHandler.obtainMessage(DOWNLOAD_PRE, len).sendToTarget(); - break; - case DownloadManager.ACTION_START: - L.d(TAG, "download start"); - break; - case DownloadManager.ACTION_RESUME: - L.d(TAG, "download resume"); - long location = intent.getLongExtra(DownloadManager.CURRENT_LOCATION, 1); - mUpdateHandler.obtainMessage(DOWNLOAD_RESUME, location).sendToTarget(); - break; - case DownloadManager.ACTION_RUNNING: - long current = intent.getLongExtra(DownloadManager.CURRENT_LOCATION, 0); - if (len == 0) { - mPb.setProgress(0); - } else { - mPb.setProgress((int) ((current * 100) / len)); - } - break; - case DownloadManager.ACTION_STOP: - L.d(TAG, "download stop"); - mUpdateHandler.sendEmptyMessage(DOWNLOAD_STOP); - break; - case DownloadManager.ACTION_COMPLETE: - mUpdateHandler.sendEmptyMessage(DOWNLOAD_COMPLETE); - break; - case DownloadManager.ACTION_CANCEL: - mUpdateHandler.sendEmptyMessage(DOWNLOAD_CANCEL); - break; - case DownloadManager.ACTION_FAIL: - mUpdateHandler.sendEmptyMessage(DOWNLOAD_FAILE); - break; - } - } - }; - - @Override protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - init(); - } - - @Override protected void onResume() { - super.onResume(); - registerReceiver(mReceiver, getModule(DownloadModule.class).getDownloadFilter()); - } - - @Override protected void onDestroy() { - super.onDestroy(); - unregisterReceiver(mReceiver); - } - - @Override protected int setLayoutId() { - return R.layout.activity_simple; - } - - @Override protected void init(Bundle savedInstanceState) { - super.init(savedInstanceState); - setSupportActionBar(toolbar); - init(); - - } - - private void init() { - mPb = (ProgressBar) findViewById(R.id.progressBar); - mStart = (Button) findViewById(R.id.start); - mStop = (Button) findViewById(R.id.stop); - mCancel = (Button) findViewById(R.id.cancel); - mSize = (TextView) findViewById(R.id.size); - mFactory = CommandFactory.getInstance(); - mManager = DownloadManager.getInstance(); - mEntity = DbEntity.findData(DownloadEntity.class, new String[]{"downloadUrl"}, - new String[]{mDownloadUrl}); - if (mEntity != null) { - mPb.setProgress((int) ((mEntity.getCurrentProgress() * 100) / mEntity.getFileSize())); - mSize.setText(Util.formatFileSize(mEntity.getFileSize())); - if (mEntity.getState() == DownloadEntity.STATE_DOWNLOAD_ING) { - setBtState(false); - } else if (mEntity.isDownloadComplete()) { - mStart.setText("重新开始?"); - setBtState(true); - } - } else { - mEntity = new DownloadEntity(); - } - } - - public void onClick(View view) { - switch (view.getId()) { - case R.id.start: - start(); -// if (PermissionManager.getInstance() -// .checkPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { -// start(); -// } else { -// PermissionManager.getInstance() -// .requestPermission(this, new OnPermissionCallback() { -// @Override public void onSuccess(String... permissions) { -// start(); -// } -// -// @Override public void onFail(String... permissions) { -// -// } -// }, Manifest.permission.WRITE_EXTERNAL_STORAGE); -// } - break; - case R.id.stop: - stop(); - break; - case R.id.cancel: - cancel(); - break; - } - } - - private void start() { - mEntity.setFileName("test.apk"); - mEntity.setDownloadUrl(mDownloadUrl); - mEntity.setDownloadPath(Environment.getExternalStorageDirectory().getPath() + "/test.apk"); - List commands = new ArrayList<>(); - IDownloadCommand addCommand = mFactory.createCommand(this, mEntity, - CommandFactory.TASK_CREATE); - IDownloadCommand startCommand = mFactory.createCommand(this, mEntity, - CommandFactory.TASK_START); - commands.add(addCommand); - commands.add(startCommand); - mManager.setCommands(commands).exe(); - } - - private void stop() { - IDownloadCommand stopCommand = mFactory.createCommand(this, mEntity, - CommandFactory.TASK_STOP); - mManager.setCommand(stopCommand).exe(); - } - - private void cancel() { - IDownloadCommand cancelCommand = mFactory.createCommand(this, mEntity, - CommandFactory.TASK_CANCEL); - mManager.setCommand(cancelCommand).exe(); - } -} diff --git a/app/src/main/java/com/arialyy/simple/activity/SingleTaskActivity.java b/app/src/main/java/com/arialyy/simple/activity/SingleTaskActivity.java new file mode 100644 index 00000000..5cd18592 --- /dev/null +++ b/app/src/main/java/com/arialyy/simple/activity/SingleTaskActivity.java @@ -0,0 +1,241 @@ +package com.arialyy.simple.activity; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.os.Environment; +import android.os.Handler; +import android.os.Message; +import android.support.v7.widget.Toolbar; +import android.view.View; +import android.widget.Button; +import android.widget.ProgressBar; +import android.widget.TextView; +import android.widget.Toast; +import butterknife.Bind; +import com.arialyy.downloadutil.core.DownloadManager; +import com.arialyy.downloadutil.core.command.CommandFactory; +import com.arialyy.downloadutil.core.command.IDownloadCommand; +import com.arialyy.downloadutil.entity.DownloadEntity; +import com.arialyy.downloadutil.orm.DbEntity; +import com.arialyy.downloadutil.util.Util; +import com.arialyy.frame.util.show.L; +import com.arialyy.simple.R; +import com.arialyy.simple.base.BaseActivity; +import com.arialyy.simple.databinding.ActivitySingleBinding; +import com.arialyy.simple.module.DownloadModule; +import java.util.ArrayList; +import java.util.List; + +public class SingleTaskActivity extends BaseActivity { + private static final int DOWNLOAD_PRE = 0x01; + private static final int DOWNLOAD_STOP = 0x02; + private static final int DOWNLOAD_FAILE = 0x03; + private static final int DOWNLOAD_CANCEL = 0x04; + private static final int DOWNLOAD_RESUME = 0x05; + private static final int DOWNLOAD_COMPLETE = 0x06; + private ProgressBar mPb; + private String mDownloadUrl = + "http://static.gaoshouyou.com/d/12/0d/7f120f50c80d2e7b8c4ba24ece4f9cdd.apk"; + private Button mStart, mStop, mCancel; + private TextView mSize; + @Bind(R.id.toolbar) Toolbar toolbar; + private CommandFactory mFactory; + private DownloadManager mManager; + private DownloadEntity mEntity; + + private Handler mUpdateHandler = new Handler() { + @Override public void handleMessage(Message msg) { + super.handleMessage(msg); + switch (msg.what) { + case DOWNLOAD_PRE: + mSize.setText(Util.formatFileSize((Long) msg.obj)); + setBtState(false); + break; + case DOWNLOAD_FAILE: + Toast.makeText(SingleTaskActivity.this, "下载失败", Toast.LENGTH_SHORT).show(); + setBtState(true); + break; + case DOWNLOAD_STOP: + Toast.makeText(SingleTaskActivity.this, "暂停下载", Toast.LENGTH_SHORT).show(); + mStart.setText("恢复"); + setBtState(true); + break; + case DOWNLOAD_CANCEL: + mPb.setProgress(0); + Toast.makeText(SingleTaskActivity.this, "取消下载", Toast.LENGTH_SHORT).show(); + mStart.setText("开始"); + setBtState(true); + break; + case DOWNLOAD_RESUME: + Toast.makeText(SingleTaskActivity.this, + "恢复下载,恢复位置 ==> " + Util.formatFileSize((Long) msg.obj), Toast.LENGTH_SHORT).show(); + setBtState(false); + break; + case DOWNLOAD_COMPLETE: + Toast.makeText(SingleTaskActivity.this, "下载完成", Toast.LENGTH_SHORT).show(); + mStart.setText("重新开始?"); + mCancel.setEnabled(false); + setBtState(true); + break; + } + } + }; + + /** + * 设置start 和 stop 按钮状态 + */ + private void setBtState(boolean state) { + mStart.setEnabled(state); + mStop.setEnabled(!state); + } + + private BroadcastReceiver mReceiver = new BroadcastReceiver() { + long len = 0; + + @Override public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + switch (action) { + case DownloadManager.ACTION_PRE: + DownloadEntity entity = intent.getParcelableExtra(DownloadManager.ENTITY); + len = entity.getFileSize(); + L.d(TAG, "download pre"); + mUpdateHandler.obtainMessage(DOWNLOAD_PRE, len).sendToTarget(); + break; + case DownloadManager.ACTION_START: + L.d(TAG, "download start"); + break; + case DownloadManager.ACTION_RESUME: + L.d(TAG, "download resume"); + long location = intent.getLongExtra(DownloadManager.CURRENT_LOCATION, 1); + mUpdateHandler.obtainMessage(DOWNLOAD_RESUME, location).sendToTarget(); + break; + case DownloadManager.ACTION_RUNNING: + long current = intent.getLongExtra(DownloadManager.CURRENT_LOCATION, 0); + if (len == 0) { + mPb.setProgress(0); + } else { + mPb.setProgress((int) ((current * 100) / len)); + } + break; + case DownloadManager.ACTION_STOP: + L.d(TAG, "download stop"); + mUpdateHandler.sendEmptyMessage(DOWNLOAD_STOP); + break; + case DownloadManager.ACTION_COMPLETE: + mUpdateHandler.sendEmptyMessage(DOWNLOAD_COMPLETE); + break; + case DownloadManager.ACTION_CANCEL: + mUpdateHandler.sendEmptyMessage(DOWNLOAD_CANCEL); + break; + case DownloadManager.ACTION_FAIL: + mUpdateHandler.sendEmptyMessage(DOWNLOAD_FAILE); + break; + } + } + }; + + @Override protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + init(); + } + + @Override protected void onResume() { + super.onResume(); + registerReceiver(mReceiver, getModule(DownloadModule.class).getDownloadFilter()); + } + + @Override protected void onDestroy() { + super.onDestroy(); + unregisterReceiver(mReceiver); + } + + @Override protected int setLayoutId() { + return R.layout.activity_single; + } + + @Override protected void init(Bundle savedInstanceState) { + super.init(savedInstanceState); + setSupportActionBar(toolbar); + toolbar.setTitle("单任务下载"); + init(); + } + + private void init() { + mPb = (ProgressBar) findViewById(R.id.progressBar); + mStart = (Button) findViewById(R.id.start); + mStop = (Button) findViewById(R.id.stop); + mCancel = (Button) findViewById(R.id.cancel); + mSize = (TextView) findViewById(R.id.size); + mFactory = CommandFactory.getInstance(); + mManager = DownloadManager.getInstance(); + mEntity = DbEntity.findData(DownloadEntity.class, new String[] { "downloadUrl" }, + new String[] { mDownloadUrl }); + if (mEntity != null) { + mPb.setProgress((int) ((mEntity.getCurrentProgress() * 100) / mEntity.getFileSize())); + mSize.setText(Util.formatFileSize(mEntity.getFileSize())); + if (mEntity.getState() == DownloadEntity.STATE_DOWNLOAD_ING) { + setBtState(false); + } else if (mEntity.isDownloadComplete()) { + mStart.setText("重新开始?"); + setBtState(true); + } + } else { + mEntity = new DownloadEntity(); + } + } + + public void onClick(View view) { + switch (view.getId()) { + case R.id.start: + start(); + // if (PermissionManager.getInstance() + // .checkPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { + // start(); + // } else { + // PermissionManager.getInstance() + // .requestPermission(this, new OnPermissionCallback() { + // @Override public void onSuccess(String... permissions) { + // start(); + // } + // + // @Override public void onFail(String... permissions) { + // + // } + // }, Manifest.permission.WRITE_EXTERNAL_STORAGE); + // } + break; + case R.id.stop: + stop(); + break; + case R.id.cancel: + cancel(); + break; + } + } + + private void start() { + mEntity.setFileName("test.apk"); + mEntity.setDownloadUrl(mDownloadUrl); + mEntity.setDownloadPath(Environment.getExternalStorageDirectory().getPath() + "/test.apk"); + List commands = new ArrayList<>(); + IDownloadCommand addCommand = mFactory.createCommand(this, mEntity, CommandFactory.TASK_CREATE); + IDownloadCommand startCommand = + mFactory.createCommand(this, mEntity, CommandFactory.TASK_START); + commands.add(addCommand); + commands.add(startCommand); + mManager.setCommands(commands).exe(); + } + + private void stop() { + IDownloadCommand stopCommand = mFactory.createCommand(this, mEntity, CommandFactory.TASK_STOP); + mManager.setCommand(stopCommand).exe(); + } + + private void cancel() { + IDownloadCommand cancelCommand = + mFactory.createCommand(this, mEntity, CommandFactory.TASK_CANCEL); + mManager.setCommand(cancelCommand).exe(); + } +} diff --git a/app/src/main/java/com/arialyy/simple/adapter/DownloadAdapter.java b/app/src/main/java/com/arialyy/simple/adapter/DownloadAdapter.java index a6725d03..87fa84e5 100644 --- a/app/src/main/java/com/arialyy/simple/adapter/DownloadAdapter.java +++ b/app/src/main/java/com/arialyy/simple/adapter/DownloadAdapter.java @@ -4,7 +4,7 @@ import android.content.Context; import android.content.res.Resources; import android.view.View; import android.widget.Button; - +import butterknife.Bind; import com.arialyy.absadapter.common.AbsHolder; import com.arialyy.absadapter.recycler_view.AbsRVAdapter; import com.arialyy.downloadutil.core.DownloadManager; @@ -14,165 +14,162 @@ import com.arialyy.downloadutil.entity.DownloadEntity; import com.arialyy.frame.util.show.L; import com.arialyy.simple.R; import com.arialyy.simple.widget.HorizontalProgressBarWithNumber; - import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; -import butterknife.Bind; - /** * Created by Lyy on 2016/9/27. * 下载列表适配器 */ public class DownloadAdapter extends AbsRVAdapter { - private static final String TAG = "DownloadAdapter"; - private DownloadManager mManager; - private CommandFactory mFactory; - private Map mProgress = new HashMap<>(); - private Map mPositions = new HashMap<>(); + private static final String TAG = "DownloadAdapter"; + private DownloadManager mManager; + private CommandFactory mFactory; + private Map mProgress = new HashMap<>(); + private Map mPositions = new HashMap<>(); - public DownloadAdapter(Context context, List data) { - super(context, data); - int i = 0; - for (DownloadEntity entity : data) { - mProgress.put(entity.getDownloadUrl(), entity.getCurrentProgress()); - mPositions.put(entity.getDownloadUrl(), i); - i++; - } - mFactory = CommandFactory.getInstance(); - mManager = DownloadManager.getInstance(); + public DownloadAdapter(Context context, List data) { + super(context, data); + int i = 0; + for (DownloadEntity entity : data) { + mProgress.put(entity.getDownloadUrl(), entity.getCurrentProgress()); + mPositions.put(entity.getDownloadUrl(), i); + i++; + } + mFactory = CommandFactory.getInstance(); + mManager = DownloadManager.getInstance(); + } + + @Override protected MyHolder getViewHolder(View convertView, int viewType) { + return new MyHolder(convertView); + } + + @Override protected int setLayoutId(int type) { + return R.layout.item_download; + } + + public synchronized void updateState(DownloadEntity entity) { + notifyItemChanged(indexItem(entity.getDownloadUrl())); + } + + public synchronized void setProgress(String url, long currentPosition) { + mProgress.put(url, currentPosition); + // int index = indexItem(url); + // L.d(TAG, "index ==> " + index); + // notifyItemChanged(index); + notifyItemChanged(indexItem(url)); + } + + private synchronized int indexItem(String url) { + Set set = mPositions.entrySet(); + for (Object aSet : set) { + Map.Entry entry = (Map.Entry) aSet; + if (entry.getKey().equals(url)) { + return (int) entry.getValue(); + } + } + return -1; + } + + @Override protected void bindData(MyHolder holder, int position, DownloadEntity item) { + //holder.progress.setProgress(item.getCurrentProgress()); + long size = item.getFileSize(); + int current = 0; + if (size == 0) { + current = 0; + } + current = (int) (mProgress.get(item.getDownloadUrl()) * 100 / item.getFileSize()); + holder.progress.setProgress(current); + BtClickListener listener = new BtClickListener(position, item); + holder.bt.setOnClickListener(listener); + String str = ""; + int color = android.R.color.holo_green_light; + switch (item.getState()) { + case DownloadEntity.STATE_WAIT: + case DownloadEntity.STATE_OTHER: + case DownloadEntity.STATE_FAIL: + str = "开始"; + break; + case DownloadEntity.STATE_STOP: + str = "恢复"; + color = android.R.color.holo_blue_light; + break; + case DownloadEntity.STATE_DOWNLOAD_ING: + str = "暂停"; + color = android.R.color.holo_red_light; + break; + case DownloadEntity.STATE_COMPLETE: + str = "重新开始?"; + holder.progress.setProgress(100); + break; + } + holder.bt.setText(str); + holder.bt.setTextColor(getColor(color)); + } + + private int getColor(int color) { + return Resources.getSystem().getColor(color); + } + + private class BtClickListener implements View.OnClickListener { + private DownloadEntity entity; + private int position; + + BtClickListener(int position, DownloadEntity entity) { + this.entity = entity; + this.position = position; } - @Override protected MyHolder getViewHolder(View convertView, int viewType) { - return new MyHolder(convertView); + @Override public void onClick(View v) { + L.d(TAG, "position ==> " + position); + switch (entity.getState()) { + case DownloadEntity.STATE_WAIT: + case DownloadEntity.STATE_OTHER: + case DownloadEntity.STATE_FAIL: + case DownloadEntity.STATE_STOP: + case DownloadEntity.STATE_COMPLETE: + start(entity); + break; + case DownloadEntity.STATE_DOWNLOAD_ING: + stop(entity); + break; + } } - @Override protected int setLayoutId(int type) { - return R.layout.item_download; + private void start(DownloadEntity entity) { + + List commands = new ArrayList<>(); + IDownloadCommand addCommand = + mFactory.createCommand(getContext(), entity, CommandFactory.TASK_CREATE); + IDownloadCommand startCommand = + mFactory.createCommand(getContext(), entity, CommandFactory.TASK_START); + commands.add(addCommand); + commands.add(startCommand); + mManager.setCommands(commands).exe(); } - public synchronized void updateState(DownloadEntity entity) { - notifyItemChanged(indexItem(entity.getDownloadUrl())); + private void stop(DownloadEntity entity) { + IDownloadCommand stopCommand = + mFactory.createCommand(getContext(), entity, CommandFactory.TASK_STOP); + mManager.setCommand(stopCommand).exe(); } - public synchronized void setProgress(String url, long currentPosition) { - mProgress.put(url, currentPosition); -// int index = indexItem(url); -// L.d(TAG, "index ==> " + index); -// notifyItemChanged(index); - notifyItemChanged(indexItem(url)); + private void cancel(DownloadEntity entity) { + IDownloadCommand cancelCommand = + mFactory.createCommand(getContext(), entity, CommandFactory.TASK_CANCEL); + mManager.setCommand(cancelCommand).exe(); } + } - private synchronized int indexItem(String url) { - Set set = mPositions.entrySet(); - for (Object aSet : set) { - Map.Entry entry = (Map.Entry) aSet; - if (entry.getKey().equals(url)) { - return (int) entry.getValue(); - } - } - return -1; - } - - @Override protected void bindData(MyHolder holder, int position, DownloadEntity item) { - //holder.progress.setProgress(item.getCurrentProgress()); - long size = item.getFileSize(); - int current = 0; - if (size == 0) { - current = 0; - } - current = (int) (mProgress.get(item.getDownloadUrl()) * 100 / item.getFileSize()); - holder.progress.setProgress(current); - BtClickListener listener = new BtClickListener(position, item); - holder.bt.setOnClickListener(listener); - String str = ""; - int color = android.R.color.holo_green_light; - switch (item.getState()) { - case DownloadEntity.STATE_WAIT: - case DownloadEntity.STATE_OTHER: - case DownloadEntity.STATE_FAIL: - str = "开始"; - break; - case DownloadEntity.STATE_STOP: - str = "恢复"; - color = android.R.color.holo_blue_light; - break; - case DownloadEntity.STATE_DOWNLOAD_ING: - str = "暂停"; - color = android.R.color.holo_red_light; - break; - case DownloadEntity.STATE_COMPLETE: - str = "重新开始?"; - holder.progress.setProgress(100); - break; - } - holder.bt.setText(str); - holder.bt.setTextColor(getColor(color)); - } - - private int getColor(int color) { - return Resources.getSystem().getColor(color); - } - - private class BtClickListener implements View.OnClickListener { - private DownloadEntity entity; - private int position; - - BtClickListener(int position, DownloadEntity entity) { - this.entity = entity; - this.position = position; - } - - @Override public void onClick(View v) { - L.d(TAG, "position ==> " + position); - switch (entity.getState()) { - case DownloadEntity.STATE_WAIT: - case DownloadEntity.STATE_OTHER: - case DownloadEntity.STATE_FAIL: - case DownloadEntity.STATE_STOP: - case DownloadEntity.STATE_COMPLETE: - start(entity); - break; - case DownloadEntity.STATE_DOWNLOAD_ING: - stop(entity); - break; - } - } - - private void start(DownloadEntity entity) { - - List commands = new ArrayList<>(); - IDownloadCommand addCommand = mFactory.createCommand(getContext(), entity, - CommandFactory.TASK_CREATE); - IDownloadCommand startCommand = mFactory.createCommand(getContext(), entity, - CommandFactory.TASK_START); - commands.add(addCommand); - commands.add(startCommand); - mManager.setCommands(commands).exe(); - } - - private void stop(DownloadEntity entity) { - IDownloadCommand stopCommand = mFactory.createCommand(getContext(), entity, - CommandFactory.TASK_STOP); - mManager.setCommand(stopCommand).exe(); - } - - private void cancel(DownloadEntity entity) { - IDownloadCommand cancelCommand = mFactory.createCommand(getContext(), entity, - CommandFactory.TASK_CANCEL); - mManager.setCommand(cancelCommand).exe(); - } - } - - class MyHolder extends AbsHolder { - @Bind(R.id.progressBar) HorizontalProgressBarWithNumber progress; - @Bind(R.id.bt) Button bt; - - MyHolder(View itemView) { - super(itemView); - } + class MyHolder extends AbsHolder { + @Bind(R.id.progressBar) HorizontalProgressBarWithNumber progress; + @Bind(R.id.bt) Button bt; + + MyHolder(View itemView) { + super(itemView); } + } } diff --git a/app/src/main/java/com/arialyy/simple/base/BaseActivity.java b/app/src/main/java/com/arialyy/simple/base/BaseActivity.java index 74a5a1f9..6a1013bd 100644 --- a/app/src/main/java/com/arialyy/simple/base/BaseActivity.java +++ b/app/src/main/java/com/arialyy/simple/base/BaseActivity.java @@ -2,18 +2,17 @@ package com.arialyy.simple.base; import android.databinding.ViewDataBinding; import android.os.Bundle; - import com.arialyy.frame.core.AbsActivity; /** * Created by Lyy on 2016/9/27. */ public abstract class BaseActivity extends AbsActivity { - @Override protected void dataCallback(int result, Object data) { + @Override protected void dataCallback(int result, Object data) { - } + } - @Override protected void init(Bundle savedInstanceState) { - super.init(savedInstanceState); - } + @Override protected void init(Bundle savedInstanceState) { + super.init(savedInstanceState); + } } diff --git a/app/src/main/java/com/arialyy/simple/base/BaseApplication.java b/app/src/main/java/com/arialyy/simple/base/BaseApplication.java index 37a39c84..1b07a75a 100644 --- a/app/src/main/java/com/arialyy/simple/base/BaseApplication.java +++ b/app/src/main/java/com/arialyy/simple/base/BaseApplication.java @@ -1,7 +1,6 @@ package com.arialyy.simple.base; import android.app.Application; - import com.arialyy.downloadutil.core.DownloadManager; import com.arialyy.frame.core.AbsFrame; @@ -9,9 +8,9 @@ import com.arialyy.frame.core.AbsFrame; * Created by Lyy on 2016/9/27. */ public class BaseApplication extends Application { - @Override public void onCreate() { - super.onCreate(); - AbsFrame.init(this); - DownloadManager.init(this); - } + @Override public void onCreate() { + super.onCreate(); + AbsFrame.init(this); + DownloadManager.init(this); + } } diff --git a/app/src/main/java/com/arialyy/simple/base/BaseModule.java b/app/src/main/java/com/arialyy/simple/base/BaseModule.java index 055446ac..fc27dc65 100644 --- a/app/src/main/java/com/arialyy/simple/base/BaseModule.java +++ b/app/src/main/java/com/arialyy/simple/base/BaseModule.java @@ -1,14 +1,13 @@ package com.arialyy.simple.base; import android.content.Context; - import com.arialyy.frame.module.AbsModule; /** * Created by Lyy on 2016/9/27. */ public class BaseModule extends AbsModule { - public BaseModule(Context context) { - super(context); - } + public BaseModule(Context context) { + super(context); + } } diff --git a/app/src/main/java/com/arialyy/simple/module/DownloadModule.java b/app/src/main/java/com/arialyy/simple/module/DownloadModule.java index 26c37711..89073f0e 100644 --- a/app/src/main/java/com/arialyy/simple/module/DownloadModule.java +++ b/app/src/main/java/com/arialyy/simple/module/DownloadModule.java @@ -3,7 +3,6 @@ package com.arialyy.simple.module; import android.content.Context; import android.content.IntentFilter; import android.os.Environment; - import com.arialyy.downloadutil.core.DownloadManager; import com.arialyy.downloadutil.entity.DownloadEntity; import com.arialyy.downloadutil.util.Util; @@ -11,7 +10,6 @@ import com.arialyy.frame.util.AndroidUtils; import com.arialyy.frame.util.StringUtil; import com.arialyy.simple.R; import com.arialyy.simple.base.BaseModule; - import java.io.File; import java.util.ArrayList; import java.util.List; @@ -20,65 +18,95 @@ import java.util.List; * Created by Lyy on 2016/9/27. */ public class DownloadModule extends BaseModule { - public DownloadModule(Context context) { - super(context); - } + public DownloadModule(Context context) { + super(context); + } - /** - * 设置下载数据 - * - * @return - */ - public List getDownloadData() { - List list = DownloadEntity.findAllData(DownloadEntity.class); - if (list == null) { - list = createNewDownload(); + /** + * 设置下载数据 + */ + public List getDownloadData() { + List list = DownloadEntity.findAllData(DownloadEntity.class); + List newDownload = createNewDownload(); + if (list == null) { + list = newDownload; + } else { + list = filter(list, newDownload); + } + return list; + } + + /** + * 过滤任务 + * + * @param sqlEntity 数据库的下载实体 + * @param createdEntity 通过下载链接生成的下载实体 + */ + private List filter(List sqlEntity, + List createdEntity) { + List list = new ArrayList<>(); + list.addAll(sqlEntity); + for (DownloadEntity cEntity : createdEntity) { + int count = 0; + for (DownloadEntity sEntity : sqlEntity) { + if (cEntity.getDownloadUrl().equals(sEntity.getDownloadUrl())) { + break; } - return list; - } - - private List createNewDownload() { - List list = new ArrayList<>(); - String[] urls = getContext().getResources() - .getStringArray(R.array.test_apk_download_url); - for (String url : urls) { - String fileName = Util.keyToHashCode(url) + ".apk"; - DownloadEntity entity = new DownloadEntity(); - entity.setDownloadUrl(url); - entity.setDownloadPath(getDownloadPath(url)); - entity.setFileName(fileName); - list.add(entity); + count++; + if (count == sqlEntity.size()) { + list.add(cEntity); } - return list; + } } + return list; + } - /** - * 下载广播过滤器 - * - * @return - */ - public IntentFilter getDownloadFilter() { - IntentFilter filter = new IntentFilter(); - filter.addDataScheme(getContext().getPackageName()); - filter.addAction(DownloadManager.ACTION_PRE); - filter.addAction(DownloadManager.ACTION_RESUME); - filter.addAction(DownloadManager.ACTION_START); - filter.addAction(DownloadManager.ACTION_RUNNING); - filter.addAction(DownloadManager.ACTION_STOP); - filter.addAction(DownloadManager.ACTION_CANCEL); - filter.addAction(DownloadManager.ACTION_COMPLETE); - filter.addAction(DownloadManager.ACTION_FAIL); - return filter; + /** + * 创建下载列表 + */ + private List createNewDownload() { + List list = new ArrayList<>(); + String[] urls = + getContext().getResources().getStringArray(R.array.test_apk_download_url); + for (String url : urls) { + String fileName = Util.keyToHashCode(url) + ".apk"; + DownloadEntity entity = new DownloadEntity(); + entity.setDownloadUrl(url); + entity.setDownloadPath(getDownloadPath(url)); + entity.setFileName(fileName); + list.add(entity); } + return list; + } - private String getDownloadPath(String url) { - String path = Environment.getExternalStorageDirectory() - .getPath() + "/" + AndroidUtils.getAppName(getContext()) + "downloads/" + StringUtil - .keyToHashKey(url) + ".apk"; - File file = new File(path); - if (!file.getParentFile().exists()) { - file.getParentFile().mkdirs(); - } - return path; + /** + * 下载广播过滤器 + */ + public IntentFilter getDownloadFilter() { + IntentFilter filter = new IntentFilter(); + filter.addDataScheme(getContext().getPackageName()); + filter.addAction(DownloadManager.ACTION_PRE); + filter.addAction(DownloadManager.ACTION_RESUME); + filter.addAction(DownloadManager.ACTION_START); + filter.addAction(DownloadManager.ACTION_RUNNING); + filter.addAction(DownloadManager.ACTION_STOP); + filter.addAction(DownloadManager.ACTION_CANCEL); + filter.addAction(DownloadManager.ACTION_COMPLETE); + filter.addAction(DownloadManager.ACTION_FAIL); + return filter; + } + + /** + * 设置下载队列 + */ + private String getDownloadPath(String url) { + String path = + Environment.getExternalStorageDirectory().getPath() + "/" + AndroidUtils.getAppName( + getContext()) + "downloads/" + StringUtil.keyToHashKey(url) + ".apk"; + File file = new File(path); + if (!file.getParentFile().exists()) { + file.getParentFile().mkdirs(); } + return path; + } } diff --git a/app/src/main/java/com/arialyy/simple/widget/HorizontalProgressBarWithNumber.java b/app/src/main/java/com/arialyy/simple/widget/HorizontalProgressBarWithNumber.java index a32111a7..2d0473ed 100644 --- a/app/src/main/java/com/arialyy/simple/widget/HorizontalProgressBarWithNumber.java +++ b/app/src/main/java/com/arialyy/simple/widget/HorizontalProgressBarWithNumber.java @@ -7,178 +7,177 @@ import android.graphics.Paint; import android.util.AttributeSet; import android.util.TypedValue; import android.widget.ProgressBar; - import com.arialyy.simple.R; public class HorizontalProgressBarWithNumber extends ProgressBar { - private static final int DEFAULT_TEXT_SIZE = 10; - private static final int DEFAULT_TEXT_COLOR = 0XFFFC00D1; - private static final int DEFAULT_COLOR_UNREACHED_COLOR = 0xFFd3d6da; - private static final int DEFAULT_HEIGHT_REACHED_PROGRESS_BAR = 2; - private static final int DEFAULT_HEIGHT_UNREACHED_PROGRESS_BAR = 2; - private static final int DEFAULT_SIZE_TEXT_OFFSET = 10; - /** - * painter of all drawing things - */ - protected Paint mPaint = new Paint(); - /** - * color of progress number - */ - protected int mTextColor = DEFAULT_TEXT_COLOR; - /** - * size of text (sp) - */ - protected int mTextSize = sp2px(DEFAULT_TEXT_SIZE); - /** - * offset of draw progress - */ - protected int mTextOffset = dp2px( - DEFAULT_SIZE_TEXT_OFFSET); - /** - * height of reached progress bar - */ - protected int mReachedProgressBarHeight = dp2px( - DEFAULT_HEIGHT_REACHED_PROGRESS_BAR); - /** - * color of reached bar - */ - protected int mReachedBarColor = DEFAULT_TEXT_COLOR; - /** - * color of unreached bar - */ - protected int mUnReachedBarColor = DEFAULT_COLOR_UNREACHED_COLOR; - /** - * height of unreached progress bar - */ - protected int mUnReachedProgressBarHeight = dp2px( - DEFAULT_HEIGHT_UNREACHED_PROGRESS_BAR); - /** - * view width except padding - */ - protected int mRealWidth; - protected boolean mIfDrawText = true; - protected static final int VISIBLE = 0; + private static final int DEFAULT_TEXT_SIZE = 10; + private static final int DEFAULT_TEXT_COLOR = 0XFFFC00D1; + private static final int DEFAULT_COLOR_UNREACHED_COLOR = 0xFFd3d6da; + private static final int DEFAULT_HEIGHT_REACHED_PROGRESS_BAR = 2; + private static final int DEFAULT_HEIGHT_UNREACHED_PROGRESS_BAR = 2; + private static final int DEFAULT_SIZE_TEXT_OFFSET = 10; + /** + * painter of all drawing things + */ + protected Paint mPaint = new Paint(); + /** + * color of progress number + */ + protected int mTextColor = DEFAULT_TEXT_COLOR; + /** + * size of text (sp) + */ + protected int mTextSize = sp2px(DEFAULT_TEXT_SIZE); + /** + * offset of draw progress + */ + protected int mTextOffset = + dp2px(DEFAULT_SIZE_TEXT_OFFSET); + /** + * height of reached progress bar + */ + protected int mReachedProgressBarHeight = + dp2px(DEFAULT_HEIGHT_REACHED_PROGRESS_BAR); + /** + * color of reached bar + */ + protected int mReachedBarColor = DEFAULT_TEXT_COLOR; + /** + * color of unreached bar + */ + protected int mUnReachedBarColor = DEFAULT_COLOR_UNREACHED_COLOR; + /** + * height of unreached progress bar + */ + protected int mUnReachedProgressBarHeight = + dp2px(DEFAULT_HEIGHT_UNREACHED_PROGRESS_BAR); + /** + * view width except padding + */ + protected int mRealWidth; + protected boolean mIfDrawText = true; + protected static final int VISIBLE = 0; - public HorizontalProgressBarWithNumber(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } + public HorizontalProgressBarWithNumber(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } - public HorizontalProgressBarWithNumber(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - obtainStyledAttributes(attrs); - mPaint.setTextSize(mTextSize); - mPaint.setColor(mTextColor); - } + public HorizontalProgressBarWithNumber(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + obtainStyledAttributes(attrs); + mPaint.setTextSize(mTextSize); + mPaint.setColor(mTextColor); + } - @Override protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - int width = MeasureSpec.getSize(widthMeasureSpec); - int height = measureHeight(heightMeasureSpec); - setMeasuredDimension(width, height); - mRealWidth = getMeasuredWidth() - getPaddingRight() - getPaddingLeft(); - } + @Override protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int width = MeasureSpec.getSize(widthMeasureSpec); + int height = measureHeight(heightMeasureSpec); + setMeasuredDimension(width, height); + mRealWidth = getMeasuredWidth() - getPaddingRight() - getPaddingLeft(); + } - private int measureHeight(int measureSpec) { - int result = 0; - int specMode = MeasureSpec.getMode(measureSpec); - int specSize = MeasureSpec.getSize(measureSpec); - if (specMode == MeasureSpec.EXACTLY) { - result = specSize; - } else { - float textHeight = (mPaint.descent() - mPaint.ascent()); - result = (int) (getPaddingTop() + getPaddingBottom() + Math.max( - Math.max(mReachedProgressBarHeight, mUnReachedProgressBarHeight), - Math.abs(textHeight)) - ); - if (specMode == MeasureSpec.AT_MOST) { - result = Math.min(result, specSize); - } - } - return result; + private int measureHeight(int measureSpec) { + int result = 0; + int specMode = MeasureSpec.getMode(measureSpec); + int specSize = MeasureSpec.getSize(measureSpec); + if (specMode == MeasureSpec.EXACTLY) { + result = specSize; + } else { + float textHeight = (mPaint.descent() - mPaint.ascent()); + result = (int) (getPaddingTop() + getPaddingBottom() + Math.max( + Math.max(mReachedProgressBarHeight, mUnReachedProgressBarHeight), Math.abs(textHeight))); + if (specMode == MeasureSpec.AT_MOST) { + result = Math.min(result, specSize); + } } + return result; + } - /** - * get the styled attributes - */ - private void obtainStyledAttributes(AttributeSet attrs) { - // init values from custom attributes - final TypedArray attributes = getContext().obtainStyledAttributes(attrs, - R.styleable.HorizontalProgressBarWithNumber); - mTextColor = attributes.getColor( - R.styleable.HorizontalProgressBarWithNumber_progress_text_color, - DEFAULT_TEXT_COLOR); - mTextSize = (int) attributes.getDimension( - R.styleable.HorizontalProgressBarWithNumber_progress_text_size, mTextSize); - mReachedBarColor = attributes.getColor( - R.styleable.HorizontalProgressBarWithNumber_progress_reached_color, mTextColor); - mUnReachedBarColor = attributes.getColor( - R.styleable.HorizontalProgressBarWithNumber_progress_unreached_color, - DEFAULT_COLOR_UNREACHED_COLOR); - mReachedProgressBarHeight = (int) attributes.getDimension( - R.styleable.HorizontalProgressBarWithNumber_progress_reached_bar_height, - mReachedProgressBarHeight); - mUnReachedProgressBarHeight = (int) attributes.getDimension( - R.styleable.HorizontalProgressBarWithNumber_progress_unreached_bar_height, - mUnReachedProgressBarHeight); - mTextOffset = (int) attributes.getDimension( - R.styleable.HorizontalProgressBarWithNumber_progress_text_offset, mTextOffset); - int textVisible = attributes.getInt( - R.styleable.HorizontalProgressBarWithNumber_progress_text_visibility, VISIBLE); - if (textVisible != VISIBLE) { - mIfDrawText = false; - } - attributes.recycle(); + /** + * get the styled attributes + */ + private void obtainStyledAttributes(AttributeSet attrs) { + // init values from custom attributes + final TypedArray attributes = + getContext().obtainStyledAttributes(attrs, R.styleable.HorizontalProgressBarWithNumber); + mTextColor = + attributes.getColor(R.styleable.HorizontalProgressBarWithNumber_progress_text_color, + DEFAULT_TEXT_COLOR); + mTextSize = (int) attributes.getDimension( + R.styleable.HorizontalProgressBarWithNumber_progress_text_size, mTextSize); + mReachedBarColor = + attributes.getColor(R.styleable.HorizontalProgressBarWithNumber_progress_reached_color, + mTextColor); + mUnReachedBarColor = + attributes.getColor(R.styleable.HorizontalProgressBarWithNumber_progress_unreached_color, + DEFAULT_COLOR_UNREACHED_COLOR); + mReachedProgressBarHeight = (int) attributes.getDimension( + R.styleable.HorizontalProgressBarWithNumber_progress_reached_bar_height, + mReachedProgressBarHeight); + mUnReachedProgressBarHeight = (int) attributes.getDimension( + R.styleable.HorizontalProgressBarWithNumber_progress_unreached_bar_height, + mUnReachedProgressBarHeight); + mTextOffset = (int) attributes.getDimension( + R.styleable.HorizontalProgressBarWithNumber_progress_text_offset, mTextOffset); + int textVisible = + attributes.getInt(R.styleable.HorizontalProgressBarWithNumber_progress_text_visibility, + VISIBLE); + if (textVisible != VISIBLE) { + mIfDrawText = false; } + attributes.recycle(); + } - @Override protected synchronized void onDraw(Canvas canvas) { - canvas.save(); - canvas.translate(getPaddingLeft(), getHeight() / 2); - boolean noNeedBg = false; - float radio = getProgress() * 1.0f / getMax(); - float progressPosX = (int) (mRealWidth * radio); - String text = getProgress() + "%"; - // mPaint.getTextBounds(text, 0, text.length(), mTextBound); - float textWidth = mPaint.measureText(text); - float textHeight = (mPaint.descent() + mPaint.ascent()) / 2; - if (progressPosX + textWidth > mRealWidth) { - progressPosX = mRealWidth - textWidth; - noNeedBg = true; - } - // draw reached bar - float endX = progressPosX - mTextOffset / 2; - if (endX > 0) { - mPaint.setColor(mReachedBarColor); - mPaint.setStrokeWidth(mReachedProgressBarHeight); - canvas.drawLine(0, 0, endX, 0, mPaint); - } - // draw progress bar - // measure text bound - if (mIfDrawText) { - mPaint.setColor(mTextColor); - canvas.drawText(text, progressPosX, -textHeight, mPaint); - } - // draw unreached bar - if (!noNeedBg) { - float start = progressPosX + mTextOffset / 2 + textWidth; - mPaint.setColor(mUnReachedBarColor); - mPaint.setStrokeWidth(mUnReachedProgressBarHeight); - canvas.drawLine(start, 0, mRealWidth, 0, mPaint); - } - canvas.restore(); + @Override protected synchronized void onDraw(Canvas canvas) { + canvas.save(); + canvas.translate(getPaddingLeft(), getHeight() / 2); + boolean noNeedBg = false; + float radio = getProgress() * 1.0f / getMax(); + float progressPosX = (int) (mRealWidth * radio); + String text = getProgress() + "%"; + // mPaint.getTextBounds(text, 0, text.length(), mTextBound); + float textWidth = mPaint.measureText(text); + float textHeight = (mPaint.descent() + mPaint.ascent()) / 2; + if (progressPosX + textWidth > mRealWidth) { + progressPosX = mRealWidth - textWidth; + noNeedBg = true; } + // draw reached bar + float endX = progressPosX - mTextOffset / 2; + if (endX > 0) { + mPaint.setColor(mReachedBarColor); + mPaint.setStrokeWidth(mReachedProgressBarHeight); + canvas.drawLine(0, 0, endX, 0, mPaint); + } + // draw progress bar + // measure text bound + if (mIfDrawText) { + mPaint.setColor(mTextColor); + canvas.drawText(text, progressPosX, -textHeight, mPaint); + } + // draw unreached bar + if (!noNeedBg) { + float start = progressPosX + mTextOffset / 2 + textWidth; + mPaint.setColor(mUnReachedBarColor); + mPaint.setStrokeWidth(mUnReachedProgressBarHeight); + canvas.drawLine(start, 0, mRealWidth, 0, mPaint); + } + canvas.restore(); + } - /** - * dp 2 px - */ - protected int dp2px(int dpVal) { - return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpVal, - getResources().getDisplayMetrics()); - } + /** + * dp 2 px + */ + protected int dp2px(int dpVal) { + return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpVal, + getResources().getDisplayMetrics()); + } - /** - * sp 2 px - */ - protected int sp2px(int spVal) { - return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, spVal, - getResources().getDisplayMetrics()); - } + /** + * sp 2 px + */ + protected int sp2px(int spVal) { + return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, spVal, + getResources().getDisplayMetrics()); + } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 245771f5..fb7c67ea 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,18 +1,32 @@ - + - + + + +