├── QQMusic.iml ├── README.md ├── app ├── .gitignore ├── app.iml ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── org │ │ └── sang │ │ └── qqmusic │ │ ├── App.java │ │ ├── BaseActivity.java │ │ ├── BaseFragment.java │ │ ├── BasePresenter.java │ │ ├── localMusic │ │ ├── model │ │ │ ├── ILocalData.java │ │ │ └── ILocalDataImpl.java │ │ ├── presenter │ │ │ └── LocalMusicPresenter.java │ │ └── view │ │ │ ├── LocalMusicActivity.java │ │ │ ├── adapter │ │ │ ├── LocalMusicLvAdapter.java │ │ │ └── LocalVpAdapter.java │ │ │ └── fragment │ │ │ ├── ILocalMusicView.java │ │ │ ├── LocalArtistFragment.java │ │ │ └── LocalMusicFragment.java │ │ ├── playMusic │ │ ├── model │ │ │ ├── IPlayerData.java │ │ │ ├── IPlayerDataImpl.java │ │ │ └── OnLrcLoadListener.java │ │ ├── presenter │ │ │ └── PlayerPresenter.java │ │ └── view │ │ │ ├── IPlayerView.java │ │ │ └── PlayerActivity.java │ │ ├── service │ │ ├── DownLoadService.java │ │ └── MusicService.java │ │ ├── showMusic │ │ ├── model │ │ │ ├── ILeftData.java │ │ │ ├── ILeftDataImpl.java │ │ │ ├── IMineData.java │ │ │ ├── IMineDataImpl.java │ │ │ ├── IRightData.java │ │ │ ├── IRightDataImpl.java │ │ │ ├── IShowData.java │ │ │ ├── IShowDataImpl.java │ │ │ ├── OnDataLoadListener.java │ │ │ └── bean │ │ │ │ ├── Category.java │ │ │ │ ├── MusicBean.java │ │ │ │ └── UserBean.java │ │ ├── presenter │ │ │ ├── LeftPresenter.java │ │ │ ├── MinePresenter.java │ │ │ ├── RightPresenter.java │ │ │ └── ShowPresenter.java │ │ └── view │ │ │ ├── IShowView.java │ │ │ ├── MainActivity.java │ │ │ ├── adapter │ │ │ ├── MineFgLvAdapter.java │ │ │ ├── MusicFgVpAdapter.java │ │ │ ├── RvAdapter.java │ │ │ └── VpAdapter.java │ │ │ ├── fragment │ │ │ ├── FindFragment.java │ │ │ ├── ILeftView.java │ │ │ ├── IMineView.java │ │ │ ├── IRightView.java │ │ │ ├── LeftFragment.java │ │ │ ├── MVFragment.java │ │ │ ├── MineFragment.java │ │ │ ├── MusicFragment.java │ │ │ ├── PlayListFragment.java │ │ │ ├── RadioStationFragment.java │ │ │ ├── RankFragment.java │ │ │ ├── RightFragment.java │ │ │ └── SelectFragment.java │ │ │ ├── receiver │ │ │ └── MusicReceiver.java │ │ │ └── view │ │ │ └── MyListView.java │ │ └── util │ │ ├── BitmapCache.java │ │ ├── JsonParse.java │ │ ├── MusicUtil.java │ │ ├── NetUtil.java │ │ ├── PlayUtil.java │ │ └── SDCardUtil.java │ └── res │ ├── drawable │ ├── action_download_normal.png │ ├── action_share_normal.png │ ├── action_sheet_favorite_normal.png │ ├── btn_notification_player_lyric_on_normal.png │ ├── btn_notification_player_next_pressed.png │ ├── btn_notification_player_stop_pressed.png │ ├── callout_popup_pointer_close.png │ ├── circle_bg.xml │ ├── default1.png │ ├── dot_bg.xml │ ├── download_icon.png │ ├── hwpush_ic_toolbar_advance.png │ ├── ic_download_list_item_more.png │ ├── list_random_icon_normal.png │ ├── live_more.png │ ├── live_play_list_button.png │ ├── local_search_icon_normal.png │ ├── main_bg.png │ ├── maintabbar_button_setting_normal.png │ ├── microphone_middle.png │ ├── minibar_btn_playlist_normal.png │ ├── mymusic_icon_allsongs_normal.png │ ├── mymusic_icon_download_normal.png │ ├── mymusic_icon_favorite_normal.png │ ├── mymusic_icon_history_normal.png │ ├── mymusic_icon_mv_normal.png │ ├── mymusic_icon_recognizer_normal.png │ ├── play_download_btn_normal.png │ ├── player_btn_favorite_normal.png │ ├── player_btn_more_normal.png │ ├── player_btn_next_normal.png │ ├── player_btn_playlist_normal.png │ ├── player_btn_pre_normal.png │ ├── player_btn_random_normal.png │ ├── player_btn_repeat_normal.png │ ├── player_btn_repeatone_normal.png │ ├── player_btn_share_normal.png │ ├── ring_btnplay.png │ ├── search.png │ ├── search_stop_btn.png │ ├── superuser_off.png │ ├── tribe_arrows_icon.png │ └── voice_search_button_normal.png │ ├── layout │ ├── activity_main.xml │ ├── activity_player.xml │ ├── activity_show_local_music.xml │ ├── download_nf_layout.xml │ ├── left_fg_item.xml │ ├── left_fg_layout.xml │ ├── localmusic_fg_layout.xml │ ├── localmusic_lv_item.xml │ ├── mine_fg_layout.xml │ ├── mine_fg_lv_item.xml │ ├── music_fg_layout.xml │ ├── nf_layout.xml │ ├── rank_fg_layout.xml │ ├── right_fg_layout.xml │ └── right_fg_rv_item.xml │ ├── mipmap-hdpi │ └── ic_launcher.png │ ├── mipmap-mdpi │ └── ic_launcher.png │ ├── mipmap-xhdpi │ └── ic_launcher.png │ ├── mipmap-xxhdpi │ └── ic_launcher.png │ ├── mipmap-xxxhdpi │ └── ic_launcher.png │ ├── values-w820dp │ └── dimens.xml │ └── values │ ├── colors.xml │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── local.properties ├── lrcview ├── .gitignore ├── build.gradle ├── lrcview.iml ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── org │ │ └── sang │ │ └── lrcview │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── org │ │ │ └── sang │ │ │ └── lrcview │ │ │ ├── LrcView.java │ │ │ ├── bean │ │ │ └── LrcBean.java │ │ │ └── util │ │ │ └── LrcUtil.java │ └── res │ │ └── values │ │ ├── attrs.xml │ │ ├── colors.xml │ │ └── strings.xml │ └── test │ └── java │ └── org │ └── sang │ └── lrcview │ └── ExampleUnitTest.java ├── settings.gradle └── sharesdk ├── .gitignore ├── build.gradle ├── libs ├── MobCommons-2016.0830.1940.jar ├── MobTools-2016.0830.1940.jar ├── ShareSDK-Core-2.7.7.jar ├── ShareSDK-QQ-2.7.7.jar ├── ShareSDK-SinaWeibo-2.7.7.jar ├── ShareSDK-Wechat-2.7.7.jar ├── ShareSDK-Wechat-Core-2.7.7.jar └── ShareSDK-Wechat-Moments-2.7.7.jar ├── proguard-rules.pro ├── sharesdk.iml └── src ├── androidTest └── java │ └── org │ └── sang │ └── sharesdk │ └── ExampleInstrumentedTest.java ├── main ├── AndroidManifest.xml ├── assets │ └── ShareSDK.xml ├── java │ └── cn │ │ └── sharesdk │ │ ├── demo │ │ └── wxapi │ │ │ └── WXEntryActivity.java │ │ └── onekeyshare │ │ ├── CustomerLogo.java │ │ ├── OnekeyShare.java │ │ ├── OnekeySharePage.java │ │ ├── OnekeyShareTheme.java │ │ ├── OnekeyShareThemeImpl.java │ │ ├── ShareContentCustomizeCallback.java │ │ └── themes │ │ └── classic │ │ ├── ClassicTheme.java │ │ ├── EditPage.java │ │ ├── FriendAdapter.java │ │ ├── FriendListItem.java │ │ ├── FriendListPage.java │ │ ├── IndicatorView.java │ │ ├── PRTHeader.java │ │ ├── PicViewerPage.java │ │ ├── PlatformPage.java │ │ ├── PlatformPageAdapter.java │ │ ├── RotateImageView.java │ │ ├── XView.java │ │ ├── land │ │ ├── EditPageLand.java │ │ ├── FriendListPageLand.java │ │ ├── PlatformPageAdapterLand.java │ │ └── PlatformPageLand.java │ │ └── port │ │ ├── EditPagePort.java │ │ ├── FriendListPagePort.java │ │ ├── PlatformPageAdapterPort.java │ │ └── PlatformPagePort.java └── res │ ├── drawable-hdpi │ └── ssdk_oks_ptr_ptr.png │ ├── drawable-xhdpi │ ├── ssdk_auth_title_back.png │ ├── ssdk_back_arr.png │ ├── ssdk_logo.png │ ├── ssdk_oks_classic_alipay.png │ ├── ssdk_oks_classic_bluetooth.png │ ├── ssdk_oks_classic_check_checked.png │ ├── ssdk_oks_classic_check_default.png │ ├── ssdk_oks_classic_douban.png │ ├── ssdk_oks_classic_dropbox.png │ ├── ssdk_oks_classic_email.png │ ├── ssdk_oks_classic_evernote.png │ ├── ssdk_oks_classic_facebook.png │ ├── ssdk_oks_classic_facebookmessenger.png │ ├── ssdk_oks_classic_flickr.png │ ├── ssdk_oks_classic_foursquare.png │ ├── ssdk_oks_classic_googleplus.png │ ├── ssdk_oks_classic_instagram.png │ ├── ssdk_oks_classic_instapaper.png │ ├── ssdk_oks_classic_kaixin.png │ ├── ssdk_oks_classic_kakaostory.png │ ├── ssdk_oks_classic_kakaotalk.png │ ├── ssdk_oks_classic_laiwang.png │ ├── ssdk_oks_classic_laiwangmoments.png │ ├── ssdk_oks_classic_line.png │ ├── ssdk_oks_classic_linkedin.png │ ├── ssdk_oks_classic_mingdao.png │ ├── ssdk_oks_classic_pinterest.png │ ├── ssdk_oks_classic_pocket.png │ ├── ssdk_oks_classic_qq.png │ ├── ssdk_oks_classic_qzone.png │ ├── ssdk_oks_classic_renren.png │ ├── ssdk_oks_classic_shortmessage.png │ ├── ssdk_oks_classic_sinaweibo.png │ ├── ssdk_oks_classic_tencentweibo.png │ ├── ssdk_oks_classic_tumblr.png │ ├── ssdk_oks_classic_twitter.png │ ├── ssdk_oks_classic_vkontakte.png │ ├── ssdk_oks_classic_wechat.png │ ├── ssdk_oks_classic_wechatfavorite.png │ ├── ssdk_oks_classic_wechatmoments.png │ ├── ssdk_oks_classic_whatsapp.png │ ├── ssdk_oks_classic_yixin.png │ ├── ssdk_oks_classic_yixinmoments.png │ ├── ssdk_oks_classic_youdao.png │ └── ssdk_title_div.png │ ├── drawable │ ├── ssdk_oks_classic_platform_cell_back.xml │ └── ssdk_oks_classic_progressbar.xml │ ├── values-en │ ├── ssdk_oks_strings.xml │ └── ssdk_strings.xml │ └── values │ ├── ssdk_instapaper_strings.xml │ ├── ssdk_oks_color_drawables.xml │ ├── ssdk_oks_strings.xml │ └── ssdk_strings.xml └── test └── java └── org └── sang └── sharesdk └── ExampleUnitTest.java /QQMusic.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 一个开源音乐播放器 2 | 3 | **欢迎小伙伴们fork、star、pr** 4 | 5 | ## 效果图 6 | 7 | ### 主页面: 8 | ![1](https://cloud.githubusercontent.com/assets/6023444/19627307/a03b716a-9976-11e6-83de-8ac620fb7591.png) 9 | ### 排行榜页面: 10 | ![2](https://cloud.githubusercontent.com/assets/6023444/19627315/c72a26d6-9976-11e6-86e6-a2fe931d6ff8.png) 11 | ### 播放页面: 12 | ![3](https://cloud.githubusercontent.com/assets/6023444/19627325/f4c9deba-9976-11e6-90c7-030094eefb8d.png) 13 | ### 播放及下载通知页面(Android7.0效果): 14 | ![4](https://cloud.githubusercontent.com/assets/6023444/19627327/0cc4c5ac-9977-11e6-91ea-c334f04c0bdf.png) 15 | ### 播放及下载通知页面(Android4.1效果): 16 | ![6](https://cloud.githubusercontent.com/assets/6023444/19627332/220fc54c-9977-11e6-9726-d9968031883c.png) 17 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 24 5 | buildToolsVersion "24.0.2" 6 | defaultConfig { 7 | applicationId "org.sang.a8_1qqmusic" 8 | minSdkVersion 16 9 | targetSdkVersion 24 10 | versionCode 1 11 | versionName "1.0" 12 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | dataBinding{ 21 | enabled true 22 | } 23 | } 24 | 25 | dependencies { 26 | compile fileTree(include: ['*.jar'], dir: 'libs') 27 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 28 | exclude group: 'com.android.support', module: 'support-annotations' 29 | }) 30 | compile 'com.android.support:appcompat-v7:24.2.1' 31 | testCompile 'junit:junit:4.12' 32 | compile 'org.lenve:customshapeimageview:1.0.0' 33 | compile 'com.android.support:design:24.2.1' 34 | compile 'com.squareup.okhttp3:okhttp:3.4.1' 35 | compile 'com.squareup.picasso:picasso:2.5.2' 36 | compile 'com.android.volley:volley:1.0.0' 37 | compile project(':lrcview') 38 | compile project(':sharesdk') 39 | } 40 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in D:\Program\sdk\android-sdk-windows/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/App.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic; 2 | 3 | import android.app.Application; 4 | 5 | import com.android.volley.RequestQueue; 6 | import com.android.volley.toolbox.Volley; 7 | 8 | import cn.sharesdk.framework.ShareSDK; 9 | 10 | /** 11 | * Created by 王松 on 2016/10/19. 12 | */ 13 | 14 | public class App extends Application { 15 | private RequestQueue requestQueue; 16 | 17 | @Override 18 | public void onCreate() { 19 | super.onCreate(); 20 | ShareSDK.initSDK(this); 21 | requestQueue = Volley.newRequestQueue(this); 22 | } 23 | public RequestQueue getRequestQueue(){ 24 | return requestQueue; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/BaseActivity.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic; 2 | 3 | import android.support.v7.app.AppCompatActivity; 4 | 5 | /** 6 | * Created by 王松 on 2016/10/17. 7 | */ 8 | 9 | public class BaseActivity extends AppCompatActivity { 10 | 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/BaseFragment.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic; 2 | 3 | import android.support.v4.app.Fragment; 4 | 5 | /** 6 | * Created by 王松 on 2016/10/17. 7 | */ 8 | 9 | public class BaseFragment extends Fragment { 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/BasePresenter.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic; 2 | 3 | /** 4 | * Created by 王松 on 2016/10/17. 5 | */ 6 | 7 | public interface BasePresenter { 8 | void start(); 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/localMusic/model/ILocalData.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.localMusic.model; 2 | 3 | import android.content.Context; 4 | 5 | import org.sang.qqmusic.showMusic.model.bean.MusicBean; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * Created by 王松 on 2016/10/18. 11 | */ 12 | 13 | public interface ILocalData { 14 | List getLocalMusic(Context context); 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/localMusic/model/ILocalDataImpl.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.localMusic.model; 2 | 3 | import android.content.ContentResolver; 4 | import android.content.Context; 5 | import android.database.Cursor; 6 | import android.provider.MediaStore; 7 | 8 | import org.sang.qqmusic.showMusic.model.bean.MusicBean; 9 | 10 | import java.util.ArrayList; 11 | import java.util.List; 12 | 13 | /** 14 | * Created by 王松 on 2016/10/18. 15 | */ 16 | 17 | public class ILocalDataImpl implements ILocalData { 18 | @Override 19 | public List getLocalMusic(Context context) { 20 | 21 | List list = new ArrayList<>(); 22 | ContentResolver cr = context.getContentResolver(); 23 | Cursor cursor = cr.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, null); 24 | while (cursor.moveToNext()) { 25 | String musicPath = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA)); 26 | String musicName = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME)); 27 | String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST)); 28 | long duration = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION)); 29 | MusicBean bean = new MusicBean(); 30 | bean.setSongname(musicName); 31 | bean.setUrl(musicPath); 32 | bean.setSingername(artist); 33 | bean.setSeconds((int) (duration/1000)); 34 | list.add(bean); 35 | } 36 | cursor.close(); 37 | return list; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/localMusic/presenter/LocalMusicPresenter.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.localMusic.presenter; 2 | 3 | import android.content.Context; 4 | 5 | import org.sang.qqmusic.BasePresenter; 6 | import org.sang.qqmusic.localMusic.model.ILocalData; 7 | import org.sang.qqmusic.localMusic.model.ILocalDataImpl; 8 | import org.sang.qqmusic.localMusic.view.fragment.ILocalMusicView; 9 | 10 | /** 11 | * Created by 王松 on 2016/10/18. 12 | */ 13 | 14 | public class LocalMusicPresenter implements BasePresenter { 15 | private ILocalMusicView iLocalMusicView; 16 | private ILocalData iLocalData; 17 | 18 | public LocalMusicPresenter(ILocalMusicView iLocalMusicView) { 19 | this.iLocalMusicView = iLocalMusicView; 20 | iLocalData = new ILocalDataImpl(); 21 | } 22 | 23 | public void start(Context context) { 24 | iLocalMusicView.initLv(iLocalData.getLocalMusic(context)); 25 | } 26 | 27 | @Override 28 | public void start() { 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/localMusic/view/LocalMusicActivity.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.localMusic.view; 2 | 3 | import android.os.Bundle; 4 | import android.support.design.widget.TabLayout; 5 | import android.support.v4.app.Fragment; 6 | import android.support.v4.view.ViewPager; 7 | import android.support.v7.app.AppCompatActivity; 8 | 9 | import org.sang.qqmusic.R; 10 | import org.sang.qqmusic.localMusic.view.adapter.LocalVpAdapter; 11 | import org.sang.qqmusic.localMusic.view.fragment.LocalArtistFragment; 12 | import org.sang.qqmusic.localMusic.view.fragment.LocalMusicFragment; 13 | 14 | import java.util.ArrayList; 15 | import java.util.List; 16 | 17 | public class LocalMusicActivity extends AppCompatActivity { 18 | 19 | private ViewPager viewpager; 20 | private TabLayout tabLayout; 21 | 22 | @Override 23 | protected void onCreate(Bundle savedInstanceState) { 24 | super.onCreate(savedInstanceState); 25 | setContentView(R.layout.activity_show_local_music); 26 | initView(); 27 | } 28 | 29 | private void initView() { 30 | viewpager = ((ViewPager) findViewById(R.id.viewpager)); 31 | tabLayout = (TabLayout) findViewById(R.id.tab_layout); 32 | List fragments = new ArrayList<>(); 33 | fragments.add(new LocalMusicFragment()); 34 | fragments.add(new LocalArtistFragment()); 35 | String[] titles = new String[]{"歌曲", "歌手"}; 36 | viewpager.setAdapter(new LocalVpAdapter(getSupportFragmentManager(), fragments, titles)); 37 | tabLayout.setupWithViewPager(viewpager); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/localMusic/view/adapter/LocalMusicLvAdapter.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.localMusic.view.adapter; 2 | 3 | import android.content.Context; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | import android.widget.BaseAdapter; 8 | import android.widget.TextView; 9 | 10 | import org.sang.qqmusic.R; 11 | import org.sang.qqmusic.showMusic.model.bean.MusicBean; 12 | 13 | import java.util.List; 14 | 15 | /** 16 | * Created by 王松 on 2016/10/18. 17 | */ 18 | 19 | public class LocalMusicLvAdapter extends BaseAdapter { 20 | private List list; 21 | private Context context; 22 | private LayoutInflater inflater; 23 | 24 | public LocalMusicLvAdapter(List list, Context context) { 25 | this.list = list; 26 | this.context = context; 27 | inflater = LayoutInflater.from(context); 28 | } 29 | 30 | @Override 31 | public int getCount() { 32 | return list.size(); 33 | } 34 | 35 | @Override 36 | public Object getItem(int position) { 37 | return list.get(position); 38 | } 39 | 40 | @Override 41 | public long getItemId(int position) { 42 | return position; 43 | } 44 | 45 | @Override 46 | public View getView(int position, View convertView, ViewGroup parent) { 47 | ViewHolder holder; 48 | if (convertView == null) { 49 | convertView = inflater.inflate(R.layout.localmusic_lv_item, parent, false); 50 | holder = new ViewHolder(); 51 | holder.artist = (TextView) convertView.findViewById(R.id.artist); 52 | holder.musicName = (TextView) convertView.findViewById(R.id.music_name); 53 | convertView.setTag(holder); 54 | }else{ 55 | holder = (ViewHolder) convertView.getTag(); 56 | } 57 | MusicBean bean = list.get(position); 58 | holder.musicName.setText(bean.getSongname()); 59 | holder.artist.setText(bean.getSingername()); 60 | return convertView; 61 | } 62 | class ViewHolder{ 63 | TextView musicName, artist; 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/localMusic/view/adapter/LocalVpAdapter.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.localMusic.view.adapter; 2 | 3 | import android.support.v4.app.Fragment; 4 | import android.support.v4.app.FragmentManager; 5 | import android.support.v4.app.FragmentPagerAdapter; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * Created by 王松 on 2016/10/18. 11 | */ 12 | 13 | public class LocalVpAdapter extends FragmentPagerAdapter { 14 | private List list; 15 | private String[] titles; 16 | 17 | public LocalVpAdapter(FragmentManager fm, List list, String[] titles) { 18 | super(fm); 19 | this.list = list; 20 | this.titles = titles; 21 | } 22 | 23 | @Override 24 | public Fragment getItem(int position) { 25 | return list.get(position); 26 | } 27 | 28 | @Override 29 | public int getCount() { 30 | return list.size(); 31 | } 32 | 33 | @Override 34 | public CharSequence getPageTitle(int position) { 35 | return titles[position]; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/localMusic/view/fragment/ILocalMusicView.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.localMusic.view.fragment; 2 | 3 | import org.sang.qqmusic.showMusic.model.bean.MusicBean; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * Created by 王松 on 2016/10/18. 9 | */ 10 | 11 | public interface ILocalMusicView { 12 | void initLv(List list); 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/localMusic/view/fragment/LocalArtistFragment.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.localMusic.view.fragment; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.Nullable; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | 9 | import org.sang.qqmusic.BaseFragment; 10 | 11 | /** 12 | * Created by 王松 on 2016/10/18. 13 | */ 14 | 15 | public class LocalArtistFragment extends BaseFragment { 16 | @Nullable 17 | @Override 18 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 19 | return super.onCreateView(inflater, container, savedInstanceState); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/localMusic/view/fragment/LocalMusicFragment.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.localMusic.view.fragment; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.Nullable; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.AdapterView; 9 | import android.widget.ListView; 10 | 11 | import org.sang.qqmusic.BaseFragment; 12 | import org.sang.qqmusic.R; 13 | import org.sang.qqmusic.localMusic.presenter.LocalMusicPresenter; 14 | import org.sang.qqmusic.localMusic.view.adapter.LocalMusicLvAdapter; 15 | import org.sang.qqmusic.showMusic.model.bean.MusicBean; 16 | import org.sang.qqmusic.util.PlayUtil; 17 | 18 | import java.util.List; 19 | 20 | /** 21 | * Created by 王松 on 2016/10/18. 22 | */ 23 | 24 | public class LocalMusicFragment extends BaseFragment implements ILocalMusicView { 25 | private LocalMusicPresenter localMusicPresenter = new LocalMusicPresenter(this); 26 | private ListView lv; 27 | 28 | @Nullable 29 | @Override 30 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 31 | View view = inflater.inflate(R.layout.localmusic_fg_layout, container, false); 32 | initView(view); 33 | localMusicPresenter.start(getActivity()); 34 | return view; 35 | } 36 | 37 | private void initView(View view) { 38 | lv = ((ListView) view.findViewById(R.id.lv)); 39 | } 40 | 41 | @Override 42 | public void initLv(final List list) { 43 | lv.setAdapter(new LocalMusicLvAdapter(list, getActivity())); 44 | lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 45 | @Override 46 | public void onItemClick(AdapterView parent, View view, int position, long id) { 47 | PlayUtil.startService(getActivity(),list.get(position),PlayUtil.PLAY); 48 | } 49 | }); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/playMusic/model/IPlayerData.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.playMusic.model; 2 | 3 | /** 4 | * Created by 王松 on 2016/10/20. 5 | */ 6 | 7 | public interface IPlayerData { 8 | void loadLrc(int id, OnLrcLoadListener onLrcLoadListener); 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/playMusic/model/IPlayerDataImpl.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.playMusic.model; 2 | 3 | import android.util.Log; 4 | 5 | import org.sang.qqmusic.util.JsonParse; 6 | import org.sang.qqmusic.util.NetUtil; 7 | 8 | import java.io.IOException; 9 | 10 | import okhttp3.Call; 11 | import okhttp3.Callback; 12 | import okhttp3.Request; 13 | import okhttp3.Response; 14 | 15 | /** 16 | * Created by 王松 on 2016/10/20. 17 | */ 18 | 19 | public class IPlayerDataImpl implements IPlayerData { 20 | @Override 21 | public void loadLrc(int id, final OnLrcLoadListener onLrcLoadListener) { 22 | String url = String.format(NetUtil.LRCDOWNLOADURL, id); 23 | Log.d("google.sang", "loadLrc: "+url); 24 | Request request = new Request.Builder().url(url).build(); 25 | NetUtil.getClient().newCall(request).enqueue(new Callback() { 26 | @Override 27 | public void onFailure(Call call, IOException e) { 28 | onLrcLoadListener.onLoadFailed(e.getMessage()); 29 | } 30 | 31 | @Override 32 | public void onResponse(Call call, Response response) throws IOException { 33 | if (response.isSuccessful()) { 34 | onLrcLoadListener.onLoadSuccess(JsonParse.parseLrc2List(response.body().string())); 35 | } 36 | } 37 | }); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/playMusic/model/OnLrcLoadListener.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.playMusic.model; 2 | 3 | /** 4 | * Created by 王松 on 2016/10/20. 5 | */ 6 | 7 | public interface OnLrcLoadListener { 8 | void onLoadSuccess(String lrcStr); 9 | 10 | void onLoadFailed(String msg); 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/playMusic/presenter/PlayerPresenter.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.playMusic.presenter; 2 | 3 | import android.os.Handler; 4 | 5 | import org.sang.qqmusic.BasePresenter; 6 | import org.sang.qqmusic.playMusic.model.IPlayerData; 7 | import org.sang.qqmusic.playMusic.model.IPlayerDataImpl; 8 | import org.sang.qqmusic.playMusic.model.OnLrcLoadListener; 9 | import org.sang.qqmusic.playMusic.view.IPlayerView; 10 | 11 | /** 12 | * Created by 王松 on 2016/10/20. 13 | */ 14 | 15 | public class PlayerPresenter implements BasePresenter { 16 | private IPlayerView iPlayerView; 17 | private IPlayerData iPlayerData; 18 | private Handler mHandler = new Handler(); 19 | 20 | public PlayerPresenter(IPlayerView iPlayerView) { 21 | this.iPlayerView = iPlayerView; 22 | iPlayerData = new IPlayerDataImpl(); 23 | } 24 | 25 | @Override 26 | public void start() { 27 | iPlayerView.updatePlayerControl(); 28 | } 29 | 30 | public void loadLrc(int id) { 31 | iPlayerData.loadLrc(id, new OnLrcLoadListener() { 32 | @Override 33 | public void onLoadSuccess(final String lrcStr) { 34 | mHandler.post(new Runnable() { 35 | @Override 36 | public void run() { 37 | iPlayerView.initLrcView(lrcStr); 38 | } 39 | }); 40 | } 41 | 42 | @Override 43 | public void onLoadFailed(String msg) { 44 | 45 | } 46 | }); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/playMusic/view/IPlayerView.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.playMusic.view; 2 | 3 | /** 4 | * Created by 王松 on 2016/10/20. 5 | */ 6 | 7 | public interface IPlayerView { 8 | void updatePlayerControl(); 9 | 10 | void initLrcView(String lrcStr); 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/service/DownLoadService.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.service; 2 | 3 | import android.app.IntentService; 4 | import android.app.Notification; 5 | import android.app.NotificationManager; 6 | import android.content.Intent; 7 | import android.os.Environment; 8 | import android.util.Log; 9 | import android.widget.RemoteViews; 10 | 11 | import org.sang.qqmusic.R; 12 | import org.sang.qqmusic.util.NetUtil; 13 | 14 | import java.io.File; 15 | import java.io.FileOutputStream; 16 | import java.io.IOException; 17 | import java.io.InputStream; 18 | 19 | import okhttp3.Call; 20 | import okhttp3.Callback; 21 | import okhttp3.Request; 22 | import okhttp3.Response; 23 | 24 | /** 25 | * Created by 王松 on 2016/10/21. 26 | */ 27 | 28 | public class DownLoadService extends IntentService { 29 | 30 | private NotificationManager nfManager; 31 | private RemoteViews remoteViews; 32 | private Notification.Builder builder; 33 | 34 | public DownLoadService() { 35 | super(""); 36 | } 37 | 38 | @Override 39 | public void onCreate() { 40 | super.onCreate(); 41 | // remoteViews = new RemoteViews(getPackageName(), R.layout.download_nf_layout); 42 | builder = new Notification.Builder(this); 43 | builder 44 | // .setContent(remoteViews) 45 | .setContentTitle("正在下载...") 46 | .setContentInfo("已下载:") 47 | .setSmallIcon(R.drawable.download_icon); 48 | nfManager = ((NotificationManager) getSystemService(NOTIFICATION_SERVICE)); 49 | nfManager.notify(2,builder.build()); 50 | } 51 | 52 | @Override 53 | protected void onHandleIntent(Intent intent) { 54 | String downloadurl = intent.getStringExtra("downloadurl"); 55 | Log.d("google.sang", "onHandleIntent: "+downloadurl); 56 | final String songid = intent.getStringExtra("songid"); 57 | Log.d("google.sang", "onHandleIntent: "+songid); 58 | Request request = new Request.Builder().url(downloadurl).build(); 59 | NetUtil.getClient().newCall(request).enqueue(new Callback() { 60 | @Override 61 | public void onFailure(Call call, IOException e) { 62 | 63 | } 64 | 65 | @Override 66 | public void onResponse(Call call, Response response) throws IOException { 67 | if (response.isSuccessful()) { 68 | if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { 69 | File myMusic = new File(Environment.getExternalStorageDirectory(), "MyMusic"); 70 | if (!myMusic.exists()) { 71 | myMusic.mkdirs(); 72 | } 73 | FileOutputStream fos = new FileOutputStream(new File(myMusic, songid+".mp3")); 74 | InputStream is = response.body().byteStream(); 75 | byte[] buf = new byte[1024]; 76 | int len = 0; 77 | int currentLength = 0; 78 | int totalLength = (int) response.body().contentLength(); 79 | while ((len = is.read(buf)) != -1) { 80 | fos.write(buf, 0, len); 81 | fos.flush(); 82 | 83 | currentLength += len; 84 | builder.setProgress(totalLength, currentLength, false); 85 | builder.setContentInfo("已下载:" + (int) ((currentLength * 1.0f / totalLength) * 100) + "%"); 86 | // remoteViews.setProgressBar(R.id.pb, totalLength, currentLength, false); 87 | // remoteViews.setTextViewText(R.id.current_percent, (int) ((currentLength * 1.0f / totalLength) * 100) + "%"); 88 | nfManager.notify(2,builder.build()); 89 | } 90 | } 91 | 92 | } 93 | } 94 | }); 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/service/MusicService.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.service; 2 | 3 | import android.app.Notification; 4 | import android.app.NotificationManager; 5 | import android.app.PendingIntent; 6 | import android.app.Service; 7 | import android.content.Intent; 8 | import android.graphics.Bitmap; 9 | import android.graphics.BitmapFactory; 10 | import android.os.IBinder; 11 | import android.support.annotation.Nullable; 12 | import android.widget.RemoteViews; 13 | 14 | import org.sang.qqmusic.R; 15 | import org.sang.qqmusic.util.PlayUtil; 16 | 17 | import java.io.File; 18 | 19 | /** 20 | * Created by 王松 on 2016/10/18. 21 | */ 22 | 23 | public class MusicService extends Service { 24 | 25 | private NotificationManager nfManager; 26 | private RemoteViews remoteViews; 27 | private Notification.Builder builder; 28 | private static final int STOPSERVICE = 3; 29 | 30 | @Nullable 31 | @Override 32 | public IBinder onBind(Intent intent) { 33 | return null; 34 | } 35 | 36 | @Override 37 | public void onCreate() { 38 | super.onCreate(); 39 | builder = new Notification.Builder(this); 40 | remoteViews = new RemoteViews(getPackageName(), R.layout.nf_layout); 41 | Intent intent = new Intent(this, MusicService.class); 42 | intent.putExtra("type", STOPSERVICE); 43 | PendingIntent pendingIntent = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_ONE_SHOT); 44 | remoteViews.setOnClickPendingIntent(R.id.nf_close_btn, pendingIntent); 45 | builder.setContent(remoteViews).setSmallIcon(R.drawable.default1); 46 | startForeground(1, builder.build()); 47 | nfManager = ((NotificationManager) getSystemService(NOTIFICATION_SERVICE)); 48 | } 49 | 50 | @Override 51 | public int onStartCommand(Intent intent, int flags, int startId) { 52 | int type = intent.getIntExtra("type", PlayUtil.STOP); 53 | String musicName = intent.getStringExtra("musicName"); 54 | remoteViews.setTextViewText(R.id.music_name, musicName); 55 | String albumpic_small = PlayUtil.currentMusic.getAlbumpic_small(); 56 | if (albumpic_small != null && !"".equals(albumpic_small)) { 57 | String fileName = albumpic_small.substring(albumpic_small.lastIndexOf("/") + 1); 58 | Bitmap bitmap = BitmapFactory.decodeFile(new File(this.getExternalCacheDir(), fileName).getAbsolutePath()); 59 | if (bitmap!=null) { 60 | remoteViews.setImageViewBitmap(R.id.music_thumbnail, bitmap); 61 | } 62 | } 63 | nfManager.notify(1, builder.build()); 64 | switch (type) { 65 | case PlayUtil.PLAY: 66 | PlayUtil.play(this, intent.getStringExtra("musicPath")); 67 | break; 68 | case PlayUtil.PAUSE: 69 | PlayUtil.pause(); 70 | break; 71 | case PlayUtil.STOP: 72 | PlayUtil.stop(); 73 | break; 74 | case STOPSERVICE: 75 | stopSelf(); 76 | sendBroadcast(new Intent(PlayUtil.STOPSERVICE_ACTION)); 77 | break; 78 | } 79 | return super.onStartCommand(intent, flags, startId); 80 | } 81 | 82 | @Override 83 | public void onDestroy() { 84 | super.onDestroy(); 85 | PlayUtil.stop(); 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/showMusic/model/ILeftData.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.showMusic.model; 2 | 3 | import org.sang.qqmusic.showMusic.model.bean.Category; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * Created by 王松 on 2016/10/19. 9 | */ 10 | 11 | public interface ILeftData { 12 | List getCategory(); 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/showMusic/model/ILeftDataImpl.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.showMusic.model; 2 | 3 | import org.sang.qqmusic.showMusic.model.bean.Category; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | /** 9 | * Created by 王松 on 2016/10/19. 10 | */ 11 | 12 | public class ILeftDataImpl implements ILeftData { 13 | @Override 14 | public List getCategory() { 15 | List list = new ArrayList<>(); 16 | list.add(new Category("欧美",3)); 17 | list.add(new Category("内地",5)); 18 | list.add(new Category("港台",6)); 19 | list.add(new Category("韩国",16)); 20 | list.add(new Category("日本",17)); 21 | list.add(new Category("民谣",18)); 22 | list.add(new Category("摇滚",19)); 23 | list.add(new Category("销量",23)); 24 | list.add(new Category("热歌",26)); 25 | return list; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/showMusic/model/IMineData.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.showMusic.model; 2 | 3 | import org.sang.qqmusic.showMusic.model.bean.MusicBean; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * Created by 王松 on 2016/10/17. 9 | */ 10 | 11 | public interface IMineData { 12 | 13 | void getPlayList(OnDataLoadListener onDataLoadListener); 14 | 15 | List getLocalMusic(); 16 | } 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/showMusic/model/IMineDataImpl.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.showMusic.model; 2 | 3 | import android.os.Environment; 4 | 5 | import org.sang.qqmusic.showMusic.model.bean.MusicBean; 6 | 7 | import java.io.File; 8 | import java.io.FileFilter; 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | 12 | /** 13 | * Created by 王松 on 2016/10/17. 14 | */ 15 | 16 | public class IMineDataImpl implements IMineData { 17 | 18 | //正常情况下在这里调用网络接口,获取我的歌单的数 19 | @Override 20 | public void getPlayList(final OnDataLoadListener onDataLoadListener) { 21 | new Thread(new Runnable() { 22 | @Override 23 | public void run() { 24 | List list = new ArrayList<>(); 25 | File rootFile = new File(Environment.getExternalStorageDirectory(),"qqmusic"+File.separator+"song"); 26 | getMp3(list, rootFile); 27 | if (list.size() > 3) { 28 | //从List集合 中 截取前三项数据 29 | list = list.subList(0, 3); 30 | } 31 | onDataLoadListener.onLoadSuccess(list); 32 | } 33 | }).start(); 34 | } 35 | 36 | //获取本地所有的音频文件 37 | //1.去ContentProvider中查找 38 | //2.遍历SDCard,搜索出所有的mp3文件 39 | @Override 40 | public List getLocalMusic() { 41 | final List list = new ArrayList<>(); 42 | File rootFile = new File(Environment.getExternalStorageDirectory(),"qqmusic"+File.separator+"song"); 43 | getMp3(list, rootFile); 44 | return list; 45 | } 46 | 47 | private void getMp3(final List list, File rootFile) { 48 | rootFile.listFiles(new FileFilter() { 49 | @Override 50 | public boolean accept(File pathname) { 51 | if (pathname.isFile()) { 52 | if (pathname.getName().endsWith(".mp3")) { 53 | String musicName = pathname.getName(); 54 | String musicPath = pathname.getAbsolutePath(); 55 | MusicBean bean = new MusicBean(); 56 | bean.setSongname(musicName); 57 | bean.setUrl(musicPath); 58 | list.add(bean); 59 | return true; 60 | } 61 | } else { 62 | getMp3(list, pathname); 63 | } 64 | return false; 65 | } 66 | }); 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/showMusic/model/IRightData.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.showMusic.model; 2 | 3 | /** 4 | * Created by 王松 on 2016/10/19. 5 | */ 6 | 7 | public interface IRightData { 8 | void getPlayList(int id, OnDataLoadListener onDataLoadListener); 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/showMusic/model/IRightDataImpl.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.showMusic.model; 2 | 3 | import org.sang.qqmusic.util.JsonParse; 4 | import org.sang.qqmusic.util.NetUtil; 5 | 6 | import java.io.IOException; 7 | 8 | import okhttp3.Call; 9 | import okhttp3.Callback; 10 | import okhttp3.Request; 11 | import okhttp3.Response; 12 | 13 | /** 14 | * Created by 王松 on 2016/10/19. 15 | */ 16 | 17 | public class IRightDataImpl implements IRightData { 18 | @Override 19 | public void getPlayList(int id, final OnDataLoadListener onDataLoadListener) { 20 | final Request request = new Request.Builder().url(String.format(NetUtil.PLAYLISTURL, id)).build(); 21 | NetUtil.getClient().newCall(request).enqueue(new Callback() { 22 | @Override 23 | public void onFailure(Call call, IOException e) { 24 | onDataLoadListener.onLoadFailed(e.getMessage()); 25 | } 26 | 27 | @Override 28 | public void onResponse(Call call, Response response) throws IOException { 29 | if (response.isSuccessful()) { 30 | onDataLoadListener.onLoadSuccess(JsonParse.parseJson2List(response.body().string())); 31 | } 32 | } 33 | }); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/showMusic/model/IShowData.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.showMusic.model; 2 | 3 | import android.content.Context; 4 | 5 | import org.sang.qqmusic.showMusic.model.bean.MusicBean; 6 | 7 | /** 8 | * Created by 王松 on 2016/10/18. 9 | */ 10 | 11 | public interface IShowData { 12 | void saveData(MusicBean musicBean, Context context); 13 | 14 | MusicBean loadData(Context context); 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/showMusic/model/IShowDataImpl.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.showMusic.model; 2 | 3 | import android.content.Context; 4 | import android.content.SharedPreferences; 5 | 6 | import org.sang.qqmusic.showMusic.model.bean.MusicBean; 7 | import org.sang.qqmusic.util.MusicUtil; 8 | 9 | /** 10 | * Created by 王松 on 2016/10/18. 11 | */ 12 | 13 | public class IShowDataImpl implements IShowData { 14 | @Override 15 | public void saveData(MusicBean musicBean, Context context) { 16 | SharedPreferences sp = context.getSharedPreferences(MusicUtil.MUSICBEAN, Context.MODE_PRIVATE); 17 | SharedPreferences.Editor edit = sp.edit(); 18 | edit.putString("musicPath", musicBean.getUrl()); 19 | edit.putString("musicName", musicBean.getSongname()); 20 | edit.putInt("Seconds", musicBean.getSeconds()); 21 | edit.putInt("id", musicBean.getSongid()); 22 | edit.commit(); 23 | } 24 | 25 | @Override 26 | public MusicBean loadData(Context context) { 27 | MusicBean bean = new MusicBean(); 28 | SharedPreferences sp = context.getSharedPreferences(MusicUtil.MUSICBEAN, Context.MODE_PRIVATE); 29 | bean.setSongname(sp.getString("musicName", "")); 30 | bean.setUrl(sp.getString("musicPath", "")); 31 | bean.setSongid(sp.getInt("id", 0)); 32 | bean.setSeconds(sp.getInt("Seconds", 0)); 33 | return bean; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/showMusic/model/OnDataLoadListener.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.showMusic.model; 2 | 3 | import org.sang.qqmusic.showMusic.model.bean.MusicBean; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * Created by 王松 on 2016/10/17. 9 | */ 10 | 11 | public interface OnDataLoadListener { 12 | void onLoadSuccess(List list); 13 | 14 | void onLoadFailed(String errorMsg); 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/showMusic/model/bean/Category.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.showMusic.model.bean; 2 | 3 | /** 4 | * Created by 王松 on 2016/10/19. 5 | */ 6 | 7 | public class Category { 8 | private String category; 9 | private int id; 10 | 11 | public Category() { 12 | } 13 | 14 | public String getCategory() { 15 | return category; 16 | } 17 | 18 | public void setCategory(String category) { 19 | this.category = category; 20 | } 21 | 22 | public int getId() { 23 | return id; 24 | } 25 | 26 | public void setId(int id) { 27 | this.id = id; 28 | } 29 | 30 | public Category(String category, int id) { 31 | this.category = category; 32 | this.id = id; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/showMusic/model/bean/UserBean.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.showMusic.model.bean; 2 | 3 | /** 4 | * Created by 王松 on 2016/10/17. 5 | */ 6 | 7 | public class UserBean { 8 | private String username; 9 | private String userface; 10 | private long time; 11 | 12 | public String getUsername() { 13 | return username; 14 | } 15 | 16 | public void setUsername(String username) { 17 | this.username = username; 18 | } 19 | 20 | public String getUserface() { 21 | return userface; 22 | } 23 | 24 | public void setUserface(String userface) { 25 | this.userface = userface; 26 | } 27 | 28 | public long getTime() { 29 | return time; 30 | } 31 | 32 | public void setTime(long time) { 33 | this.time = time; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/showMusic/presenter/LeftPresenter.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.showMusic.presenter; 2 | 3 | import org.sang.qqmusic.BasePresenter; 4 | import org.sang.qqmusic.showMusic.model.ILeftData; 5 | import org.sang.qqmusic.showMusic.model.ILeftDataImpl; 6 | import org.sang.qqmusic.showMusic.view.fragment.ILeftView; 7 | 8 | /** 9 | * Created by 王松 on 2016/10/19. 10 | */ 11 | 12 | public class LeftPresenter implements BasePresenter { 13 | private ILeftView iLeftView; 14 | private ILeftData iLeftData; 15 | 16 | public LeftPresenter(ILeftView iLeftView) { 17 | this.iLeftView = iLeftView; 18 | iLeftData = new ILeftDataImpl(); 19 | } 20 | 21 | @Override 22 | public void start() { 23 | iLeftView.initContainer(iLeftData.getCategory()); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/showMusic/presenter/MinePresenter.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.showMusic.presenter; 2 | 3 | import android.os.Handler; 4 | 5 | import org.sang.qqmusic.BasePresenter; 6 | import org.sang.qqmusic.showMusic.model.IMineData; 7 | import org.sang.qqmusic.showMusic.model.IMineDataImpl; 8 | import org.sang.qqmusic.showMusic.model.OnDataLoadListener; 9 | import org.sang.qqmusic.showMusic.model.bean.MusicBean; 10 | import org.sang.qqmusic.showMusic.view.fragment.IMineView; 11 | 12 | import java.util.List; 13 | 14 | /** 15 | * 该Presenter对应MineFragment 16 | */ 17 | 18 | public class MinePresenter implements BasePresenter { 19 | private IMineData iMineData; 20 | private IMineView iMineView; 21 | private Handler mHandler = new Handler(); 22 | 23 | public MinePresenter(IMineView iMineView) { 24 | this.iMineView = iMineView; 25 | iMineData = new IMineDataImpl(); 26 | } 27 | 28 | @Override 29 | public void start() { 30 | new Thread(new Runnable() { 31 | @Override 32 | public void run() { 33 | iMineData.getPlayList(new OnDataLoadListener() { 34 | @Override 35 | public void onLoadSuccess(final List list) { 36 | mHandler.post(new Runnable() { 37 | @Override 38 | public void run() { 39 | iMineView.setPlayList(list); 40 | 41 | } 42 | }); 43 | } 44 | 45 | @Override 46 | public void onLoadFailed(String errorMsg) { 47 | 48 | } 49 | }); 50 | } 51 | }).start(); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/showMusic/presenter/RightPresenter.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.showMusic.presenter; 2 | 3 | import android.os.Handler; 4 | 5 | import org.sang.qqmusic.BasePresenter; 6 | import org.sang.qqmusic.showMusic.model.IRightData; 7 | import org.sang.qqmusic.showMusic.model.IRightDataImpl; 8 | import org.sang.qqmusic.showMusic.model.OnDataLoadListener; 9 | import org.sang.qqmusic.showMusic.model.bean.MusicBean; 10 | import org.sang.qqmusic.showMusic.view.fragment.IRightView; 11 | 12 | import java.util.List; 13 | 14 | /** 15 | * Created by 王松 on 2016/10/19. 16 | */ 17 | 18 | public class RightPresenter implements BasePresenter { 19 | private IRightView iRightView; 20 | private IRightData iRightData; 21 | private Handler mHandler = new Handler(); 22 | 23 | public RightPresenter(IRightView iRightView) { 24 | this.iRightView = iRightView; 25 | iRightData = new IRightDataImpl(); 26 | } 27 | 28 | public void start(int id) { 29 | iRightData.getPlayList(id, new OnDataLoadListener() { 30 | @Override 31 | public void onLoadSuccess(final List list) { 32 | mHandler.post(new Runnable() { 33 | @Override 34 | public void run() { 35 | iRightView.initRv(list); 36 | } 37 | }); 38 | } 39 | 40 | @Override 41 | public void onLoadFailed(final String errorMsg) { 42 | mHandler.post(new Runnable() { 43 | @Override 44 | public void run() { 45 | iRightView.showErrorMsg(errorMsg); 46 | } 47 | }); 48 | } 49 | }); 50 | } 51 | 52 | 53 | @Override 54 | public void start() { 55 | 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/showMusic/presenter/ShowPresenter.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.showMusic.presenter; 2 | 3 | import android.content.Context; 4 | 5 | import org.sang.qqmusic.BasePresenter; 6 | import org.sang.qqmusic.showMusic.model.IShowData; 7 | import org.sang.qqmusic.showMusic.model.IShowDataImpl; 8 | import org.sang.qqmusic.showMusic.model.bean.MusicBean; 9 | import org.sang.qqmusic.showMusic.view.IShowView; 10 | import org.sang.qqmusic.util.PlayUtil; 11 | 12 | /** 13 | * Created by 王松 on 2016/10/18. 14 | */ 15 | 16 | public class ShowPresenter implements BasePresenter { 17 | private IShowView iShowView; 18 | private IShowData iShowData; 19 | 20 | public ShowPresenter(IShowView iShowView) { 21 | this.iShowView = iShowView; 22 | iShowData = new IShowDataImpl(); 23 | } 24 | 25 | public void saveData(MusicBean musicBean) { 26 | iShowData.saveData(musicBean, (Context) iShowView); 27 | } 28 | 29 | public void loadData(int type) { 30 | if (type== PlayUtil.LOCALMUSICBEAN) { 31 | iShowView.updateMainBottom(iShowData.loadData((Context) iShowView)); 32 | } else if (type == PlayUtil.PLAYUTILMUSICBEAN) { 33 | iShowView.updateMainBottom(PlayUtil.currentMusic); 34 | } 35 | } 36 | 37 | @Override 38 | public void start() { 39 | 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/showMusic/view/IShowView.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.showMusic.view; 2 | 3 | import org.sang.qqmusic.showMusic.model.bean.MusicBean; 4 | 5 | /** 6 | * Created by 王松 on 2016/10/17. 7 | */ 8 | 9 | public interface IShowView { 10 | void updateMainBottom(MusicBean musicBean); 11 | 12 | void updateBottomPauseBtn(); 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/showMusic/view/MainActivity.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.showMusic.view; 2 | 3 | import android.content.Intent; 4 | import android.content.IntentFilter; 5 | import android.graphics.Bitmap; 6 | import android.os.Bundle; 7 | import android.support.v4.app.Fragment; 8 | import android.support.v4.view.ViewPager; 9 | import android.view.View; 10 | import android.widget.ImageView; 11 | import android.widget.TextView; 12 | 13 | import org.lenve.customshapeimageview.CustomShapeImageView; 14 | import org.sang.qqmusic.BaseActivity; 15 | import org.sang.qqmusic.R; 16 | import org.sang.qqmusic.playMusic.view.PlayerActivity; 17 | import org.sang.qqmusic.showMusic.model.bean.MusicBean; 18 | import org.sang.qqmusic.showMusic.presenter.ShowPresenter; 19 | import org.sang.qqmusic.showMusic.view.adapter.VpAdapter; 20 | import org.sang.qqmusic.showMusic.view.fragment.FindFragment; 21 | import org.sang.qqmusic.showMusic.view.fragment.MineFragment; 22 | import org.sang.qqmusic.showMusic.view.fragment.MusicFragment; 23 | import org.sang.qqmusic.showMusic.view.receiver.MusicReceiver; 24 | import org.sang.qqmusic.util.MusicUtil; 25 | import org.sang.qqmusic.util.PlayUtil; 26 | 27 | import java.util.ArrayList; 28 | import java.util.List; 29 | 30 | public class MainActivity extends BaseActivity implements IShowView { 31 | 32 | private CustomShapeImageView musicThumbnail; 33 | private TextView musicName; 34 | private ImageView playOrPause; 35 | private ShowPresenter showPresenter = new ShowPresenter(this); 36 | private MusicReceiver musicReceiver; 37 | 38 | @Override 39 | protected void onCreate(Bundle savedInstanceState) { 40 | super.onCreate(savedInstanceState); 41 | setContentView(R.layout.activity_main); 42 | IntentFilter filter = new IntentFilter(); 43 | filter.addAction(PlayUtil.STOPSERVICE_ACTION); 44 | filter.addAction(PlayUtil.UPDATE_BOTTOM_MUSIC_MSG_ACTION); 45 | musicReceiver = new MusicReceiver(); 46 | registerReceiver(musicReceiver, filter); 47 | initView(); 48 | showPresenter.loadData(PlayUtil.LOCALMUSICBEAN); 49 | } 50 | 51 | @Override 52 | protected void onResume() { 53 | super.onResume(); 54 | showPresenter.loadData(PlayUtil.PLAYUTILMUSICBEAN); 55 | } 56 | 57 | private void initView() { 58 | ViewPager viewpager = (ViewPager) findViewById(R.id.viewpager); 59 | List list = new ArrayList<>(); 60 | list.add(new MineFragment()); 61 | list.add(new MusicFragment()); 62 | list.add(new FindFragment()); 63 | viewpager.setAdapter(new VpAdapter(getSupportFragmentManager(), list)); 64 | musicThumbnail = ((CustomShapeImageView) findViewById(R.id.music_thumbnail)); 65 | musicName = ((TextView) findViewById(R.id.music_name)); 66 | playOrPause = ((ImageView) findViewById(R.id.play_or_pause)); 67 | } 68 | 69 | @Override 70 | public void updateMainBottom(MusicBean musicBean) { 71 | PlayUtil.currentMusic = musicBean; 72 | musicName.setText(musicBean.getSongname()); 73 | Bitmap bitmap = MusicUtil.getThumbnail(musicBean.getUrl()); 74 | if (bitmap != null) { 75 | musicThumbnail.setImageBitmap(bitmap); 76 | } else { 77 | musicThumbnail.setImageResource(R.drawable.default1); 78 | } 79 | updatePauseBtn(); 80 | } 81 | 82 | private void updatePauseBtn() { 83 | if (PlayUtil.CURRENT_STATE == PlayUtil.PLAY) { 84 | playOrPause.setImageResource(R.drawable.search_stop_btn); 85 | } else { 86 | playOrPause.setImageResource(R.drawable.ring_btnplay); 87 | } 88 | } 89 | 90 | @Override 91 | public void updateBottomPauseBtn() { 92 | updatePauseBtn(); 93 | } 94 | 95 | public void playOrPause(View view) { 96 | if (PlayUtil.CURRENT_STATE == PlayUtil.STOP) { 97 | playOrPause.setImageResource(R.drawable.search_stop_btn); 98 | PlayUtil.startService(this, PlayUtil.currentMusic, PlayUtil.PLAY); 99 | } else if (PlayUtil.CURRENT_STATE == PlayUtil.PAUSE) { 100 | playOrPause.setImageResource(R.drawable.search_stop_btn); 101 | PlayUtil.startService(this, PlayUtil.currentMusic, PlayUtil.PAUSE); 102 | } else { 103 | playOrPause.setImageResource(R.drawable.ring_btnplay); 104 | PlayUtil.startService(this, PlayUtil.currentMusic, PlayUtil.PAUSE); 105 | } 106 | } 107 | 108 | @Override 109 | protected void onDestroy() { 110 | super.onDestroy(); 111 | unregisterReceiver(musicReceiver); 112 | showPresenter.saveData(PlayUtil.currentMusic); 113 | } 114 | 115 | public void goPlayerActivity(View view) { 116 | Intent intent = new Intent(this, PlayerActivity.class); 117 | startActivity(intent); 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/showMusic/view/adapter/MineFgLvAdapter.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.showMusic.view.adapter; 2 | 3 | import android.content.Context; 4 | import android.graphics.Bitmap; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.BaseAdapter; 9 | import android.widget.ImageView; 10 | import android.widget.TextView; 11 | 12 | import org.sang.qqmusic.R; 13 | import org.sang.qqmusic.showMusic.model.bean.MusicBean; 14 | import org.sang.qqmusic.util.MusicUtil; 15 | 16 | import java.util.List; 17 | 18 | /** 19 | * Created by 王松 on 2016/10/17. 20 | */ 21 | 22 | public class MineFgLvAdapter extends BaseAdapter { 23 | private List list; 24 | private Context context; 25 | private LayoutInflater inflater; 26 | 27 | public MineFgLvAdapter(List list, Context context) { 28 | this.list = list; 29 | this.context = context; 30 | inflater = LayoutInflater.from(context); 31 | } 32 | 33 | @Override 34 | public int getCount() { 35 | return list.size(); 36 | } 37 | 38 | @Override 39 | public Object getItem(int position) { 40 | return list.get(position); 41 | } 42 | 43 | @Override 44 | public long getItemId(int position) { 45 | return position; 46 | } 47 | 48 | @Override 49 | public View getView(int position, View convertView, ViewGroup parent) { 50 | ViewHolder holder; 51 | if (convertView == null) { 52 | convertView = inflater.inflate(R.layout.mine_fg_lv_item, parent, false); 53 | holder = new ViewHolder(); 54 | holder.musicName = (TextView) convertView.findViewById(R.id.music_name); 55 | holder.musicThumbnail = (ImageView) convertView.findViewById(R.id.music_thumbnail); 56 | convertView.setTag(holder); 57 | } else { 58 | holder = (ViewHolder) convertView.getTag(); 59 | } 60 | MusicBean musicBean = list.get(position); 61 | holder.musicName.setText(musicBean.getSongname()); 62 | holder.musicName.setSelected(true); 63 | Bitmap bitmap = MusicUtil.getThumbnail(musicBean.getUrl()); 64 | if (bitmap != null) { 65 | holder.musicThumbnail.setImageBitmap(bitmap); 66 | }else{ 67 | holder.musicThumbnail.setImageResource(R.drawable.default1); 68 | } 69 | return convertView; 70 | } 71 | 72 | class ViewHolder { 73 | TextView musicName; 74 | ImageView musicThumbnail; 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/showMusic/view/adapter/MusicFgVpAdapter.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.showMusic.view.adapter; 2 | 3 | import android.support.v4.app.Fragment; 4 | import android.support.v4.app.FragmentManager; 5 | import android.support.v4.app.FragmentPagerAdapter; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * Created by 王松 on 2016/10/17. 11 | */ 12 | 13 | public class MusicFgVpAdapter extends FragmentPagerAdapter { 14 | 15 | private List list; 16 | private String[] titles; 17 | 18 | public MusicFgVpAdapter(FragmentManager fm, List list, String[] titles) { 19 | super(fm); 20 | this.list = list; 21 | this.titles = titles; 22 | } 23 | 24 | @Override 25 | public Fragment getItem(int position) { 26 | return list.get(position); 27 | } 28 | 29 | @Override 30 | public int getCount() { 31 | return list.size(); 32 | } 33 | 34 | @Override 35 | public CharSequence getPageTitle(int position) { 36 | return titles[position]; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/showMusic/view/adapter/RvAdapter.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.showMusic.view.adapter; 2 | 3 | import android.content.Context; 4 | import android.databinding.DataBindingUtil; 5 | import android.databinding.ViewDataBinding; 6 | import android.support.v7.widget.RecyclerView; 7 | import android.view.LayoutInflater; 8 | import android.view.View; 9 | import android.view.ViewGroup; 10 | 11 | import java.util.List; 12 | 13 | /** 14 | * Created by 王松 on 2016/10/19. 15 | */ 16 | 17 | public class RvAdapter extends RecyclerView.Adapter { 18 | private Context context; 19 | private List list; 20 | private LayoutInflater inflater; 21 | private int layoutResId; 22 | private int variableId; 23 | 24 | public RvAdapter(Context context, List list, int layoutResId, int variableId) { 25 | this.context = context; 26 | this.list = list; 27 | this.layoutResId = layoutResId; 28 | this.variableId = variableId; 29 | inflater = LayoutInflater.from(context); 30 | } 31 | 32 | @Override 33 | public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 34 | ViewDataBinding binding = DataBindingUtil.inflate(inflater, layoutResId, parent, false); 35 | return new MyViewHolder(binding); 36 | } 37 | 38 | @Override 39 | public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 40 | ((MyViewHolder) holder).getDataBinding().setVariable(variableId, list.get(position)); 41 | } 42 | 43 | @Override 44 | public int getItemCount() { 45 | return list.size(); 46 | } 47 | private class MyViewHolder extends RecyclerView.ViewHolder{ 48 | 49 | private ViewDataBinding dataBinding; 50 | public MyViewHolder(ViewDataBinding dataBinding) { 51 | super(dataBinding.getRoot()); 52 | this.dataBinding = dataBinding; 53 | dataBinding.getRoot().setOnClickListener(new View.OnClickListener() { 54 | @Override 55 | public void onClick(View v) { 56 | if (onItemClickListener != null) { 57 | onItemClickListener.onItemClick(getLayoutPosition()); 58 | } 59 | } 60 | }); 61 | } 62 | public ViewDataBinding getDataBinding() { 63 | return dataBinding; 64 | } 65 | } 66 | public interface OnItemClickListener{ 67 | void onItemClick(int position); 68 | } 69 | 70 | private OnItemClickListener onItemClickListener; 71 | 72 | public void setOnItemClickListener(OnItemClickListener onItemClickListener) { 73 | this.onItemClickListener = onItemClickListener; 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/showMusic/view/adapter/VpAdapter.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.showMusic.view.adapter; 2 | 3 | import android.support.v4.app.Fragment; 4 | import android.support.v4.app.FragmentManager; 5 | import android.support.v4.app.FragmentPagerAdapter; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * Created by 王松 on 2016/10/17. 11 | */ 12 | 13 | public class VpAdapter extends FragmentPagerAdapter { 14 | private List fragments; 15 | 16 | public VpAdapter(FragmentManager fm, List fragments) { 17 | super(fm); 18 | this.fragments = fragments; 19 | } 20 | 21 | @Override 22 | public int getCount() { 23 | return fragments.size(); 24 | } 25 | 26 | @Override 27 | public Fragment getItem(int position) { 28 | return fragments.get(position); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/showMusic/view/fragment/FindFragment.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.showMusic.view.fragment; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.Nullable; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | 9 | import org.sang.qqmusic.BaseFragment; 10 | import org.sang.qqmusic.R; 11 | 12 | /** 13 | * Created by 王松 on 2016/10/17. 14 | */ 15 | 16 | public class FindFragment extends BaseFragment { 17 | @Nullable 18 | @Override 19 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 20 | View view = inflater.inflate(R.layout.mine_fg_layout, container, false); 21 | return view; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/showMusic/view/fragment/ILeftView.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.showMusic.view.fragment; 2 | 3 | import org.sang.qqmusic.showMusic.model.bean.Category; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * Created by 王松 on 2016/10/19. 9 | */ 10 | 11 | public interface ILeftView { 12 | void initContainer(List list); 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/showMusic/view/fragment/IMineView.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.showMusic.view.fragment; 2 | 3 | import org.sang.qqmusic.showMusic.model.bean.MusicBean; 4 | import org.sang.qqmusic.showMusic.model.bean.UserBean; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * Created by 王松 on 2016/10/17. 10 | */ 11 | 12 | public interface IMineView { 13 | void setUserInfo(UserBean userBean); 14 | 15 | void setPlayList(List list); 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/showMusic/view/fragment/IRightView.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.showMusic.view.fragment; 2 | 3 | import org.sang.qqmusic.showMusic.model.bean.MusicBean; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * Created by 王松 on 2016/10/19. 9 | */ 10 | 11 | public interface IRightView { 12 | void initRv(List list); 13 | 14 | void showErrorMsg(String errorMsg); 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/showMusic/view/fragment/LeftFragment.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.showMusic.view.fragment; 2 | 3 | import android.graphics.Color; 4 | import android.os.Bundle; 5 | import android.support.annotation.Nullable; 6 | import android.view.LayoutInflater; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | import android.widget.LinearLayout; 10 | import android.widget.TextView; 11 | 12 | import org.sang.qqmusic.BaseFragment; 13 | import org.sang.qqmusic.R; 14 | import org.sang.qqmusic.showMusic.model.bean.Category; 15 | import org.sang.qqmusic.showMusic.presenter.LeftPresenter; 16 | 17 | import java.util.List; 18 | 19 | /** 20 | * Created by 王松 on 2016/10/19. 21 | */ 22 | 23 | public class LeftFragment extends BaseFragment implements ILeftView{ 24 | private LeftPresenter leftPresenter = new LeftPresenter(this); 25 | private LinearLayout container; 26 | private RightFragment rightFragment; 27 | 28 | @Nullable 29 | @Override 30 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 31 | View view = inflater.inflate(R.layout.left_fg_layout, container, false); 32 | initVieww(view); 33 | leftPresenter.start(); 34 | return view; 35 | } 36 | 37 | private void initVieww(View view) { 38 | this.container = ((LinearLayout) view.findViewById(R.id.container)); 39 | } 40 | 41 | @Override 42 | public void initContainer(final List list) { 43 | LayoutInflater inflater = LayoutInflater.from(getActivity()); 44 | for (int i = 0; i < list.size(); i++) { 45 | View view = inflater.inflate(R.layout.left_fg_item, container, false); 46 | TextView cateName = (TextView) view.findViewById(R.id.cate_name); 47 | cateName.setText(list.get(i).getCategory()); 48 | container.addView(view); 49 | final int finalI = i; 50 | view.setOnClickListener(new View.OnClickListener() { 51 | @Override 52 | public void onClick(View v) { 53 | updateContainer(finalI); 54 | rightFragment.updateRv(list.get(finalI).getId()); 55 | } 56 | }); 57 | } 58 | View view = container.getChildAt(0); 59 | TextView cateName = (TextView) view.findViewById(R.id.cate_name); 60 | View cateLine = view.findViewById(R.id.cate_line); 61 | cateName.setTextColor(getResources().getColor(R.color.colorPrimary)); 62 | cateLine.setVisibility(View.VISIBLE); 63 | } 64 | 65 | public void setRightFragment(RightFragment rightFragment) { 66 | this.rightFragment = rightFragment; 67 | } 68 | 69 | private void updateContainer(int finalI) { 70 | int count = container.getChildCount(); 71 | for (int i = 0; i < count; i++) { 72 | View view = container.getChildAt(i); 73 | TextView cateName = (TextView) view.findViewById(R.id.cate_name); 74 | View cateLine = view.findViewById(R.id.cate_line); 75 | if (i == finalI) { 76 | cateName.setTextColor(getResources().getColor(R.color.colorPrimary)); 77 | cateLine.setVisibility(View.VISIBLE); 78 | }else{ 79 | cateName.setTextColor(Color.BLACK); 80 | cateLine.setVisibility(View.GONE); 81 | } 82 | } 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/showMusic/view/fragment/MVFragment.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.showMusic.view.fragment; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.Nullable; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.TextView; 9 | 10 | import org.sang.qqmusic.BaseFragment; 11 | 12 | /** 13 | * Created by 王松 on 2016/10/17. 14 | */ 15 | 16 | public class MVFragment extends BaseFragment { 17 | @Nullable 18 | @Override 19 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 20 | TextView tv = new TextView(getActivity()); 21 | tv.setText("MV"); 22 | return tv; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/showMusic/view/fragment/MineFragment.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.showMusic.view.fragment; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | import android.os.Bundle; 6 | import android.os.Handler; 7 | import android.support.annotation.Nullable; 8 | import android.view.LayoutInflater; 9 | import android.view.View; 10 | import android.view.ViewGroup; 11 | import android.widget.AdapterView; 12 | import android.widget.LinearLayout; 13 | import android.widget.TextView; 14 | 15 | import org.sang.qqmusic.BaseFragment; 16 | import org.sang.qqmusic.R; 17 | import org.sang.qqmusic.localMusic.view.LocalMusicActivity; 18 | import org.sang.qqmusic.showMusic.model.bean.MusicBean; 19 | import org.sang.qqmusic.showMusic.model.bean.UserBean; 20 | import org.sang.qqmusic.showMusic.presenter.MinePresenter; 21 | import org.sang.qqmusic.showMusic.view.IShowView; 22 | import org.sang.qqmusic.showMusic.view.adapter.MineFgLvAdapter; 23 | import org.sang.qqmusic.showMusic.view.view.MyListView; 24 | import org.sang.qqmusic.util.PlayUtil; 25 | 26 | import java.util.List; 27 | 28 | /** 29 | * Created by 王松 on 2016/10/17. 30 | */ 31 | 32 | public class MineFragment extends BaseFragment implements IMineView { 33 | private MinePresenter minePresenter = new MinePresenter(this); 34 | private MyListView lv; 35 | private IShowView iShowView; 36 | private Handler mHandler = new Handler(); 37 | private TextView playListSizeTv; 38 | private LinearLayout localMusic; 39 | 40 | @Override 41 | public void onAttach(Context context) { 42 | super.onAttach(context); 43 | if (context instanceof IShowView) { 44 | iShowView = (IShowView) context; 45 | } 46 | } 47 | 48 | @Nullable 49 | @Override 50 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 51 | View view = inflater.inflate(R.layout.mine_fg_layout, container, false); 52 | initView(view); 53 | minePresenter.start(); 54 | return view; 55 | } 56 | 57 | private void initView(View view) { 58 | lv = ((MyListView) view.findViewById(R.id.play_list_lv)); 59 | playListSizeTv = ((TextView) view.findViewById(R.id.play_list_size_tv)); 60 | localMusic = ((LinearLayout) view.findViewById(R.id.localMusic)); 61 | localMusic.setOnClickListener(new View.OnClickListener() { 62 | @Override 63 | public void onClick(View v) { 64 | startActivity(new Intent(getActivity(), LocalMusicActivity.class)); 65 | } 66 | }); 67 | } 68 | 69 | @Override 70 | public void setUserInfo(UserBean userBean) { 71 | 72 | } 73 | 74 | @Override 75 | public void setPlayList(final List list) { 76 | playListSizeTv.setText(list.size()+""); 77 | lv.setAdapter(new MineFgLvAdapter(list, getActivity())); 78 | lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 79 | @Override 80 | public void onItemClick(AdapterView parent, View view, final int position, long id) { 81 | PlayUtil.startService(getActivity(), list.get(position), PlayUtil.PLAY); 82 | PlayUtil.CURRENT_POSITION = position; 83 | PlayUtil.CURRENT_PLAY_LIST = list; 84 | // mHandler.postDelayed(new Runnable() { 85 | // @Override 86 | // public void run() { 87 | // iShowView.updateMainBottom(list.get(position)); 88 | // } 89 | // }, 500); 90 | } 91 | }); 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/showMusic/view/fragment/MusicFragment.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.showMusic.view.fragment; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.Nullable; 5 | import android.support.design.widget.TabLayout; 6 | import android.support.v4.app.Fragment; 7 | import android.support.v4.view.ViewPager; 8 | import android.view.LayoutInflater; 9 | import android.view.View; 10 | import android.view.ViewGroup; 11 | 12 | import org.sang.qqmusic.BaseFragment; 13 | import org.sang.qqmusic.R; 14 | import org.sang.qqmusic.showMusic.view.adapter.MusicFgVpAdapter; 15 | 16 | import java.util.ArrayList; 17 | import java.util.List; 18 | 19 | /** 20 | * Created by 王松 on 2016/10/17. 21 | */ 22 | 23 | public class MusicFragment extends BaseFragment { 24 | private ViewPager viewpager; 25 | private TabLayout tabLayout; 26 | 27 | @Nullable 28 | @Override 29 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 30 | View view = inflater.inflate(R.layout.music_fg_layout, container, false); 31 | initView(view); 32 | return view; 33 | } 34 | 35 | private void initView(View view) { 36 | viewpager = ((ViewPager) view.findViewById(R.id.viewpager)); 37 | tabLayout = ((TabLayout) view.findViewById(R.id.tabLayout)); 38 | String[] titles = new String[]{"精选","排行","歌单","电台","MV"}; 39 | List fragments = new ArrayList<>(); 40 | fragments.add(new SelectFragment()); 41 | fragments.add(new RankFragment()); 42 | fragments.add(new PlayListFragment()); 43 | fragments.add(new RadioStationFragment()); 44 | fragments.add(new MVFragment()); 45 | MusicFgVpAdapter adapter = new MusicFgVpAdapter(getChildFragmentManager(), fragments, titles); 46 | viewpager.setAdapter(adapter); 47 | tabLayout.setupWithViewPager(viewpager); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/showMusic/view/fragment/PlayListFragment.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.showMusic.view.fragment; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.Nullable; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.TextView; 9 | 10 | import org.sang.qqmusic.BaseFragment; 11 | 12 | /** 13 | * Created by 王松 on 2016/10/17. 14 | */ 15 | 16 | public class PlayListFragment extends BaseFragment { 17 | @Nullable 18 | @Override 19 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 20 | TextView tv = new TextView(getActivity()); 21 | tv.setText("歌单"); 22 | return tv; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/showMusic/view/fragment/RadioStationFragment.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.showMusic.view.fragment; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.Nullable; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.TextView; 9 | 10 | import org.sang.qqmusic.BaseFragment; 11 | 12 | /** 13 | * Created by 王松 on 2016/10/17. 14 | */ 15 | 16 | public class RadioStationFragment extends BaseFragment { 17 | @Nullable 18 | @Override 19 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 20 | TextView tv = new TextView(getActivity()); 21 | tv.setText("电台"); 22 | return tv; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/showMusic/view/fragment/RankFragment.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.showMusic.view.fragment; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.Nullable; 5 | import android.support.v4.app.FragmentManager; 6 | import android.view.LayoutInflater; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | 10 | import org.sang.qqmusic.BaseFragment; 11 | import org.sang.qqmusic.R; 12 | 13 | /** 14 | * Created by 王松 on 2016/10/17. 15 | */ 16 | 17 | public class RankFragment extends BaseFragment { 18 | private View view; 19 | @Nullable 20 | @Override 21 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 22 | if (view==null) { 23 | view = inflater.inflate(R.layout.rank_fg_layout, container, false); 24 | } 25 | FragmentManager manager = getChildFragmentManager(); 26 | LeftFragment leftFg = (LeftFragment) manager.findFragmentById(R.id.left_fg); 27 | RightFragment rightFg = (RightFragment) manager.findFragmentById(R.id.right_fg); 28 | leftFg.setRightFragment(rightFg); 29 | return view; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/showMusic/view/fragment/RightFragment.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.showMusic.view.fragment; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.Nullable; 5 | import android.support.v7.widget.LinearLayoutManager; 6 | import android.support.v7.widget.RecyclerView; 7 | import android.view.LayoutInflater; 8 | import android.view.View; 9 | import android.view.ViewGroup; 10 | 11 | import com.android.volley.toolbox.ImageLoader; 12 | 13 | import org.sang.qqmusic.App; 14 | import org.sang.qqmusic.BR; 15 | import org.sang.qqmusic.BaseFragment; 16 | import org.sang.qqmusic.R; 17 | import org.sang.qqmusic.showMusic.model.bean.MusicBean; 18 | import org.sang.qqmusic.showMusic.presenter.RightPresenter; 19 | import org.sang.qqmusic.showMusic.view.adapter.RvAdapter; 20 | import org.sang.qqmusic.util.BitmapCache; 21 | import org.sang.qqmusic.util.PlayUtil; 22 | 23 | import java.util.List; 24 | 25 | /** 26 | * Created by 王松 on 2016/10/19. 27 | */ 28 | 29 | public class RightFragment extends BaseFragment implements IRightView { 30 | private RecyclerView recyclerView; 31 | private RightPresenter rightPresenter = new RightPresenter(this); 32 | 33 | @Nullable 34 | @Override 35 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 36 | View view = inflater.inflate(R.layout.right_fg_layout, container, false); 37 | initView(view); 38 | rightPresenter.start(3); 39 | return view; 40 | } 41 | 42 | private void initView(View view) { 43 | recyclerView = ((RecyclerView) view.findViewById(R.id.recyclerView)); 44 | } 45 | 46 | @Override 47 | public void initRv(final List list) { 48 | MusicBean.loader = new ImageLoader(((App) getActivity().getApplication()).getRequestQueue(), new BitmapCache(getActivity())); 49 | RvAdapter adapter = new RvAdapter<>(getActivity(), list, R.layout.right_fg_rv_item, BR.music); 50 | // recyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 2)); 51 | recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 52 | adapter.setOnItemClickListener(new RvAdapter.OnItemClickListener() { 53 | @Override 54 | public void onItemClick(int position) { 55 | PlayUtil.startService(getActivity(),list.get(position),PlayUtil.PLAY); 56 | PlayUtil.CURRENT_PLAY_LIST = list; 57 | PlayUtil.CURRENT_POSITION = position; 58 | } 59 | }); 60 | recyclerView.setAdapter(adapter); 61 | } 62 | 63 | @Override 64 | public void showErrorMsg(String errorMsg) { 65 | 66 | } 67 | 68 | public void updateRv(int id) { 69 | rightPresenter.start(id); 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/showMusic/view/fragment/SelectFragment.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.showMusic.view.fragment; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.Nullable; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.TextView; 9 | 10 | import org.sang.qqmusic.BaseFragment; 11 | 12 | /** 13 | * Created by 王松 on 2016/10/17. 14 | */ 15 | 16 | public class SelectFragment extends BaseFragment { 17 | @Nullable 18 | @Override 19 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 20 | TextView tv = new TextView(getActivity()); 21 | tv.setText("精选"); 22 | return tv; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/showMusic/view/receiver/MusicReceiver.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.showMusic.view.receiver; 2 | 3 | import android.content.BroadcastReceiver; 4 | import android.content.Context; 5 | import android.content.Intent; 6 | 7 | import org.sang.qqmusic.showMusic.view.IShowView; 8 | import org.sang.qqmusic.util.PlayUtil; 9 | 10 | /** 11 | * Created by 王松 on 2016/10/18. 12 | */ 13 | 14 | public class MusicReceiver extends BroadcastReceiver { 15 | @Override 16 | public void onReceive(Context context, Intent intent) { 17 | if (PlayUtil.STOPSERVICE_ACTION.equals(intent.getAction())) { 18 | ((IShowView) context).updateBottomPauseBtn(); 19 | } else if (PlayUtil.UPDATE_BOTTOM_MUSIC_MSG_ACTION.equals(intent.getAction())) { 20 | ((IShowView) context).updateMainBottom(PlayUtil.currentMusic); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/showMusic/view/view/MyListView.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.showMusic.view.view; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.widget.ListView; 6 | 7 | /** 8 | * Created by 王松 on 2016/10/17. 9 | */ 10 | 11 | public class MyListView extends ListView { 12 | public MyListView(Context context) { 13 | super(context); 14 | } 15 | 16 | public MyListView(Context context, AttributeSet attrs) { 17 | super(context, attrs); 18 | } 19 | 20 | public MyListView(Context context, AttributeSet attrs, int defStyleAttr) { 21 | super(context, attrs, defStyleAttr); 22 | } 23 | 24 | @Override 25 | protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 26 | heightMeasureSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); 27 | super.onMeasure(widthMeasureSpec, heightMeasureSpec); 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/util/BitmapCache.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.util; 2 | 3 | import android.content.Context; 4 | import android.graphics.Bitmap; 5 | import android.graphics.BitmapFactory; 6 | import android.util.LruCache; 7 | 8 | import com.android.volley.toolbox.ImageLoader; 9 | 10 | import java.io.File; 11 | import java.io.FileNotFoundException; 12 | import java.io.FileOutputStream; 13 | 14 | /** 15 | * Created by 王松 on 2016/10/10. 16 | */ 17 | 18 | public class BitmapCache implements ImageLoader.ImageCache { 19 | private Context context; 20 | private LruCache lruCache; 21 | 22 | public BitmapCache(Context context) { 23 | this.context = context; 24 | long maxMemory = Runtime.getRuntime().maxMemory(); 25 | long maxSize = maxMemory / 8; 26 | lruCache = new LruCache((int) maxSize) { 27 | @Override 28 | protected int sizeOf(String key, Bitmap value) { 29 | return value.getByteCount(); 30 | } 31 | }; 32 | } 33 | 34 | @Override 35 | public Bitmap getBitmap(String url) { 36 | Bitmap bitmap = lruCache.get(getUrl(url)); 37 | if (bitmap == null) { 38 | bitmap = getBitmapFromSDCard(getUrl(url)); 39 | if (bitmap != null) { 40 | putBitmap(url, bitmap); 41 | } 42 | } 43 | return bitmap; 44 | } 45 | 46 | private Bitmap getBitmapFromSDCard(String url) { 47 | return BitmapFactory.decodeFile(new File(context.getExternalCacheDir(), url).getAbsolutePath()); 48 | } 49 | 50 | @Override 51 | public void putBitmap(String url, Bitmap bitmap) { 52 | lruCache.put(getUrl(url), bitmap); 53 | Bitmap bitmapFromSDCard = getBitmapFromSDCard(getUrl(url)); 54 | if (bitmapFromSDCard == null) { 55 | saveBitmap2SDCard(getUrl(url), bitmap); 56 | } 57 | } 58 | 59 | private void saveBitmap2SDCard(String url, Bitmap bitmap) { 60 | try { 61 | FileOutputStream fos = new FileOutputStream(new File(context.getExternalCacheDir(), url)); 62 | if (url.endsWith(".png") || url.endsWith(".PNG")) { 63 | bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); 64 | }else{ 65 | bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); 66 | } 67 | } catch (FileNotFoundException e) { 68 | e.printStackTrace(); 69 | } 70 | } 71 | 72 | private String getUrl(String url) { 73 | return url.substring(url.lastIndexOf("/") + 1, url.length()); 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/util/JsonParse.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.util; 2 | 3 | import org.json.JSONArray; 4 | import org.json.JSONException; 5 | import org.json.JSONObject; 6 | import org.sang.qqmusic.showMusic.model.bean.MusicBean; 7 | 8 | import java.util.ArrayList; 9 | import java.util.List; 10 | 11 | /** 12 | * Created by 王松 on 2016/10/19. 13 | */ 14 | 15 | public class JsonParse { 16 | public static List parseJson2List(String json) { 17 | List list = new ArrayList<>(); 18 | try { 19 | JSONArray songList = new JSONObject(json).getJSONObject("showapi_res_body").getJSONObject("pagebean").getJSONArray("songlist"); 20 | for (int i = 0; i < songList.length(); i++) { 21 | JSONObject data = songList.getJSONObject(i); 22 | String songname = data.getString("songname"); 23 | int seconds = data.getInt("seconds"); 24 | String albummid = data.getString("albummid"); 25 | String albumpic_big = data.getString("albumpic_big"); 26 | String albumpic_small = data.getString("albumpic_small"); 27 | String downUrl = data.getString("downUrl"); 28 | String url = data.getString("url"); 29 | String singername = data.getString("singername"); 30 | int songid = data.getInt("songid"); 31 | int singerid = data.getInt("singerid"); 32 | int albumid = data.getInt("albumid"); 33 | list.add(new MusicBean(songname, seconds, albummid, songid, singerid, albumpic_big, albumpic_small, downUrl, url, singername, albumid)); 34 | } 35 | } catch (JSONException e) { 36 | e.printStackTrace(); 37 | } 38 | return list; 39 | } 40 | 41 | public static String parseLrc2List(String json) { 42 | String lrcText = null; 43 | try { 44 | lrcText = new JSONObject(json).getJSONObject("showapi_res_body") 45 | .getString("lyric"); 46 | } catch (JSONException e) { 47 | e.printStackTrace(); 48 | } 49 | return lrcText; 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/util/MusicUtil.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.util; 2 | 3 | import android.graphics.Bitmap; 4 | import android.graphics.BitmapFactory; 5 | import android.media.MediaMetadataRetriever; 6 | 7 | /** 8 | * Created by 王松 on 2016/10/17. 9 | */ 10 | 11 | public class MusicUtil { 12 | 13 | public static final String MUSICBEAN = "musicbean"; 14 | 15 | /** 16 | * 获取一个mp3文件的专辑图片 17 | * 18 | * @param filePath 19 | * @return 20 | */ 21 | public static Bitmap getThumbnail(String filePath) { 22 | if (filePath == null || "".equals(filePath) || filePath.startsWith("http")) { 23 | return null; 24 | } 25 | Bitmap bitmap = null; 26 | MediaMetadataRetriever retriever = null; 27 | try { 28 | retriever = new MediaMetadataRetriever(); 29 | retriever.setDataSource(filePath); 30 | byte[] bytes = retriever.getEmbeddedPicture(); 31 | if (bytes != null && bytes.length > 0) { 32 | bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 33 | // }else{ 34 | // bitmap = BitmapFactory.decodeResource(Resources.getSystem(), R.drawable.default1); 35 | } 36 | } finally { 37 | if (retriever != null) { 38 | retriever.release(); 39 | } 40 | } 41 | return bitmap; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/util/NetUtil.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.util; 2 | 3 | import java.util.concurrent.TimeUnit; 4 | 5 | import okhttp3.OkHttpClient; 6 | 7 | /** 8 | * Created by 王松 on 2016/10/19. 9 | */ 10 | 11 | public class NetUtil { 12 | public static String PLAYLISTURL = "http://route.showapi.com/213-4?showapi_appid=25798&showapi_sign=6d9b08da66aa47adb911f1065b7baa4e&topid=%d&"; 13 | public static String LRCDOWNLOADURL = "http://route.showapi.com/213-2?showapi_appid=25798&showapi_sign=6d9b08da66aa47adb911f1065b7baa4e&musicid=%d&"; 14 | 15 | private static OkHttpClient client = new OkHttpClient.Builder() 16 | .connectTimeout(5, TimeUnit.SECONDS) 17 | .build(); 18 | 19 | public static OkHttpClient getClient() { 20 | return client; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/util/PlayUtil.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.util; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | import android.media.MediaPlayer; 6 | import android.os.Environment; 7 | 8 | import org.sang.qqmusic.service.MusicService; 9 | import org.sang.qqmusic.showMusic.model.bean.MusicBean; 10 | 11 | import java.io.File; 12 | import java.io.IOException; 13 | import java.util.List; 14 | 15 | /** 16 | * Created by 王松 on 2016/10/18. 17 | */ 18 | 19 | public class PlayUtil { 20 | public static MediaPlayer player = null; 21 | public final static int PLAY = 0; 22 | public final static int PAUSE = 1; 23 | public final static int STOP = 2; 24 | public final static String STOPSERVICE_ACTION = "stopservice_action"; 25 | public final static String UPDATE_BOTTOM_MUSIC_MSG_ACTION = "update_bottom_music_msg_action"; 26 | public final static int LOCALMUSICBEAN = 3; 27 | public final static int PLAYUTILMUSICBEAN = 4; 28 | //记录当前的播放状态 29 | public static int CURRENT_STATE = 2; 30 | //当前正在播放的Music对象 31 | public static MusicBean currentMusic; 32 | //记录当前所播放音乐在List集合中的位置 33 | public static int CURRENT_POSITION = -1; 34 | public static List CURRENT_PLAY_LIST; 35 | 36 | public static void play(Context context, String musicPath) { 37 | if (player == null) { 38 | init(context); 39 | } 40 | player.reset(); 41 | try { 42 | if (!SDCardUtil.isLocal(currentMusic.getSongid() + "")) { 43 | player.setDataSource(musicPath); 44 | } else { 45 | player.setDataSource(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "MyMusic" + File.separator + currentMusic.getSongid() + ".mp3"); 46 | } 47 | player.prepareAsync(); 48 | } catch (IOException e) { 49 | e.printStackTrace(); 50 | } 51 | } 52 | 53 | public static void pause() { 54 | if (player != null && player.isPlaying()) { 55 | player.pause(); 56 | CURRENT_STATE = PAUSE; 57 | } else if (player != null && !player.isPlaying()) { 58 | player.start(); 59 | CURRENT_STATE = PLAY; 60 | } 61 | } 62 | 63 | public static void stop() { 64 | if (player != null) { 65 | player.stop(); 66 | player.release(); 67 | player = null; 68 | CURRENT_STATE = STOP; 69 | } 70 | } 71 | 72 | private static void init(final Context context) { 73 | player = new MediaPlayer(); 74 | player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 75 | @Override 76 | public void onPrepared(MediaPlayer mp) { 77 | //准备工作完成后开始播放 78 | mp.start(); 79 | CURRENT_STATE = PLAY; 80 | context.sendBroadcast(new Intent(UPDATE_BOTTOM_MUSIC_MSG_ACTION)); 81 | } 82 | }); 83 | } 84 | 85 | public static void startService(Context context, MusicBean musicBean, int type) { 86 | currentMusic = musicBean; 87 | Intent intent = new Intent(context, MusicService.class); 88 | intent.putExtra("type", type); 89 | intent.putExtra("musicPath", musicBean.getUrl()); 90 | intent.putExtra("musicName", musicBean.getSongname()); 91 | context.startService(intent); 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /app/src/main/java/org/sang/qqmusic/util/SDCardUtil.java: -------------------------------------------------------------------------------- 1 | package org.sang.qqmusic.util; 2 | 3 | import android.os.Environment; 4 | 5 | import java.io.File; 6 | 7 | /** 8 | * Created by 王松 on 2016/10/21. 9 | */ 10 | 11 | public class SDCardUtil { 12 | public static boolean isLocal(String songid) { 13 | if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { 14 | String filePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "MyMusic" + File.separator + songid + ".mp3"; 15 | File file = new File(filePath); 16 | if (file.exists()) { 17 | return true; 18 | } 19 | } 20 | return false; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/action_download_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/action_download_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/action_share_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/action_share_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/action_sheet_favorite_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/action_sheet_favorite_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/btn_notification_player_lyric_on_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/btn_notification_player_lyric_on_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/btn_notification_player_next_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/btn_notification_player_next_pressed.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/btn_notification_player_stop_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/btn_notification_player_stop_pressed.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/callout_popup_pointer_close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/callout_popup_pointer_close.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/circle_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/default1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/default1.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/dot_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/download_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/download_icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/hwpush_ic_toolbar_advance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/hwpush_ic_toolbar_advance.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_download_list_item_more.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/ic_download_list_item_more.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/list_random_icon_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/list_random_icon_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/live_more.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/live_more.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/live_play_list_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/live_play_list_button.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/local_search_icon_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/local_search_icon_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/main_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/main_bg.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/maintabbar_button_setting_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/maintabbar_button_setting_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/microphone_middle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/microphone_middle.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/minibar_btn_playlist_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/minibar_btn_playlist_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/mymusic_icon_allsongs_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/mymusic_icon_allsongs_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/mymusic_icon_download_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/mymusic_icon_download_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/mymusic_icon_favorite_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/mymusic_icon_favorite_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/mymusic_icon_history_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/mymusic_icon_history_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/mymusic_icon_mv_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/mymusic_icon_mv_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/mymusic_icon_recognizer_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/mymusic_icon_recognizer_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/play_download_btn_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/play_download_btn_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/player_btn_favorite_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/player_btn_favorite_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/player_btn_more_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/player_btn_more_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/player_btn_next_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/player_btn_next_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/player_btn_playlist_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/player_btn_playlist_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/player_btn_pre_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/player_btn_pre_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/player_btn_random_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/player_btn_random_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/player_btn_repeat_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/player_btn_repeat_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/player_btn_repeatone_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/player_btn_repeatone_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/player_btn_share_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/player_btn_share_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ring_btnplay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/ring_btnplay.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/search.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/search_stop_btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/search_stop_btn.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/superuser_off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/superuser_off.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/tribe_arrows_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/tribe_arrows_icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/voice_search_button_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/drawable/voice_search_button_normal.png -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 15 | 16 | 20 | 21 | 26 | 27 | 31 | 32 | 39 | 40 | 47 | 48 | 55 | 56 | 57 | 58 | 59 | 60 | 67 | 68 | 74 | 75 | 76 | 83 | 84 | 92 | 93 | 94 | 106 | 107 | 115 | 116 | 117 | 123 | 124 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_show_local_music.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 16 | 17 | 23 | 24 | 25 | 35 | 36 | 41 | 42 | -------------------------------------------------------------------------------- /app/src/main/res/layout/download_nf_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 12 | 13 | 20 | 21 | 28 | 29 | 36 | -------------------------------------------------------------------------------- /app/src/main/res/layout/left_fg_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 14 | 15 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/layout/left_fg_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/layout/localmusic_fg_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/localmusic_lv_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 13 | 14 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/layout/mine_fg_lv_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 12 | 13 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/layout/music_fg_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 18 | 19 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/layout/nf_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 12 | 13 | 21 | 22 | 30 | 31 | 39 | 40 | 48 | 49 | 59 | -------------------------------------------------------------------------------- /app/src/main/res/layout/rank_fg_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 13 | 14 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/layout/right_fg_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/right_fg_rv_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 11 | 12 | 13 | 16 | 17 | 23 | 24 | 33 | 34 | 43 | 44 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/values-w820dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 64dp 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #31c17d 4 | #31c17d 5 | #FF4081 6 | #ffffff 7 | #e4e2e2 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16dp 4 | 16dp 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | QQMusic 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | repositories { 5 | jcenter() 6 | } 7 | dependencies { 8 | classpath 'com.android.tools.build:gradle:2.2.0' 9 | 10 | // NOTE: Do not place your application dependencies here; they belong 11 | // in the individual module build.gradle files 12 | } 13 | } 14 | 15 | allprojects { 16 | repositories { 17 | jcenter() 18 | } 19 | } 20 | 21 | task clean(type: Delete) { 22 | delete rootProject.buildDir 23 | } 24 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | org.gradle.jvmargs=-Xmx1536m 13 | 14 | # When configured, Gradle will run in incubating parallel mode. 15 | # This option should only be used with decoupled projects. More details, visit 16 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 17 | # org.gradle.parallel=true 18 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Mon Dec 28 10:00:20 PST 2015 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip 7 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 10 | DEFAULT_JVM_OPTS="" 11 | 12 | APP_NAME="Gradle" 13 | APP_BASE_NAME=`basename "$0"` 14 | 15 | # Use the maximum available, or set MAX_FD != -1 to use that value. 16 | MAX_FD="maximum" 17 | 18 | warn ( ) { 19 | echo "$*" 20 | } 21 | 22 | die ( ) { 23 | echo 24 | echo "$*" 25 | echo 26 | exit 1 27 | } 28 | 29 | # OS specific support (must be 'true' or 'false'). 30 | cygwin=false 31 | msys=false 32 | darwin=false 33 | case "`uname`" in 34 | CYGWIN* ) 35 | cygwin=true 36 | ;; 37 | Darwin* ) 38 | darwin=true 39 | ;; 40 | MINGW* ) 41 | msys=true 42 | ;; 43 | esac 44 | 45 | # Attempt to set APP_HOME 46 | # Resolve links: $0 may be a link 47 | PRG="$0" 48 | # Need this for relative symlinks. 49 | while [ -h "$PRG" ] ; do 50 | ls=`ls -ld "$PRG"` 51 | link=`expr "$ls" : '.*-> \(.*\)$'` 52 | if expr "$link" : '/.*' > /dev/null; then 53 | PRG="$link" 54 | else 55 | PRG=`dirname "$PRG"`"/$link" 56 | fi 57 | done 58 | SAVED="`pwd`" 59 | cd "`dirname \"$PRG\"`/" >/dev/null 60 | APP_HOME="`pwd -P`" 61 | cd "$SAVED" >/dev/null 62 | 63 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 64 | 65 | # Determine the Java command to use to start the JVM. 66 | if [ -n "$JAVA_HOME" ] ; then 67 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 68 | # IBM's JDK on AIX uses strange locations for the executables 69 | JAVACMD="$JAVA_HOME/jre/sh/java" 70 | else 71 | JAVACMD="$JAVA_HOME/bin/java" 72 | fi 73 | if [ ! -x "$JAVACMD" ] ; then 74 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 75 | 76 | Please set the JAVA_HOME variable in your environment to match the 77 | location of your Java installation." 78 | fi 79 | else 80 | JAVACMD="java" 81 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 82 | 83 | Please set the JAVA_HOME variable in your environment to match the 84 | location of your Java installation." 85 | fi 86 | 87 | # Increase the maximum file descriptors if we can. 88 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then 89 | MAX_FD_LIMIT=`ulimit -H -n` 90 | if [ $? -eq 0 ] ; then 91 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 92 | MAX_FD="$MAX_FD_LIMIT" 93 | fi 94 | ulimit -n $MAX_FD 95 | if [ $? -ne 0 ] ; then 96 | warn "Could not set maximum file descriptor limit: $MAX_FD" 97 | fi 98 | else 99 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 100 | fi 101 | fi 102 | 103 | # For Darwin, add options to specify how the application appears in the dock 104 | if $darwin; then 105 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 106 | fi 107 | 108 | # For Cygwin, switch paths to Windows format before running java 109 | if $cygwin ; then 110 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 111 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 112 | JAVACMD=`cygpath --unix "$JAVACMD"` 113 | 114 | # We build the pattern for arguments to be converted via cygpath 115 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 116 | SEP="" 117 | for dir in $ROOTDIRSRAW ; do 118 | ROOTDIRS="$ROOTDIRS$SEP$dir" 119 | SEP="|" 120 | done 121 | OURCYGPATTERN="(^($ROOTDIRS))" 122 | # Add a user-defined pattern to the cygpath arguments 123 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 124 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 125 | fi 126 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 127 | i=0 128 | for arg in "$@" ; do 129 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 130 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 131 | 132 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 133 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 134 | else 135 | eval `echo args$i`="\"$arg\"" 136 | fi 137 | i=$((i+1)) 138 | done 139 | case $i in 140 | (0) set -- ;; 141 | (1) set -- "$args0" ;; 142 | (2) set -- "$args0" "$args1" ;; 143 | (3) set -- "$args0" "$args1" "$args2" ;; 144 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 145 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 146 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 147 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 148 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 149 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 150 | esac 151 | fi 152 | 153 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules 154 | function splitJvmOpts() { 155 | JVM_OPTS=("$@") 156 | } 157 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS 158 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" 159 | 160 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" 161 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /local.properties: -------------------------------------------------------------------------------- 1 | ## This file is automatically generated by Android Studio. 2 | # Do not modify this file -- YOUR CHANGES WILL BE ERASED! 3 | # 4 | # This file should *NOT* be checked into Version Control Systems, 5 | # as it contains information specific to your local configuration. 6 | # 7 | # Location of the SDK. This is only used by Gradle. 8 | # For customization when using a Version Control System, please read the 9 | # header note. 10 | sdk.dir=D\:\\Program\\sdk\\android-sdk-windows -------------------------------------------------------------------------------- /lrcview/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /lrcview/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | 3 | android { 4 | compileSdkVersion 24 5 | buildToolsVersion "24.0.2" 6 | 7 | defaultConfig { 8 | minSdkVersion 15 9 | targetSdkVersion 24 10 | versionCode 1 11 | versionName "1.0" 12 | 13 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 14 | 15 | } 16 | buildTypes { 17 | release { 18 | minifyEnabled false 19 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 20 | } 21 | } 22 | } 23 | 24 | dependencies { 25 | compile fileTree(dir: 'libs', include: ['*.jar']) 26 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 27 | exclude group: 'com.android.support', module: 'support-annotations' 28 | }) 29 | compile 'com.android.support:appcompat-v7:24.2.1' 30 | testCompile 'junit:junit:4.12' 31 | } 32 | -------------------------------------------------------------------------------- /lrcview/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in D:\Program\sdk\android-sdk-windows/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /lrcview/src/androidTest/java/org/sang/lrcview/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package org.sang.lrcview; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumentation test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("org.sang.lrcview.test", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /lrcview/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /lrcview/src/main/java/org/sang/lrcview/bean/LrcBean.java: -------------------------------------------------------------------------------- 1 | package org.sang.lrcview.bean; 2 | 3 | /** 4 | * Created by 王松 on 2016/10/20. 5 | */ 6 | 7 | public class LrcBean { 8 | private String lrc; 9 | private long start; 10 | private long end; 11 | 12 | public LrcBean() { 13 | } 14 | 15 | public LrcBean(String text, long start, long end) { 16 | this.lrc = text; 17 | this.start = start; 18 | this.end = end; 19 | } 20 | 21 | public String getLrc() { 22 | return lrc; 23 | } 24 | 25 | public void setLrc(String lrc) { 26 | this.lrc = lrc; 27 | } 28 | 29 | public long getStart() { 30 | return start; 31 | } 32 | 33 | public void setStart(long start) { 34 | this.start = start; 35 | } 36 | 37 | public long getEnd() { 38 | return end; 39 | } 40 | 41 | public void setEnd(long end) { 42 | this.end = end; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /lrcview/src/main/java/org/sang/lrcview/util/LrcUtil.java: -------------------------------------------------------------------------------- 1 | package org.sang.lrcview.util; 2 | 3 | import org.sang.lrcview.bean.LrcBean; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | /** 9 | * Created by 王松 on 2016/10/21. 10 | */ 11 | 12 | public class LrcUtil { 13 | /** 14 | * 传入的参数为标准歌词字符串 15 | * @param lrcStr 16 | * @return 17 | */ 18 | public static List parseStr2List(String lrcStr) { 19 | if (lrcStr == null || lrcStr.length() == 0) { 20 | return null; 21 | } 22 | List list = new ArrayList<>(); 23 | String lrcText = lrcStr.replaceAll(":", ":") 24 | .replaceAll(" ", "\n") 25 | .replaceAll(".", ".") 26 | .replaceAll(" ", " ") 27 | .replaceAll("-", "-") 28 | .replaceAll(" ", "\r").replaceAll("'", "'"); 29 | String[] split = lrcText.split("\n"); 30 | if (split == null || split.length == 0) { 31 | return null; 32 | } 33 | for (int i = 0; i < split.length; i++) { 34 | String lrc = split[i]; 35 | if (lrc.contains(".")) { 36 | String min = lrc.substring(lrc.indexOf("[") + 1, lrc.indexOf("[") + 3); 37 | String seconds = lrc.substring(lrc.indexOf(":") + 1, lrc.indexOf(":") + 3); 38 | String mills = lrc.substring(lrc.indexOf(".") + 1, lrc.indexOf(".") + 3); 39 | long startTime = Long.valueOf(min) * 60 * 1000 + Long.valueOf(seconds) * 1000 + Long.valueOf(mills) * 10; 40 | String text = lrc.substring(lrc.indexOf("]") + 1); 41 | if (text == null || "".equals(text)) { 42 | text = "music"; 43 | } 44 | LrcBean lrcBean = new LrcBean(); 45 | lrcBean.setStart(startTime); 46 | lrcBean.setLrc(text); 47 | list.add(lrcBean); 48 | if (list.size() > 1) { 49 | list.get(list.size() - 2).setEnd(startTime); 50 | } 51 | if (i == split.length - 1) { 52 | list.get(list.size() - 1).setEnd(startTime + 100000); 53 | } 54 | } 55 | } 56 | return list; 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /lrcview/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /lrcview/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #31c17d 4 | 5 | 6 | -------------------------------------------------------------------------------- /lrcview/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | LrcView 3 | 4 | -------------------------------------------------------------------------------- /lrcview/src/test/java/org/sang/lrcview/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package org.sang.lrcview; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() throws Exception { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app', ':lrcview', ':sharesdk' 2 | -------------------------------------------------------------------------------- /sharesdk/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /sharesdk/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | 3 | android { 4 | compileSdkVersion 24 5 | buildToolsVersion "24.0.2" 6 | 7 | defaultConfig { 8 | minSdkVersion 15 9 | targetSdkVersion 24 10 | versionCode 1 11 | versionName "1.0" 12 | 13 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 14 | 15 | } 16 | buildTypes { 17 | release { 18 | minifyEnabled false 19 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 20 | } 21 | } 22 | } 23 | 24 | dependencies { 25 | compile fileTree(dir: 'libs', include: ['*.jar']) 26 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 27 | exclude group: 'com.android.support', module: 'support-annotations' 28 | }) 29 | compile 'com.android.support:appcompat-v7:24.2.1' 30 | testCompile 'junit:junit:4.12' 31 | } 32 | -------------------------------------------------------------------------------- /sharesdk/libs/MobCommons-2016.0830.1940.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/libs/MobCommons-2016.0830.1940.jar -------------------------------------------------------------------------------- /sharesdk/libs/MobTools-2016.0830.1940.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/libs/MobTools-2016.0830.1940.jar -------------------------------------------------------------------------------- /sharesdk/libs/ShareSDK-Core-2.7.7.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/libs/ShareSDK-Core-2.7.7.jar -------------------------------------------------------------------------------- /sharesdk/libs/ShareSDK-QQ-2.7.7.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/libs/ShareSDK-QQ-2.7.7.jar -------------------------------------------------------------------------------- /sharesdk/libs/ShareSDK-SinaWeibo-2.7.7.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/libs/ShareSDK-SinaWeibo-2.7.7.jar -------------------------------------------------------------------------------- /sharesdk/libs/ShareSDK-Wechat-2.7.7.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/libs/ShareSDK-Wechat-2.7.7.jar -------------------------------------------------------------------------------- /sharesdk/libs/ShareSDK-Wechat-Core-2.7.7.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/libs/ShareSDK-Wechat-Core-2.7.7.jar -------------------------------------------------------------------------------- /sharesdk/libs/ShareSDK-Wechat-Moments-2.7.7.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/libs/ShareSDK-Wechat-Moments-2.7.7.jar -------------------------------------------------------------------------------- /sharesdk/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in D:\Program\sdk\android-sdk-windows/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /sharesdk/src/androidTest/java/org/sang/sharesdk/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package org.sang.sharesdk; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumentation test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("org.sang.sharesdk.test", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /sharesdk/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 20 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /sharesdk/src/main/java/cn/sharesdk/demo/wxapi/WXEntryActivity.java: -------------------------------------------------------------------------------- 1 | /* 2 | * 官网地站:http://www.mob.com 3 | * 技术支持QQ: 4006852216 4 | * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复) 5 | * 6 | * Copyright (c) 2013年 mob.com. All rights reserved. 7 | */ 8 | 9 | package cn.sharesdk.demo.wxapi; 10 | 11 | import android.content.Intent; 12 | import android.widget.Toast; 13 | import cn.sharesdk.wechat.utils.WXAppExtendObject; 14 | import cn.sharesdk.wechat.utils.WXMediaMessage; 15 | import cn.sharesdk.wechat.utils.WechatHandlerActivity; 16 | 17 | /** 微信客户端回调activity示例 */ 18 | public class WXEntryActivity extends WechatHandlerActivity { 19 | 20 | /** 21 | * 处理微信发出的向第三方应用请求app message 22 | *

23 | * 在微信客户端中的聊天页面有“添加工具”,可以将本应用的图标添加到其中 24 | * 此后点击图标,下面的代码会被执行。Demo仅仅只是打开自己而已,但你可 25 | * 做点其他的事情,包括根本不打开任何页面 26 | */ 27 | public void onGetMessageFromWXReq(WXMediaMessage msg) { 28 | if (msg != null) { 29 | Intent iLaunchMyself = getPackageManager().getLaunchIntentForPackage(getPackageName()); 30 | startActivity(iLaunchMyself); 31 | } 32 | } 33 | 34 | /** 35 | * 处理微信向第三方应用发起的消息 36 | *

37 | * 此处用来接收从微信发送过来的消息,比方说本demo在wechatpage里面分享 38 | * 应用时可以不分享应用文件,而分享一段应用的自定义信息。接受方的微信 39 | * 客户端会通过这个方法,将这个信息发送回接收方手机上的本demo中,当作 40 | * 回调。 41 | *

42 | * 本Demo只是将信息展示出来,但你可做点其他的事情,而不仅仅只是Toast 43 | */ 44 | public void onShowMessageFromWXReq(WXMediaMessage msg) { 45 | if (msg != null && msg.mediaObject != null 46 | && (msg.mediaObject instanceof WXAppExtendObject)) { 47 | WXAppExtendObject obj = (WXAppExtendObject) msg.mediaObject; 48 | Toast.makeText(this, obj.extInfo, Toast.LENGTH_SHORT).show(); 49 | } 50 | } 51 | 52 | } 53 | -------------------------------------------------------------------------------- /sharesdk/src/main/java/cn/sharesdk/onekeyshare/CustomerLogo.java: -------------------------------------------------------------------------------- 1 | /* 2 | * 官网地站:http://www.mob.com 3 | * 技术支持QQ: 4006852216 4 | * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复) 5 | * 6 | * Copyright (c) 2013年 mob.com. All rights reserved. 7 | */ 8 | 9 | package cn.sharesdk.onekeyshare; 10 | 11 | import android.graphics.Bitmap; 12 | import android.view.View.OnClickListener; 13 | 14 | /** 九宫格自定义的图标对象 */ 15 | public class CustomerLogo { 16 | public String label; 17 | public Bitmap logo; 18 | public OnClickListener listener; 19 | } 20 | -------------------------------------------------------------------------------- /sharesdk/src/main/java/cn/sharesdk/onekeyshare/OnekeySharePage.java: -------------------------------------------------------------------------------- 1 | /* 2 | * 官网地站:http://www.mob.com 3 | * 技术支持QQ: 4006852216 4 | * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复) 5 | * 6 | * Copyright (c) 2013年 mob.com. All rights reserved. 7 | */ 8 | 9 | package cn.sharesdk.onekeyshare; 10 | 11 | import java.util.ArrayList; 12 | import java.util.HashMap; 13 | 14 | import cn.sharesdk.framework.Platform; 15 | import cn.sharesdk.framework.Platform.ShareParams; 16 | import cn.sharesdk.framework.PlatformActionListener; 17 | 18 | import com.mob.tools.FakeActivity; 19 | 20 | /** 快捷分享的基类 */ 21 | public class OnekeySharePage extends FakeActivity { 22 | private OnekeyShareThemeImpl impl; 23 | 24 | public OnekeySharePage(OnekeyShareThemeImpl impl) { 25 | this.impl = impl; 26 | } 27 | 28 | /** 分享界面是否弹窗模式 */ 29 | protected final boolean isDialogMode() { 30 | return impl.dialogMode; 31 | } 32 | 33 | protected final HashMap getShareParamsMap() { 34 | return impl.shareParamsMap; 35 | } 36 | 37 | /** 静默分享开关(没有界面,直接分享 )*/ 38 | protected final boolean isSilent() { 39 | return impl.silent; 40 | } 41 | 42 | protected final ArrayList getCustomerLogos() { 43 | return impl.customerLogos; 44 | } 45 | 46 | protected final HashMap getHiddenPlatforms() { 47 | return impl.hiddenPlatforms; 48 | } 49 | 50 | protected final PlatformActionListener getCallback() { 51 | return impl.callback; 52 | } 53 | 54 | protected final ShareContentCustomizeCallback getCustomizeCallback() { 55 | return impl.customizeCallback; 56 | } 57 | 58 | protected final boolean isDisableSSO() { 59 | return impl.disableSSO; 60 | } 61 | 62 | protected final void shareSilently(Platform platform) { 63 | impl.shareSilently(platform); 64 | } 65 | 66 | protected final ShareParams formateShareData(Platform platform) { 67 | if (impl.formateShareData(platform)) { 68 | return impl.shareDataToShareParams(platform); 69 | } 70 | return null; 71 | } 72 | 73 | protected final boolean isUseClientToShare(Platform platform) { 74 | return impl.isUseClientToShare(platform); 75 | } 76 | 77 | } 78 | -------------------------------------------------------------------------------- /sharesdk/src/main/java/cn/sharesdk/onekeyshare/OnekeyShareTheme.java: -------------------------------------------------------------------------------- 1 | /* 2 | * 官网地站:http://www.mob.com 3 | * 技术支持QQ: 4006852216 4 | * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复) 5 | * 6 | * Copyright (c) 2013年 mob.com. All rights reserved. 7 | */ 8 | 9 | package cn.sharesdk.onekeyshare; 10 | 11 | import cn.sharesdk.onekeyshare.themes.classic.ClassicTheme; 12 | 13 | /** 快捷分享的主题样式 */ 14 | public enum OnekeyShareTheme { 15 | /** 九格宫的主题样式 ,对应的实现类ClassicTheme */ 16 | CLASSIC(0, new ClassicTheme()); 17 | 18 | private final int value; 19 | private final OnekeyShareThemeImpl impl; 20 | 21 | private OnekeyShareTheme(int value, OnekeyShareThemeImpl impl) { 22 | this.value = value; 23 | this.impl = impl; 24 | } 25 | 26 | public int getValue() { 27 | return value; 28 | } 29 | 30 | public OnekeyShareThemeImpl getImpl() { 31 | return impl; 32 | } 33 | 34 | public static OnekeyShareTheme fromValue(int value) { 35 | for (OnekeyShareTheme theme : OnekeyShareTheme.values()) { 36 | if (theme.value == value) { 37 | return theme; 38 | } 39 | } 40 | return CLASSIC; 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /sharesdk/src/main/java/cn/sharesdk/onekeyshare/ShareContentCustomizeCallback.java: -------------------------------------------------------------------------------- 1 | /* 2 | * 官网地站:http://www.mob.com 3 | * 技术支持QQ: 4006852216 4 | * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复) 5 | * 6 | * Copyright (c) 2013年 mob.com. All rights reserved. 7 | */ 8 | 9 | package cn.sharesdk.onekeyshare; 10 | 11 | import cn.sharesdk.framework.Platform; 12 | import cn.sharesdk.framework.Platform.ShareParams; 13 | 14 | /** 自定义不同平台分享不同内容的接口 */ 15 | public interface ShareContentCustomizeCallback { 16 | 17 | public void onShare(Platform platform, ShareParams paramsToShare); 18 | 19 | } 20 | -------------------------------------------------------------------------------- /sharesdk/src/main/java/cn/sharesdk/onekeyshare/themes/classic/ClassicTheme.java: -------------------------------------------------------------------------------- 1 | /* 2 | * 官网地站:http://www.mob.com 3 | * 技术支持QQ: 4006852216 4 | * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复) 5 | * 6 | * Copyright (c) 2013年 mob.com. All rights reserved. 7 | */ 8 | 9 | package cn.sharesdk.onekeyshare.themes.classic; 10 | 11 | import android.content.Context; 12 | import android.content.res.Configuration; 13 | import cn.sharesdk.framework.Platform; 14 | import cn.sharesdk.framework.Platform.ShareParams; 15 | import cn.sharesdk.onekeyshare.OnekeyShareThemeImpl; 16 | import cn.sharesdk.onekeyshare.themes.classic.land.EditPageLand; 17 | import cn.sharesdk.onekeyshare.themes.classic.land.PlatformPageLand; 18 | import cn.sharesdk.onekeyshare.themes.classic.port.EditPagePort; 19 | import cn.sharesdk.onekeyshare.themes.classic.port.PlatformPagePort; 20 | 21 | /** 九宫格经典主题样式的实现类*/ 22 | public class ClassicTheme extends OnekeyShareThemeImpl { 23 | 24 | /** 展示平台列表*/ 25 | protected void showPlatformPage(Context context) { 26 | PlatformPage page; 27 | int orientation = context.getResources().getConfiguration().orientation; 28 | if (orientation == Configuration.ORIENTATION_PORTRAIT) { 29 | page = new PlatformPagePort(this); 30 | } else { 31 | page = new PlatformPageLand(this); 32 | } 33 | page.show(context, null); 34 | } 35 | 36 | /** 展示编辑界面*/ 37 | protected void showEditPage(Context context, Platform platform, ShareParams sp) { 38 | EditPage page; 39 | int orientation = context.getResources().getConfiguration().orientation; 40 | if (orientation == Configuration.ORIENTATION_PORTRAIT) { 41 | page = new EditPagePort(this); 42 | } else { 43 | page = new EditPageLand(this); 44 | } 45 | page.setPlatform(platform); 46 | page.setShareParams(sp); 47 | page.show(context, null); 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /sharesdk/src/main/java/cn/sharesdk/onekeyshare/themes/classic/FriendListItem.java: -------------------------------------------------------------------------------- 1 | /* 2 | * 官网地站:http://www.mob.com 3 | * 技术支持QQ: 4006852216 4 | * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复) 5 | * 6 | * Copyright (c) 2013年 mob.com. All rights reserved. 7 | */ 8 | 9 | package cn.sharesdk.onekeyshare.themes.classic; 10 | 11 | import android.content.Context; 12 | import android.graphics.Bitmap; 13 | import android.graphics.BitmapFactory; 14 | import android.util.TypedValue; 15 | import android.view.Gravity; 16 | import android.widget.ImageView; 17 | import android.widget.LinearLayout; 18 | import android.widget.TextView; 19 | import cn.sharesdk.onekeyshare.themes.classic.FriendAdapter.Following; 20 | 21 | import com.mob.tools.gui.AsyncImageView; 22 | import com.mob.tools.gui.BitmapProcessor; 23 | import com.mob.tools.utils.R; 24 | 25 | /** 好友列表的item */ 26 | public class FriendListItem extends LinearLayout { 27 | private static final int DESIGN_AVATAR_WIDTH = 64; 28 | private static final int DESIGN_AVATAR_PADDING = 24; 29 | private static final int DESIGN_ITEM_HEIGHT = 96; 30 | private static final int DESIGN_ITEM_PADDING = 20; 31 | 32 | private ImageView ivCheck; 33 | private AsyncImageView aivIcon; 34 | private TextView tvName; 35 | /** 好友列表中,被选中的checkbox图标 */ 36 | private Bitmap bmChd; 37 | /** 好友列表中,没选中的checkbox图标 */ 38 | private Bitmap bmUnch; 39 | 40 | public FriendListItem(Context context, float ratio) { 41 | super(context); 42 | int itemPadding = (int) (ratio * DESIGN_ITEM_PADDING); 43 | setPadding(itemPadding, 0, itemPadding, 0); 44 | setMinimumHeight((int) (ratio * DESIGN_ITEM_HEIGHT)); 45 | setBackgroundColor(0xffffffff); 46 | 47 | ivCheck = new ImageView(context); 48 | LayoutParams lp = new LayoutParams( 49 | LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 50 | lp.gravity = Gravity.CENTER_VERTICAL; 51 | addView(ivCheck, lp); 52 | 53 | aivIcon = new AsyncImageView(context); 54 | int avatarWidth = (int) (ratio * DESIGN_AVATAR_WIDTH); 55 | lp = new LayoutParams(avatarWidth, avatarWidth); 56 | lp.gravity = Gravity.CENTER_VERTICAL; 57 | int avatarMargin = (int) (ratio * DESIGN_AVATAR_PADDING); 58 | lp.setMargins(avatarMargin, 0, avatarMargin, 0); 59 | addView(aivIcon, lp); 60 | 61 | tvName = new TextView(context); 62 | tvName.setTextColor(0xff000000); 63 | tvName.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18); 64 | tvName.setSingleLine(); 65 | lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 66 | lp.gravity = Gravity.CENTER_VERTICAL; 67 | lp.weight = 1; 68 | addView(tvName, lp); 69 | 70 | int resId = R.getBitmapRes(context, "ssdk_oks_classic_check_checked"); 71 | if (resId > 0) { 72 | bmChd = BitmapFactory.decodeResource(context.getResources(), resId); 73 | } 74 | resId = R.getBitmapRes(getContext(), "ssdk_oks_classic_check_default"); 75 | if (resId > 0) { 76 | bmUnch = BitmapFactory.decodeResource(context.getResources(), resId); 77 | } 78 | } 79 | 80 | public void update(Following following, boolean fling) { 81 | tvName.setText(following.screenName); 82 | ivCheck.setImageBitmap(following.checked ? bmChd : bmUnch); 83 | if (aivIcon != null) { 84 | if (fling) { 85 | Bitmap bm = BitmapProcessor.getBitmapFromCache(following.icon); 86 | if (bm != null && !bm.isRecycled()) { 87 | aivIcon.setImageBitmap(bm); 88 | } else { 89 | aivIcon.execute(null, 0); 90 | } 91 | } else { 92 | aivIcon.execute(following.icon, 0); 93 | } 94 | } 95 | } 96 | 97 | } 98 | -------------------------------------------------------------------------------- /sharesdk/src/main/java/cn/sharesdk/onekeyshare/themes/classic/IndicatorView.java: -------------------------------------------------------------------------------- 1 | /* 2 | * 官网地站:http://www.mob.com 3 | * 技术支持QQ: 4006852216 4 | * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复) 5 | * 6 | * Copyright (c) 2013年 mob.com. All rights reserved. 7 | */ 8 | 9 | package cn.sharesdk.onekeyshare.themes.classic; 10 | 11 | import android.content.Context; 12 | import android.graphics.Canvas; 13 | import android.graphics.Paint; 14 | import android.view.View; 15 | 16 | /** 九宫格滑动时,下面显示的圆圈 */ 17 | public class IndicatorView extends View { 18 | private static final int DESIGN_INDICATOR_RADIUS = 6; 19 | private static final int DESIGN_INDICATOR_DISTANCE = 14; 20 | private static final int DESIGN_BOTTOM_HEIGHT = 52; 21 | /** 九格宫有多少页数 */ 22 | private int count; 23 | /** 当前显示的是九格宫中的第几页 */ 24 | private int current; 25 | 26 | public IndicatorView(Context context) { 27 | super(context); 28 | } 29 | 30 | public void setScreenCount(int count) { 31 | this.count = count; 32 | } 33 | 34 | public void onScreenChange(int currentScreen, int lastScreen) { 35 | if (currentScreen != current) { 36 | current = currentScreen; 37 | postInvalidate(); 38 | } 39 | } 40 | 41 | protected void onDraw(Canvas canvas) { 42 | if (count <= 1) { 43 | this.setVisibility(View.GONE); 44 | return; 45 | } 46 | float height = getHeight(); 47 | float radius = height * DESIGN_INDICATOR_RADIUS / DESIGN_BOTTOM_HEIGHT; 48 | float distance = height * DESIGN_INDICATOR_DISTANCE / DESIGN_BOTTOM_HEIGHT; 49 | float windowWidth = radius * 2 * count + distance * (count - 1); 50 | float left = (getWidth() - windowWidth) / 2; 51 | float cy = height / 2; 52 | 53 | canvas.drawColor(0xffffffff); 54 | Paint paint = new Paint(); 55 | paint.setAntiAlias(true); 56 | for (int i = 0; i < count; i++) { 57 | if (i == current) { 58 | paint.setColor(0xff5d71a0); 59 | } else { 60 | paint.setColor(0xffafb1b7); 61 | } 62 | float cx = left + (radius * 2 + distance) * i; 63 | canvas.drawCircle(cx, cy, radius, paint); 64 | } 65 | } 66 | 67 | } 68 | -------------------------------------------------------------------------------- /sharesdk/src/main/java/cn/sharesdk/onekeyshare/themes/classic/PRTHeader.java: -------------------------------------------------------------------------------- 1 | /* 2 | * 官网地站:http://www.mob.com 3 | * 技术支持QQ: 4006852216 4 | * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复) 5 | * 6 | * Copyright (c) 2013年 mob.com. All rights reserved. 7 | */ 8 | 9 | package cn.sharesdk.onekeyshare.themes.classic; 10 | 11 | import static com.mob.tools.utils.R.getStringRes; 12 | import android.content.Context; 13 | import android.graphics.drawable.Drawable; 14 | import android.util.TypedValue; 15 | import android.view.Gravity; 16 | import android.view.View; 17 | import android.widget.LinearLayout; 18 | import android.widget.ProgressBar; 19 | import android.widget.TextView; 20 | 21 | import com.mob.tools.utils.R; 22 | 23 | /** 下拉刷新的头部控件 */ 24 | public class PRTHeader extends LinearLayout { 25 | private static final int DESIGN_SCREEN_WIDTH = 720; 26 | private static final int DESIGN_AVATAR_WIDTH = 64; 27 | private static final int DESIGN_AVATAR_PADDING = 24; 28 | 29 | private TextView tvHeader; 30 | private RotateImageView ivArrow; 31 | private ProgressBar pbRefreshing; 32 | 33 | public PRTHeader(Context context) { 34 | super(context); 35 | int[] size = R.getScreenSize(context); 36 | float screenWidth = size[0] < size[1] ? size[0] : size[1]; 37 | float ratio = screenWidth / DESIGN_SCREEN_WIDTH; 38 | 39 | setOrientation(VERTICAL); 40 | 41 | LinearLayout llInner = new LinearLayout(context); 42 | LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 43 | lp.gravity = Gravity.CENTER_HORIZONTAL; 44 | addView(llInner, lp); 45 | 46 | ivArrow = new RotateImageView(context); 47 | int resId = R.getBitmapRes(context, "ssdk_oks_ptr_ptr"); 48 | if (resId > 0) { 49 | ivArrow.setImageResource(resId); 50 | } 51 | int avatarWidth = (int) (ratio * DESIGN_AVATAR_WIDTH); 52 | lp = new LayoutParams(avatarWidth, avatarWidth); 53 | lp.gravity = Gravity.CENTER_VERTICAL; 54 | int avataPadding = (int) (ratio * DESIGN_AVATAR_PADDING); 55 | lp.topMargin = lp.bottomMargin = avataPadding; 56 | llInner.addView(ivArrow, lp); 57 | 58 | pbRefreshing = new ProgressBar(context); 59 | resId = R.getBitmapRes(context, "ssdk_oks_classic_progressbar"); 60 | Drawable pbdrawable = context.getResources().getDrawable(resId); 61 | pbRefreshing.setIndeterminateDrawable(pbdrawable); 62 | llInner.addView(pbRefreshing, lp); 63 | pbRefreshing.setVisibility(View.GONE); 64 | 65 | tvHeader = new TextView(getContext()); 66 | tvHeader.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18); 67 | tvHeader.setPadding(avataPadding, 0, avataPadding, 0); 68 | tvHeader.setTextColor(0xff09bb07); 69 | lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 70 | lp.gravity = Gravity.CENTER_VERTICAL; 71 | llInner.addView(tvHeader, lp); 72 | } 73 | 74 | public void onPullDown(int percent) { 75 | if (percent > 100) { 76 | int degree = (percent - 100) * 180 / 20; 77 | if (degree > 180) { 78 | degree = 180; 79 | } 80 | if (degree < 0) { 81 | degree = 0; 82 | } 83 | ivArrow.setRotation(degree); 84 | } else { 85 | ivArrow.setRotation(0); 86 | } 87 | 88 | if (percent < 100) { 89 | int resId = getStringRes(getContext(), "ssdk_oks_pull_to_refresh"); 90 | if (resId > 0) { 91 | tvHeader.setText(resId); 92 | } 93 | } else { 94 | int resId = getStringRes(getContext(), "ssdk_oks_release_to_refresh"); 95 | if (resId > 0) { 96 | tvHeader.setText(resId); 97 | } 98 | } 99 | } 100 | 101 | public void onRequest() { 102 | ivArrow.setVisibility(View.GONE); 103 | pbRefreshing.setVisibility(View.VISIBLE); 104 | int resId = getStringRes(getContext(), "ssdk_oks_refreshing"); 105 | if (resId > 0) { 106 | tvHeader.setText(resId); 107 | } 108 | } 109 | 110 | public void reverse() { 111 | pbRefreshing.setVisibility(View.GONE); 112 | ivArrow.setRotation(180); 113 | ivArrow.setVisibility(View.VISIBLE); 114 | } 115 | 116 | } 117 | -------------------------------------------------------------------------------- /sharesdk/src/main/java/cn/sharesdk/onekeyshare/themes/classic/PicViewerPage.java: -------------------------------------------------------------------------------- 1 | /* 2 | * 官网地站:http://www.mob.com 3 | * 技术支持QQ: 4006852216 4 | * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复) 5 | * 6 | * Copyright (c) 2013年 mob.com. All rights reserved. 7 | */ 8 | 9 | package cn.sharesdk.onekeyshare.themes.classic; 10 | 11 | import android.graphics.Bitmap; 12 | import android.graphics.drawable.ColorDrawable; 13 | import android.view.ViewTreeObserver.OnGlobalLayoutListener; 14 | import android.widget.ImageView.ScaleType; 15 | import cn.sharesdk.onekeyshare.OnekeySharePage; 16 | import cn.sharesdk.onekeyshare.OnekeyShareThemeImpl; 17 | 18 | import com.mob.tools.gui.ScaledImageView; 19 | 20 | /** 图片浏览的视图类 */ 21 | public class PicViewerPage extends OnekeySharePage implements OnGlobalLayoutListener { 22 | private Bitmap pic; 23 | /** 图片浏览的缩放控件 */ 24 | private ScaledImageView sivViewer; 25 | 26 | public PicViewerPage(OnekeyShareThemeImpl impl) { 27 | super(impl); 28 | } 29 | 30 | /** 设置图片用于浏览 */ 31 | public void setImageBitmap(Bitmap pic) { 32 | this.pic = pic; 33 | } 34 | 35 | public void onCreate() { 36 | activity.getWindow().setBackgroundDrawable(new ColorDrawable(0x4c000000)); 37 | 38 | sivViewer = new ScaledImageView(activity); 39 | sivViewer.setScaleType(ScaleType.MATRIX); 40 | activity.setContentView(sivViewer); 41 | if (pic != null) { 42 | sivViewer.getViewTreeObserver().addOnGlobalLayoutListener(this); 43 | } 44 | } 45 | 46 | public void onGlobalLayout() { 47 | sivViewer.getViewTreeObserver().removeGlobalOnLayoutListener(this); 48 | sivViewer.post(new Runnable() { 49 | public void run() { 50 | sivViewer.setBitmap(pic); 51 | } 52 | }); 53 | } 54 | 55 | } 56 | -------------------------------------------------------------------------------- /sharesdk/src/main/java/cn/sharesdk/onekeyshare/themes/classic/RotateImageView.java: -------------------------------------------------------------------------------- 1 | /* 2 | * 官网地站:http://www.mob.com 3 | * 技术支持QQ: 4006852216 4 | * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复) 5 | * 6 | * Copyright (c) 2013年 mob.com. All rights reserved. 7 | */ 8 | 9 | package cn.sharesdk.onekeyshare.themes.classic; 10 | 11 | import android.content.Context; 12 | import android.graphics.Canvas; 13 | import android.widget.ImageView; 14 | 15 | /** 在At好友页面中,下拉刷新列表头部的旋转箭头 */ 16 | public class RotateImageView extends ImageView { 17 | private float rotation; 18 | 19 | public RotateImageView(Context context) { 20 | super(context); 21 | } 22 | 23 | public void setRotation(float rotation) { 24 | this.rotation = rotation; 25 | invalidate(); 26 | } 27 | 28 | protected void onDraw(Canvas canvas) { 29 | canvas.rotate(rotation, getWidth() / 2, getHeight() / 2); 30 | super.onDraw(canvas); 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /sharesdk/src/main/java/cn/sharesdk/onekeyshare/themes/classic/XView.java: -------------------------------------------------------------------------------- 1 | /* 2 | * 官网地站:http://www.mob.com 3 | * 技术支持QQ: 4006852216 4 | * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复) 5 | * 6 | * Copyright (c) 2013年 mob.com. All rights reserved. 7 | */ 8 | 9 | package cn.sharesdk.onekeyshare.themes.classic; 10 | 11 | import android.content.Context; 12 | import android.graphics.Canvas; 13 | import android.graphics.Paint; 14 | import android.view.View; 15 | 16 | /** 编辑页面中删除图片“X”按钮 */ 17 | public class XView extends View { 18 | private float ratio; 19 | 20 | public XView(Context context) { 21 | super(context); 22 | } 23 | 24 | public void setRatio(float ratio) { 25 | this.ratio = ratio; 26 | } 27 | 28 | protected void onDraw(Canvas canvas) { 29 | int width = getWidth() / 2; 30 | int height = getHeight() / 2; 31 | 32 | Paint paint = new Paint(); 33 | paint.setAntiAlias(true); 34 | paint.setColor(0xffa0a0a0); 35 | canvas.drawRect(width, 0, getWidth(), height, paint); 36 | 37 | paint = new Paint(); 38 | paint.setAntiAlias(true); 39 | paint.setStrokeWidth(3f * ratio); 40 | paint.setColor(0xffffffff); 41 | float left = 8f * ratio; 42 | canvas.drawLine(width + left, left, getWidth() - left, width - left, paint); 43 | canvas.drawLine(width + left, width - left, getWidth() - left, left, paint); 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /sharesdk/src/main/java/cn/sharesdk/onekeyshare/themes/classic/land/FriendListPageLand.java: -------------------------------------------------------------------------------- 1 | /* 2 | * 官网地站:http://www.mob.com 3 | * 技术支持QQ: 4006852216 4 | * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复) 5 | * 6 | * Copyright (c) 2013年 mob.com. All rights reserved. 7 | */ 8 | 9 | package cn.sharesdk.onekeyshare.themes.classic.land; 10 | 11 | import com.mob.tools.utils.R; 12 | 13 | import cn.sharesdk.onekeyshare.OnekeyShareThemeImpl; 14 | import cn.sharesdk.onekeyshare.themes.classic.FriendListPage; 15 | 16 | /** 横屏的好友列表 */ 17 | public class FriendListPageLand extends FriendListPage { 18 | private static final int DESIGN_SCREEN_WIDTH = 1280; 19 | private static final int DESIGN_TITLE_HEIGHT = 70; 20 | 21 | public FriendListPageLand(OnekeyShareThemeImpl impl) { 22 | super(impl); 23 | } 24 | 25 | protected float getRatio() { 26 | float screenWidth = R.getScreenWidth(activity); 27 | return screenWidth / DESIGN_SCREEN_WIDTH; 28 | } 29 | 30 | protected int getDesignTitleHeight() { 31 | return DESIGN_TITLE_HEIGHT; 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /sharesdk/src/main/java/cn/sharesdk/onekeyshare/themes/classic/land/PlatformPageAdapterLand.java: -------------------------------------------------------------------------------- 1 | /* 2 | * 官网地站:http://www.mob.com 3 | * 技术支持QQ: 4006852216 4 | * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复) 5 | * 6 | * Copyright (c) 2013年 mob.com. All rights reserved. 7 | */ 8 | 9 | package cn.sharesdk.onekeyshare.themes.classic.land; 10 | 11 | import java.util.ArrayList; 12 | 13 | import android.content.Context; 14 | import cn.sharesdk.onekeyshare.themes.classic.PlatformPage; 15 | import cn.sharesdk.onekeyshare.themes.classic.PlatformPageAdapter; 16 | 17 | import com.mob.tools.utils.R; 18 | 19 | /** 横屏的九宫格页面适配器 */ 20 | public class PlatformPageAdapterLand extends PlatformPageAdapter { 21 | private static final int DESIGN_SCREEN_WIDTH_L = 1280; 22 | private static final int DESIGN_CELL_WIDTH_L = 160; 23 | private static final int DESIGN_SEP_LINE_WIDTH = 1; 24 | private static final int DESIGN_LOGO_HEIGHT = 76; 25 | private static final int DESIGN_PADDING_TOP = 20; 26 | 27 | public PlatformPageAdapterLand(PlatformPage page, ArrayList cells) { 28 | super(page, cells); 29 | } 30 | 31 | protected void calculateSize(Context context, ArrayList plats) { 32 | int screenWidth = R.getScreenWidth(context); 33 | float ratio = ((float) screenWidth) / DESIGN_SCREEN_WIDTH_L; 34 | int cellWidth = (int) (DESIGN_CELL_WIDTH_L * ratio); 35 | lineSize = screenWidth / cellWidth; 36 | 37 | sepLineWidth = (int) (DESIGN_SEP_LINE_WIDTH * ratio); 38 | sepLineWidth = sepLineWidth < 1 ? 1 : sepLineWidth; 39 | logoHeight = (int) (DESIGN_LOGO_HEIGHT * ratio); 40 | paddingTop = (int) (DESIGN_PADDING_TOP * ratio); 41 | bottomHeight = (int) (DESIGN_BOTTOM_HEIGHT * ratio); 42 | cellHeight = (screenWidth - sepLineWidth * 3) / (lineSize - 1); 43 | panelHeight = cellHeight + sepLineWidth; 44 | } 45 | 46 | protected void collectCells(ArrayList plats) { 47 | int count = plats.size(); 48 | if (count < lineSize) { 49 | int lineCount = (count / lineSize); 50 | if (count % lineSize != 0) { 51 | lineCount++; 52 | } 53 | cells = new Object[1][lineCount * lineSize]; 54 | } else { 55 | int pageCount = (count / lineSize); 56 | if (count % lineSize != 0) { 57 | pageCount++; 58 | } 59 | cells = new Object[pageCount][lineSize]; 60 | } 61 | 62 | for (int i = 0; i < count; i++) { 63 | int p = i / lineSize; 64 | cells[p][i - lineSize * p] = plats.get(i); 65 | } 66 | } 67 | 68 | } 69 | -------------------------------------------------------------------------------- /sharesdk/src/main/java/cn/sharesdk/onekeyshare/themes/classic/land/PlatformPageLand.java: -------------------------------------------------------------------------------- 1 | /* 2 | * 官网地站:http://www.mob.com 3 | * 技术支持QQ: 4006852216 4 | * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复) 5 | * 6 | * Copyright (c) 2013年 mob.com. All rights reserved. 7 | */ 8 | 9 | package cn.sharesdk.onekeyshare.themes.classic.land; 10 | 11 | import java.util.ArrayList; 12 | 13 | import cn.sharesdk.onekeyshare.OnekeyShareThemeImpl; 14 | import cn.sharesdk.onekeyshare.themes.classic.PlatformPage; 15 | import cn.sharesdk.onekeyshare.themes.classic.PlatformPageAdapter; 16 | 17 | /** 横屏的九宫格页面 */ 18 | public class PlatformPageLand extends PlatformPage { 19 | 20 | public PlatformPageLand(OnekeyShareThemeImpl impl) { 21 | super(impl); 22 | } 23 | 24 | public void onCreate() { 25 | requestLandscapeOrientation(); 26 | super.onCreate(); 27 | } 28 | 29 | protected PlatformPageAdapter newAdapter(ArrayList cells) { 30 | return new PlatformPageAdapterLand(this, cells); 31 | } 32 | 33 | } 34 | 35 | -------------------------------------------------------------------------------- /sharesdk/src/main/java/cn/sharesdk/onekeyshare/themes/classic/port/FriendListPagePort.java: -------------------------------------------------------------------------------- 1 | /* 2 | * 官网地站:http://www.mob.com 3 | * 技术支持QQ: 4006852216 4 | * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复) 5 | * 6 | * Copyright (c) 2013年 mob.com. All rights reserved. 7 | */ 8 | 9 | package cn.sharesdk.onekeyshare.themes.classic.port; 10 | 11 | import com.mob.tools.utils.R; 12 | 13 | import cn.sharesdk.onekeyshare.OnekeyShareThemeImpl; 14 | import cn.sharesdk.onekeyshare.themes.classic.FriendListPage; 15 | 16 | /** 竖屏的好友列表 */ 17 | public class FriendListPagePort extends FriendListPage { 18 | private static final int DESIGN_SCREEN_WIDTH = 720; 19 | private static final int DESIGN_TITLE_HEIGHT = 96; 20 | 21 | public FriendListPagePort(OnekeyShareThemeImpl impl) { 22 | super(impl); 23 | } 24 | 25 | protected float getRatio() { 26 | float screenWidth = R.getScreenWidth(activity); 27 | return screenWidth / DESIGN_SCREEN_WIDTH; 28 | } 29 | 30 | protected int getDesignTitleHeight() { 31 | return DESIGN_TITLE_HEIGHT; 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /sharesdk/src/main/java/cn/sharesdk/onekeyshare/themes/classic/port/PlatformPageAdapterPort.java: -------------------------------------------------------------------------------- 1 | /* 2 | * 官网地站:http://www.mob.com 3 | * 技术支持QQ: 4006852216 4 | * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复) 5 | * 6 | * Copyright (c) 2013年 mob.com. All rights reserved. 7 | */ 8 | 9 | package cn.sharesdk.onekeyshare.themes.classic.port; 10 | 11 | import java.util.ArrayList; 12 | 13 | import android.content.Context; 14 | import cn.sharesdk.onekeyshare.themes.classic.PlatformPage; 15 | import cn.sharesdk.onekeyshare.themes.classic.PlatformPageAdapter; 16 | 17 | import com.mob.tools.utils.R; 18 | 19 | /** 竖屏的九宫格页面适配器 */ 20 | public class PlatformPageAdapterPort extends PlatformPageAdapter { 21 | private static final int DESIGN_SCREEN_WIDTH_P = 720; 22 | private static final int DESIGN_SEP_LINE_WIDTH = 1; 23 | private static final int DESIGN_LOGO_HEIGHT = 76; 24 | private static final int DESIGN_PADDING_TOP = 20; 25 | private static final int PAGE_SIZE_P = 12; 26 | private static final int LINE_SIZE_P = 4; 27 | 28 | public PlatformPageAdapterPort(PlatformPage page, ArrayList cells) { 29 | super(page, cells); 30 | } 31 | 32 | protected void calculateSize(Context context, ArrayList plats) { 33 | int screenWidth = R.getScreenWidth(context); 34 | lineSize = LINE_SIZE_P; 35 | 36 | float ratio = ((float) screenWidth) / DESIGN_SCREEN_WIDTH_P; 37 | sepLineWidth = (int) (DESIGN_SEP_LINE_WIDTH * ratio); 38 | sepLineWidth = sepLineWidth < 1 ? 1 : sepLineWidth; 39 | logoHeight = (int) (DESIGN_LOGO_HEIGHT * ratio); 40 | paddingTop = (int) (DESIGN_PADDING_TOP * ratio); 41 | bottomHeight = (int) (DESIGN_BOTTOM_HEIGHT * ratio); 42 | cellHeight = (screenWidth - sepLineWidth * 3) / 4; 43 | if (plats.size() <= lineSize) { 44 | panelHeight = cellHeight + sepLineWidth; 45 | } else if (plats.size() <= PAGE_SIZE_P - lineSize) { 46 | panelHeight = (cellHeight + sepLineWidth) * 2; 47 | } else { 48 | panelHeight = (cellHeight + sepLineWidth) * 3; 49 | } 50 | } 51 | 52 | protected void collectCells(ArrayList plats) { 53 | int count = plats.size(); 54 | if (count < PAGE_SIZE_P) { 55 | int lineCount = (count / lineSize); 56 | if (count % lineSize != 0) { 57 | lineCount++; 58 | } 59 | cells = new Object[1][lineCount * lineSize]; 60 | } else { 61 | int pageCount = (count / PAGE_SIZE_P); 62 | if (count % PAGE_SIZE_P != 0) { 63 | pageCount++; 64 | } 65 | cells = new Object[pageCount][PAGE_SIZE_P]; 66 | } 67 | 68 | for (int i = 0; i < count; i++) { 69 | int p = i / PAGE_SIZE_P; 70 | cells[p][i - PAGE_SIZE_P * p] = plats.get(i); 71 | } 72 | } 73 | 74 | } 75 | -------------------------------------------------------------------------------- /sharesdk/src/main/java/cn/sharesdk/onekeyshare/themes/classic/port/PlatformPagePort.java: -------------------------------------------------------------------------------- 1 | /* 2 | * 官网地站:http://www.mob.com 3 | * 技术支持QQ: 4006852216 4 | * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复) 5 | * 6 | * Copyright (c) 2013年 mob.com. All rights reserved. 7 | */ 8 | 9 | package cn.sharesdk.onekeyshare.themes.classic.port; 10 | 11 | import java.util.ArrayList; 12 | 13 | import cn.sharesdk.onekeyshare.OnekeyShareThemeImpl; 14 | import cn.sharesdk.onekeyshare.themes.classic.PlatformPage; 15 | import cn.sharesdk.onekeyshare.themes.classic.PlatformPageAdapter; 16 | 17 | /** 竖屏的九宫格页面 */ 18 | public class PlatformPagePort extends PlatformPage { 19 | 20 | public PlatformPagePort(OnekeyShareThemeImpl impl) { 21 | super(impl); 22 | } 23 | 24 | public void onCreate() { 25 | requestPortraitOrientation(); 26 | super.onCreate(); 27 | } 28 | 29 | protected PlatformPageAdapter newAdapter(ArrayList cells) { 30 | return new PlatformPageAdapterPort(this, cells); 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-hdpi/ssdk_oks_ptr_ptr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-hdpi/ssdk_oks_ptr_ptr.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_auth_title_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_auth_title_back.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_back_arr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_back_arr.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_logo.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_alipay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_alipay.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_bluetooth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_bluetooth.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_check_checked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_check_checked.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_check_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_check_default.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_douban.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_douban.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_dropbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_dropbox.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_email.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_email.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_evernote.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_evernote.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_facebook.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_facebookmessenger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_facebookmessenger.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_flickr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_flickr.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_foursquare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_foursquare.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_googleplus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_googleplus.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_instagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_instagram.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_instapaper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_instapaper.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_kaixin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_kaixin.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_kakaostory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_kakaostory.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_kakaotalk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_kakaotalk.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_laiwang.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_laiwang.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_laiwangmoments.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_laiwangmoments.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_line.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_line.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_linkedin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_linkedin.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_mingdao.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_mingdao.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_pinterest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_pinterest.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_pocket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_pocket.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_qq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_qq.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_qzone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_qzone.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_renren.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_renren.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_shortmessage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_shortmessage.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_sinaweibo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_sinaweibo.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_tencentweibo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_tencentweibo.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_tumblr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_tumblr.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_twitter.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_vkontakte.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_vkontakte.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_wechat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_wechat.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_wechatfavorite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_wechatfavorite.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_wechatmoments.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_wechatmoments.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_whatsapp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_whatsapp.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_yixin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_yixin.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_yixinmoments.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_yixinmoments.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_youdao.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_oks_classic_youdao.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable-xhdpi/ssdk_title_div.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lenve/QQMusic/0b0ed814d6b8db16c192cdf8f928c8944ccb145d/sharesdk/src/main/res/drawable-xhdpi/ssdk_title_div.png -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable/ssdk_oks_classic_platform_cell_back.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /sharesdk/src/main/res/drawable/ssdk_oks_classic_progressbar.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 12 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /sharesdk/src/main/res/values-en/ssdk_oks_strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Share 4 | Sharing operation is working in the background… 5 | Operation failed 6 | Operation succeeded 7 | Operation canceled 8 | Cancel 9 | Photo Sharing 10 | Confirm 11 | Contacts 12 | Pull down to refresh 13 | Release to refresh 14 | Refreshing… 15 | 16 | -------------------------------------------------------------------------------- /sharesdk/src/main/res/values-en/ssdk_strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Authorization 4 | http://www.mob.com 5 | 分享图片 6 | Wechat client not exists or the version is too low 7 | Google+ client not exists or the version is too low 8 | Mobile QQ client not exists or the version is too low 9 | Pinterest client not exists or the version is too low 10 | Instagram client not exists or the version is too low 11 | Yixin client not exists or the version is too low 12 | Line client not exists or the version is too low 13 | KakaoTalk client not exists or the version is too low 14 | KakaoStory client not exists or the version is too low 15 | WhatsApp client not exists or the version is too low 16 | Laiwangs client not exists or the version is too low 17 | Alipay client not exists or the version is too low 18 | Facebookmessenger client not exists or the version is too low 19 | 20 | Sina Weibo 21 | Tencent Weibo 22 | QZone 23 | WeChat 24 | WeChat Moments 25 | WeChat Favorites 26 | Facebook 27 | Twitter 28 | Renren 29 | Kaixin 30 | Email 31 | Short Message 32 | Sohu Microblog 33 | Netease Microblog 34 | Douban 35 | Youdao 36 | Evernote 37 | Linked in 38 | Google+ 39 | FourSquare 40 | QQ 41 | Sohu Suishenkan 42 | Pinterest 43 | Flickr 44 | Tumblr 45 | Dropbox 46 | VK 47 | Instagram 48 | Yixin 49 | Yixin Moments 50 | Mingdao 51 | KakaoTalk 52 | KakaoStory 53 | Line 54 | Bluetooth 55 | WhatsApp 56 | Pocket 57 | Instapaper 58 | Email 59 | Password 60 | Sign In 61 | Sign In… 62 | Email or Password incorrect 63 | Facebook Messenger 64 | Laiwang 65 | Laiwang Moments 66 | Alipay 67 | Plurk 68 | 69 | Share To QZone 70 | Share To QQ 71 | Share To Google+ 72 | Share To Facebook 73 | Share webpage 74 | Share To Mingdao 75 | Shared from %s 76 | use login button instead 77 | -------------------------------------------------------------------------------- /sharesdk/src/main/res/values/ssdk_instapaper_strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | 11 | %s 12 | 46 | 47 | 48 | 49 | 58 |
59 | %s 60 |
61 | 62 | 63 | 64 |
65 |

66 |
67 | 68 | 69 | ]]>
70 |
-------------------------------------------------------------------------------- /sharesdk/src/main/res/values/ssdk_oks_color_drawables.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #ffffffff 4 | #ffeeeeee 5 | 6 | -------------------------------------------------------------------------------- /sharesdk/src/main/res/values/ssdk_oks_strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 分享 4 | 分享操作正在后台进行… 5 | 分享失败 6 | 分享成功 7 | 分享已取消 8 | 取消 9 | 图文分享 10 | 确定 11 | 联系人 12 | 下拉刷新 13 | 松开刷新 14 | 刷新中… 15 | 16 | -------------------------------------------------------------------------------- /sharesdk/src/main/res/values/ssdk_strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 应用授权 4 | http://www.mob.com 5 | 分享图片 6 | 目前您的微信版本过低或未安装微信,需要安装微信才能使用 7 | Google+ 版本过低或者没有安装,需要升级或安装Google+才能使用! 8 | QQ 版本过低或者没有安装,需要升级或安装QQ才能使用! 9 | Pinterest版本过低或者没有安装,需要升级或安装Pinterest才能使用! 10 | Instagram版本过低或者没有安装,需要升级或安装Instagram才能使用! 11 | 目前您的易信版本过低或未安装,需要安装易信才能使用 12 | 目前您的Line版本过低或未安装,需要安装Line才能使用 13 | 目前您的KakaoTalk版本过低或未安装,需要安装KakaoTalk才能使用 14 | 目前您的KakaoStory版本过低或未安装,需要安装KakaoStory才能使用 15 | 目前您的WhatsApp版本过低或未安装,需要安装WhatsApp才能使用 16 | 目前您的来往版本过低或未安装,需要安装来往才能使用 17 | 目前您的支付宝版本过低或未安装,需要安装支付宝才能使用 18 | 目前您的FacebookMessenger版本过低或未安装,需要安装才能使用 19 | 20 | 新浪微博 21 | 腾讯微博 22 | QQ空间 23 | 微信好友 24 | 微信朋友圈 25 | 微信收藏 26 | Facebook 27 | Twitter 28 | 人人网 29 | 开心网 30 | 邮件 31 | 信息 32 | 搜狐微博 33 | 搜狐随身看 34 | 网易微博 35 | 豆瓣 36 | 有道云笔记 37 | 印象笔记 38 | 领英 39 | Google+ 40 | FourSquare 41 | QQ 42 | Pinterest 43 | Flickr 44 | Tumblr 45 | Dropbox 46 | VK 47 | Instagram 48 | 易信 49 | 易信朋友圈 50 | 明道 51 | KakaoTalk 52 | KakaoStory 53 | Line 54 | 蓝牙 55 | WhatsApp 56 | Pocket 57 | Instapaper 58 | 邮箱 59 | 密码 60 | 登录 61 | 登录中… 62 | Email或密码不正确 63 | Facebook Messenger 64 | 来往 65 | 来往动态 66 | 支付宝好友 67 | Plurk 68 | 69 | 分享到QQ空间 70 | 分享到QQ 71 | 分享到Facebook 72 | 网页分享 73 | 分享到明道 74 | 分享到Google+ 75 | 来自%s的分享 76 | 请改用“登录”按钮 77 | -------------------------------------------------------------------------------- /sharesdk/src/test/java/org/sang/sharesdk/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package org.sang.sharesdk; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() throws Exception { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } --------------------------------------------------------------------------------