├── .gitignore ├── CyberLink4Android.iml ├── Pic ├── dlna01.jpg ├── dlna02.jpg └── dlna03.jpg ├── README.md ├── build.gradle ├── build └── intermediates │ ├── dex-cache │ └── cache.xml │ └── gradle_project_sync_data.bin ├── dmc_sample ├── build.gradle ├── dmc_sample.iml ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── charonchui │ │ └── cyberlink │ │ └── ApplicationTest.java │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── charonchui │ │ └── cyberlink │ │ ├── BaseActivity.java │ │ ├── ControlActivity.java │ │ ├── DMCApplication.java │ │ ├── MainActivity.java │ │ ├── SplashActivity.java │ │ ├── engine │ │ ├── DLNAContainer.java │ │ ├── MultiPointController.java │ │ └── SearchThread.java │ │ ├── inter │ │ └── IController.java │ │ ├── service │ │ └── DLNAService.java │ │ └── util │ │ ├── DLNAUtil.java │ │ ├── LogUtil.java │ │ └── NetUtil.java │ └── res │ ├── drawable-hdpi │ ├── back_fast.png │ ├── back_fast_on.png │ ├── devices.png │ ├── dlna_search_focused.9.png │ ├── dlna_search_normal.9.png │ ├── go_fast.png │ ├── go_fast_on.png │ ├── home_background.png │ ├── ic_launcher.png │ ├── mediacontroller_bg.png │ ├── mediacontroller_pause01.png │ ├── mediacontroller_pause02.png │ ├── mediacontroller_play01.png │ ├── mediacontroller_play02.png │ ├── next_video_button_nomal.png │ ├── next_video_button_selected.png │ ├── pause_button.png │ ├── play_button.png │ ├── pre_video_button_nomal.png │ ├── pre_video_button_selected.png │ ├── scrubber_control_disabled_holo.png │ ├── scrubber_control_focused_holo.png │ ├── scrubber_control_normal_holo.png │ ├── scrubber_control_pressed_holo.png │ ├── scrubber_primary_holo.9.png │ ├── scrubber_secondary_holo.9.png │ ├── scrubber_track_holo_dark.9.png │ ├── splash.jpg │ ├── tip_bg.9.png │ ├── volume_must.png │ ├── volume_no_nomal.png │ └── volume_no_selected.png │ ├── drawable │ ├── back_fast_selector.xml │ ├── dlna_search_selector.xml │ ├── go_fast_selector.xml │ ├── mediacontroller_pause_button.xml │ ├── mediacontroller_play_button.xml │ ├── next_video_selector.xml │ ├── pre_video_selector.xml │ ├── scrubber_control_selector_holo.xml │ └── scrubber_progress_horizontal_holo_dark.xml │ ├── layout │ ├── activity_control.xml │ ├── activity_main.xml │ ├── activity_splash.xml │ ├── empty_view.xml │ └── item_lv_main.xml │ ├── mipmap-hdpi │ └── ic_launcher.png │ ├── values-w820dp │ └── dimens.xml │ └── values │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── library ├── build.gradle ├── library.iml ├── libs │ └── clink210.jar ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── charon │ │ └── library │ │ └── ApplicationTest.java │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── org │ │ └── cybergarage │ │ ├── sql │ │ ├── Database.java │ │ └── mysql │ │ │ └── MySQL.java │ │ └── upnp │ │ └── std │ │ └── av │ │ ├── controller │ │ ├── MediaController.java │ │ └── server │ │ │ ├── BrowseAction.java │ │ │ └── BrowseResult.java │ │ ├── player │ │ ├── MediaPlayer.java │ │ └── action │ │ │ ├── BrowseAction.java │ │ │ ├── BrowseResult.java │ │ │ └── BrowseResultNode.java │ │ ├── renderer │ │ ├── AVTransport.java │ │ ├── AVTransportInfo.java │ │ ├── AVTransportInfoList.java │ │ ├── ConnectionInfo.java │ │ ├── ConnectionInfoList.java │ │ ├── ConnectionManager.java │ │ ├── MediaRenderer.java │ │ └── RenderingControl.java │ │ └── server │ │ ├── ConnectionInfo.java │ │ ├── ConnectionInfoList.java │ │ ├── ConnectionManager.java │ │ ├── ContentDirectory.java │ │ ├── DC.java │ │ ├── Directory.java │ │ ├── DirectoryList.java │ │ ├── MediaServer.java │ │ ├── UPnP.java │ │ ├── action │ │ ├── BrowseAction.java │ │ └── SearchAction.java │ │ ├── directory │ │ ├── file │ │ │ └── FileDirectory.java │ │ ├── gateway │ │ │ └── GatewayDirectory.java │ │ └── mythtv │ │ │ ├── MythDatabase.java │ │ │ ├── MythDirectory.java │ │ │ └── MythRecordedInfo.java │ │ └── object │ │ ├── ContentNode.java │ │ ├── ContentNodeList.java │ │ ├── ContentProperty.java │ │ ├── ContentPropertyList.java │ │ ├── DIDLLite.java │ │ ├── DIDLLiteNode.java │ │ ├── Format.java │ │ ├── FormatList.java │ │ ├── FormatObject.java │ │ ├── SearchCap.java │ │ ├── SearchCapList.java │ │ ├── SearchCriteria.java │ │ ├── SearchCriteriaList.java │ │ ├── SortCap.java │ │ ├── SortCapList.java │ │ ├── SortCriterionList.java │ │ ├── container │ │ ├── ContainerNode.java │ │ └── RootNode.java │ │ ├── format │ │ ├── DefaultFormat.java │ │ ├── GIFFormat.java │ │ ├── Header.java │ │ ├── ID3Format.java │ │ ├── ID3Frame.java │ │ ├── ID3FrameList.java │ │ ├── ImageIOFormat.java │ │ ├── JPEGFormat.java │ │ ├── MPEGFormat.java │ │ └── PNGFormat.java │ │ ├── item │ │ ├── ItemNode.java │ │ ├── ItemNodeList.java │ │ ├── ResourceNode.java │ │ ├── ResourceNodeList.java │ │ ├── file │ │ │ ├── FileItemNode.java │ │ │ └── FileItemNodeList.java │ │ └── mythtv │ │ │ └── MythRecordedItemNode.java │ │ ├── search │ │ ├── IdSearchCap.java │ │ └── TitleSearchCap.java │ │ └── sort │ │ ├── DCDateSortCap.java │ │ ├── DCTitleSortCap.java │ │ └── UPnPClassSortCap.java │ └── res │ └── values │ ├── dimens.xml │ └── strings.xml ├── local.properties └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | # Built application files 2 | *.apk 3 | *.ap_ 4 | 5 | # Files for the Dalvik VM 6 | *.dex 7 | 8 | # Java class files 9 | *.class 10 | 11 | # Generated files 12 | bin/ 13 | gen/ 14 | 15 | # Gradle files 16 | .gradle/ 17 | build/ 18 | /*/build/ 19 | 20 | # Local configuration file (sdk path, etc) 21 | local.properties 22 | 23 | # Proguard folder generated by Eclipse 24 | proguard/ 25 | 26 | # Log Files 27 | *.log 28 | 29 | .idea/ 30 | *.iml -------------------------------------------------------------------------------- /CyberLink4Android.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /Pic/dlna01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonChui/CyberLink4Android/0175bdc9c3cb3a35aab74ec68e6a9c745f135e1f/Pic/dlna01.jpg -------------------------------------------------------------------------------- /Pic/dlna02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonChui/CyberLink4Android/0175bdc9c3cb3a35aab74ec68e6a9c745f135e1f/Pic/dlna02.jpg -------------------------------------------------------------------------------- /Pic/dlna03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonChui/CyberLink4Android/0175bdc9c3cb3a35aab74ec68e6a9c745f135e1f/Pic/dlna03.jpg -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | CyberLink4Android 2 | === 3 | 4 | CyberLink for Android is a **DLNA** development package for UPnP™ developers on Android development. CyberLink controls these protocols automatically, and supports to create your devices and control points quickly.The file on www.cybergarage.org for Android can only realize the find and browse function, so I combine the Cyberlink4Java and the jar for Android make this Cyberlink for Android. 5 | 6 | - **See http://www.cybergarage.org for more information.** 7 | - **[CyberLink4Java](https://github.com/cybergarage/CyberLink4Java)** 8 | 9 | ![image](https://raw.githubusercontent.com/CharonChui/CyberLink4Android/master/Pic/dlna01.jpg) 10 | ![image](https://raw.githubusercontent.com/CharonChui/CyberLink4Android/master/Pic/dlna02.jpg) 11 | ![image](https://raw.githubusercontent.com/CharonChui/CyberLink4Android/master/Pic/dlna03.jpg) 12 | 13 | Status 14 | === 15 | 16 | * [![Maven Central](http://img.shields.io/badge/2015.07.30-com.charonchui.cyberlink:library:1.0.0-brightgreen.svg)](https://oss.sonatype.org/content/repositories/releases/com/charonchui/cyberlink/library/1.0.0/) 17 | 18 | 19 | Usage 20 | === 21 | 22 | for Gradle 23 | --- 24 | 25 | If you are building with Gradle, simply add the following line to the `dependencies` section of your `build.gradle` file : 26 | `compile 'com.charonchui.cyberlink:library:1.0.0'` 27 | 28 | for Maven 29 | --- 30 | 31 | ```xml 32 | 33 | com.charonchui.cyberlink 34 | library 35 | 1.0.0 36 | 37 | ``` 38 | 39 | Developed By 40 | === 41 | 42 | * Charon Chui - 43 | 44 | 45 | License 46 | === 47 | 48 | Copyright (C) 2013 Charon Chui 49 | 50 | Licensed under the Apache License, Version 2.0 (the "License"); 51 | you may not use this file except in compliance with the License. 52 | You may obtain a copy of the License at 53 | 54 | http://www.apache.org/licenses/LICENSE-2.0 55 | 56 | Unless required by applicable law or agreed to in writing, software 57 | distributed under the License is distributed on an "AS IS" BASIS, 58 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 59 | See the License for the specific language governing permissions and 60 | limitations under the License. 61 | -------------------------------------------------------------------------------- /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:1.2.3' 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 | -------------------------------------------------------------------------------- /build/intermediates/dex-cache/cache.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /build/intermediates/gradle_project_sync_data.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonChui/CyberLink4Android/0175bdc9c3cb3a35aab74ec68e6a9c745f135e1f/build/intermediates/gradle_project_sync_data.bin -------------------------------------------------------------------------------- /dmc_sample/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 22 5 | buildToolsVersion "22.0.1" 6 | 7 | defaultConfig { 8 | applicationId "com.charonchui.cyberlink" 9 | minSdkVersion 8 10 | targetSdkVersion 22 11 | versionCode 1 12 | versionName "1.0" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | compile fileTree(dir: 'libs', include: ['*.jar']) 24 | compile project(':library') 25 | } 26 | -------------------------------------------------------------------------------- /dmc_sample/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 /home/xuchuanren/android-sdks/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 | -------------------------------------------------------------------------------- /dmc_sample/src/androidTest/java/com/charonchui/cyberlink/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.charon.cyberlink; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /dmc_sample/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 11 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /dmc_sample/src/main/java/com/charonchui/cyberlink/BaseActivity.java: -------------------------------------------------------------------------------- 1 | package com.charon.cyberlink; 2 | 3 | import android.app.Activity; 4 | import android.os.Bundle; 5 | 6 | public class BaseActivity extends Activity { 7 | 8 | @Override 9 | protected void onCreate(Bundle savedInstanceState) { 10 | super.onCreate(savedInstanceState); 11 | DMCApplication.getInstance().addActivity(this); 12 | } 13 | 14 | @Override 15 | protected void onDestroy() { 16 | DMCApplication.getInstance().removeActivity(this); 17 | super.onDestroy(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /dmc_sample/src/main/java/com/charonchui/cyberlink/DMCApplication.java: -------------------------------------------------------------------------------- 1 | package com.charon.cyberlink; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import org.cybergarage.upnp.ControlPoint; 7 | 8 | import android.app.Activity; 9 | import android.app.Application; 10 | 11 | public class DMCApplication extends Application { 12 | private static DMCApplication mDmcApplication; 13 | 14 | private List activities; 15 | 16 | public ControlPoint mControlPoint; 17 | 18 | @Override 19 | public void onCreate() { 20 | super.onCreate(); 21 | if (activities != null) { 22 | activities = null; 23 | } 24 | activities = new ArrayList(); 25 | mDmcApplication = this; 26 | } 27 | 28 | /** 29 | * Add this activity to the list set. Please use this on the activity's 30 | * onCreate method. 31 | * 32 | * @param activity 33 | * The activity to be added. 34 | */ 35 | public void addActivity(Activity activity) { 36 | if (activities != null) { 37 | if (activities.contains(activity)) { 38 | activities.remove(activity); 39 | } 40 | activities.add(activity); 41 | } 42 | } 43 | 44 | /** 45 | * Remove this activity from the list set. On every activity's onDestroy 46 | * method we all should use this method. 47 | * 48 | * @param activity 49 | */ 50 | public void removeActivity(Activity activity) { 51 | if (activities != null && activities.contains(activity)) { 52 | activities.remove(activity); 53 | } 54 | } 55 | 56 | /** 57 | * Get the application instance. 58 | * 59 | * @return DMCApplication 60 | */ 61 | public static DMCApplication getInstance() { 62 | return mDmcApplication; 63 | } 64 | 65 | /** 66 | * Quit this application. 67 | */ 68 | public void quit() { 69 | if (activities != null) { 70 | for (Activity activity : activities) { 71 | activity.finish(); 72 | } 73 | activities = null; 74 | } 75 | } 76 | 77 | /** 78 | * Set the ControlPoint have been used in this application, to make sure it 79 | * is the same one in this application. 80 | * 81 | * @param controlPoint 82 | * The ControlPoint we have created first in this application. 83 | */ 84 | public void setControlPoint(ControlPoint controlPoint) { 85 | mControlPoint = controlPoint; 86 | } 87 | 88 | /** 89 | * Get the ControlPoint have been set by setControlPoint method, this may be 90 | * null. 91 | * 92 | * @return The ControlPoint have been set by by setControlPoint. 93 | */ 94 | public ControlPoint getControlPoint() { 95 | return mControlPoint; 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /dmc_sample/src/main/java/com/charonchui/cyberlink/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.charon.cyberlink; 2 | 3 | import java.util.List; 4 | 5 | import org.cybergarage.upnp.Device; 6 | 7 | import android.content.Intent; 8 | import android.os.Bundle; 9 | import android.view.View; 10 | import android.view.View.OnClickListener; 11 | import android.view.ViewGroup; 12 | import android.view.ViewGroup.LayoutParams; 13 | import android.widget.AdapterView; 14 | import android.widget.AdapterView.OnItemClickListener; 15 | import android.widget.BaseAdapter; 16 | import android.widget.Button; 17 | import android.widget.ListView; 18 | import android.widget.TextView; 19 | import android.widget.Toast; 20 | 21 | import com.charon.cyberlink.engine.DLNAContainer; 22 | import com.charon.cyberlink.engine.DLNAContainer.DeviceChangeListener; 23 | import com.charon.cyberlink.service.DLNAService; 24 | import com.charon.cyberlink.util.LogUtil; 25 | 26 | public class MainActivity extends BaseActivity { 27 | protected static final String TAG = "MainActivity"; 28 | private Button btn_main; 29 | private ListView lv_main; 30 | private View emptyView; 31 | private List mDevices; 32 | private DeviceAdapter mDeviceAdapter; 33 | 34 | @Override 35 | protected void onCreate(Bundle savedInstanceState) { 36 | super.onCreate(savedInstanceState); 37 | setContentView(R.layout.activity_main); 38 | findView(); 39 | initView(); 40 | } 41 | 42 | @Override 43 | protected void onResume() { 44 | super.onResume(); 45 | refresh(); 46 | } 47 | 48 | @Override 49 | protected void onDestroy() { 50 | super.onDestroy(); 51 | stopDLNAService(); 52 | } 53 | 54 | private void findView() { 55 | btn_main = (Button) findViewById(R.id.btn_main); 56 | lv_main = (ListView) findViewById(R.id.lv_main); 57 | } 58 | 59 | private void initView() { 60 | btn_main.setOnClickListener(new OnClickListener() { 61 | 62 | @Override 63 | public void onClick(View v) { 64 | Toast.makeText(MainActivity.this, "start dlna service to find dlna devices.", Toast.LENGTH_SHORT).show(); 65 | startDLNAService(); 66 | mDevices = DLNAContainer.getInstance().getDevices(); 67 | LogUtil.d(TAG, "mDevices size:" + mDevices.size()); 68 | refresh(); 69 | } 70 | }); 71 | 72 | emptyView = View.inflate(this, R.layout.empty_view, null); 73 | addContentView(emptyView, new LayoutParams(LayoutParams.MATCH_PARENT, 74 | LayoutParams.MATCH_PARENT)); 75 | lv_main.setEmptyView(emptyView); 76 | 77 | mDeviceAdapter = new DeviceAdapter(); 78 | mDevices = DLNAContainer.getInstance().getDevices(); 79 | lv_main.setAdapter(mDeviceAdapter); 80 | lv_main.setOnItemClickListener(new OnItemClickListener() { 81 | 82 | @Override 83 | public void onItemClick(AdapterView parent, View view, 84 | int position, long id) { 85 | DLNAContainer.getInstance().setSelectedDevice(mDevices.get(position)); 86 | startControlActivity(); 87 | } 88 | }); 89 | 90 | DLNAContainer.getInstance().setDeviceChangeListener( 91 | new DeviceChangeListener() { 92 | 93 | @Override 94 | public void onDeviceChange(Device device) { 95 | runOnUiThread(new Runnable() { 96 | public void run() { 97 | refresh(); 98 | } 99 | }); 100 | } 101 | }); 102 | } 103 | 104 | private void refresh() { 105 | if (mDeviceAdapter != null) { 106 | mDeviceAdapter.notifyDataSetChanged(); 107 | } 108 | } 109 | 110 | private void startDLNAService() { 111 | Intent intent = new Intent(getApplicationContext(), DLNAService.class); 112 | startService(intent); 113 | } 114 | 115 | private void stopDLNAService() { 116 | Intent intent = new Intent(getApplicationContext(), DLNAService.class); 117 | stopService(intent); 118 | } 119 | 120 | private void startControlActivity() { 121 | Intent intent = new Intent(getApplicationContext(), 122 | ControlActivity.class); 123 | startActivity(intent); 124 | } 125 | 126 | private class DeviceAdapter extends BaseAdapter { 127 | 128 | @Override 129 | public int getCount() { 130 | if (mDevices == null) { 131 | return 0; 132 | } else { 133 | return mDevices.size(); 134 | } 135 | } 136 | 137 | @Override 138 | public Object getItem(int position) { 139 | if (mDevices != null) { 140 | return mDevices.get(position); 141 | } 142 | 143 | return null; 144 | } 145 | 146 | @Override 147 | public long getItemId(int position) { 148 | return position; 149 | } 150 | 151 | @Override 152 | public View getView(int position, View convertView, ViewGroup parent) { 153 | ViewHolder holder; 154 | if (convertView == null) { 155 | convertView = View.inflate(getApplicationContext(), 156 | R.layout.item_lv_main, null); 157 | holder = new ViewHolder(); 158 | convertView.setTag(holder); 159 | } else { 160 | holder = (ViewHolder) convertView.getTag(); 161 | } 162 | holder.tv_name_item = (TextView) convertView 163 | .findViewById(R.id.tv_name_item); 164 | holder.tv_name_item.setText(mDevices.get(position) 165 | .getFriendlyName()); 166 | return convertView; 167 | } 168 | } 169 | 170 | static class ViewHolder { 171 | private TextView tv_name_item; 172 | } 173 | 174 | } 175 | -------------------------------------------------------------------------------- /dmc_sample/src/main/java/com/charonchui/cyberlink/SplashActivity.java: -------------------------------------------------------------------------------- 1 | package com.charon.cyberlink; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.os.Handler; 6 | import android.view.animation.AlphaAnimation; 7 | import android.widget.ImageView; 8 | 9 | import com.charon.cyberlink.engine.DLNAContainer; 10 | import com.charon.cyberlink.service.DLNAService; 11 | 12 | /** 13 | * Splash activity, show the welcome image and start the DLNAService. 14 | * 15 | * @author CharonChui 16 | * 17 | */ 18 | public class SplashActivity extends BaseActivity { 19 | private ImageView iv_splash; 20 | 21 | private Handler handler = new Handler(); 22 | 23 | private static final int sDelayTime = 2000; 24 | 25 | @Override 26 | protected void onCreate(Bundle savedInstanceState) { 27 | super.onCreate(savedInstanceState); 28 | setContentView(R.layout.activity_splash); 29 | startDLNAService(); 30 | findView(); 31 | setUp(); 32 | } 33 | 34 | private void findView() { 35 | iv_splash = (ImageView) findViewById(R.id.iv_splash); 36 | } 37 | 38 | private void setUp() { 39 | playAnimation(); 40 | handler.postDelayed(new Runnable() { 41 | 42 | @Override 43 | public void run() { 44 | startMainActivity(); 45 | } 46 | }, sDelayTime); 47 | } 48 | 49 | private void playAnimation() { 50 | AlphaAnimation alphaAnimation = new AlphaAnimation(0.2f, 1.0f); 51 | alphaAnimation.setDuration(sDelayTime); 52 | alphaAnimation.setFillAfter(true); 53 | iv_splash.startAnimation(alphaAnimation); 54 | } 55 | 56 | private void startMainActivity() { 57 | Intent intent = new Intent(getApplicationContext(), MainActivity.class); 58 | startActivity(intent); 59 | finish(); 60 | } 61 | 62 | private void startDLNAService() { 63 | // Clear the device container. 64 | DLNAContainer.getInstance().clear(); 65 | Intent intent = new Intent(getApplicationContext(), DLNAService.class); 66 | startService(intent); 67 | } 68 | 69 | } 70 | -------------------------------------------------------------------------------- /dmc_sample/src/main/java/com/charonchui/cyberlink/engine/DLNAContainer.java: -------------------------------------------------------------------------------- 1 | package com.charon.cyberlink.engine; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import org.cybergarage.upnp.Device; 7 | 8 | import com.charon.cyberlink.util.DLNAUtil; 9 | import com.charon.cyberlink.util.LogUtil; 10 | 11 | public class DLNAContainer { 12 | private List mDevices; 13 | private Device mSelectedDevice; 14 | private DeviceChangeListener mDeviceChangeListener; 15 | private static final DLNAContainer mDLNAContainer = new DLNAContainer(); 16 | private static final String TAG = "DLNAContainer"; 17 | 18 | private DLNAContainer() { 19 | mDevices = new ArrayList(); 20 | } 21 | 22 | public static DLNAContainer getInstance() { 23 | return mDLNAContainer; 24 | } 25 | 26 | public synchronized void addDevice(Device d) { 27 | if (!DLNAUtil.isMediaRenderDevice(d)) 28 | return; 29 | int size = mDevices.size(); 30 | for (int i = 0; i < size; i++) { 31 | String udnString = mDevices.get(i).getUDN(); 32 | if (d.getUDN().equalsIgnoreCase(udnString)) { 33 | return; 34 | } 35 | } 36 | 37 | mDevices.add(d); 38 | LogUtil.d(TAG, "Devices add a device" + d.getDeviceType()); 39 | if (mDeviceChangeListener != null) { 40 | mDeviceChangeListener.onDeviceChange(d); 41 | } 42 | } 43 | 44 | public synchronized void removeDevice(Device d) { 45 | if (!DLNAUtil.isMediaRenderDevice(d)) { 46 | return; 47 | } 48 | int size = mDevices.size(); 49 | for (int i = 0; i < size; i++) { 50 | String udnString = mDevices.get(i).getUDN(); 51 | if (d.getUDN().equalsIgnoreCase(udnString)) { 52 | Device device = mDevices.remove(i); 53 | LogUtil.d(TAG, "Devices remove a device"); 54 | 55 | boolean ret = false; 56 | if (mSelectedDevice != null) { 57 | ret = mSelectedDevice.getUDN().equalsIgnoreCase( 58 | device.getUDN()); 59 | } 60 | if (ret) { 61 | mSelectedDevice = null; 62 | } 63 | if (mDeviceChangeListener != null) { 64 | mDeviceChangeListener.onDeviceChange(d); 65 | } 66 | break; 67 | } 68 | } 69 | } 70 | 71 | public synchronized void clear() { 72 | if (mDevices != null) { 73 | mDevices.clear(); 74 | mSelectedDevice = null; 75 | } 76 | } 77 | 78 | public Device getSelectedDevice() { 79 | return mSelectedDevice; 80 | } 81 | 82 | public void setSelectedDevice(Device mSelectedDevice) { 83 | this.mSelectedDevice = mSelectedDevice; 84 | } 85 | 86 | public void setDeviceChangeListener( 87 | DeviceChangeListener deviceChangeListener) { 88 | mDeviceChangeListener = deviceChangeListener; 89 | } 90 | 91 | public List getDevices() { 92 | return mDevices; 93 | } 94 | 95 | public interface DeviceChangeListener { 96 | void onDeviceChange(Device device); 97 | } 98 | 99 | } 100 | -------------------------------------------------------------------------------- /dmc_sample/src/main/java/com/charonchui/cyberlink/engine/SearchThread.java: -------------------------------------------------------------------------------- 1 | package com.charon.cyberlink.engine; 2 | 3 | import org.cybergarage.upnp.ControlPoint; 4 | import org.cybergarage.upnp.Device; 5 | import org.cybergarage.upnp.device.DeviceChangeListener; 6 | 7 | import com.charon.cyberlink.util.LogUtil; 8 | 9 | /** 10 | * A thread to search the devices all the time. 11 | * 12 | * @author CharonChui 13 | */ 14 | public class SearchThread extends Thread { 15 | private boolean flag = true; 16 | private ControlPoint mControlPoint; 17 | private boolean mStartComplete; 18 | private int mSearchTimes; 19 | private static final int mFastInternalTime = 15000; 20 | private static final int mNormalInternalTime = 3600000; 21 | private static final String TAG = "SearchThread"; 22 | 23 | public SearchThread(ControlPoint mControlPoint) { 24 | super(); 25 | this.mControlPoint = mControlPoint; 26 | this.mControlPoint.addDeviceChangeListener(mDeviceChangeListener); 27 | } 28 | 29 | @Override 30 | public void run() { 31 | while (flag) { 32 | if (mControlPoint == null) { 33 | break; 34 | } 35 | searchDevices(); 36 | } 37 | } 38 | 39 | /** 40 | * Search for the DLNA devices. 41 | */ 42 | private void searchDevices() { 43 | try { 44 | if (mStartComplete) { 45 | mControlPoint.search(); 46 | LogUtil.d(TAG, "controlpoint search..."); 47 | } else { 48 | mControlPoint.stop(); 49 | boolean startRet = mControlPoint.start(); 50 | LogUtil.d(TAG, "controlpoint start:" + startRet); 51 | if (startRet) { 52 | mStartComplete = true; 53 | } 54 | } 55 | } catch (Exception e) { 56 | e.printStackTrace(); 57 | } 58 | // Search the devices five times fast, and after that we can make it 59 | // search lowly to save the power. 60 | synchronized (this) { 61 | try { 62 | mSearchTimes++; 63 | if (mSearchTimes >= 5) { 64 | wait(mNormalInternalTime); 65 | } else { 66 | wait(mFastInternalTime); 67 | } 68 | } catch (Exception e) { 69 | e.printStackTrace(); 70 | } 71 | } 72 | } 73 | 74 | /** 75 | * Set the search times, set this to 0 to make it search fast. 76 | * 77 | * @param searchTimes 78 | * The times we have searched. 79 | */ 80 | public synchronized void setSearcTimes(int searchTimes) { 81 | this.mSearchTimes = searchTimes; 82 | } 83 | 84 | /** 85 | * Notify all the thread. 86 | */ 87 | public void awake() { 88 | synchronized (this) { 89 | notifyAll(); 90 | } 91 | } 92 | 93 | /** 94 | * Stop the thread, if quit this application we should use this method to 95 | * stop the thread. 96 | */ 97 | public void stopThread() { 98 | flag = false; 99 | awake(); 100 | } 101 | 102 | private DeviceChangeListener mDeviceChangeListener = new DeviceChangeListener() { 103 | 104 | @Override 105 | public void deviceRemoved(Device dev) { 106 | LogUtil.d(TAG, "control point remove a device"); 107 | DLNAContainer.getInstance().removeDevice(dev); 108 | } 109 | 110 | @Override 111 | public void deviceAdded(Device dev) { 112 | LogUtil.d(TAG, "control point add a device..." + dev.getDeviceType() + dev.getFriendlyName()); 113 | DLNAContainer.getInstance().addDevice(dev); 114 | } 115 | }; 116 | } -------------------------------------------------------------------------------- /dmc_sample/src/main/java/com/charonchui/cyberlink/inter/IController.java: -------------------------------------------------------------------------------- 1 | package com.charon.cyberlink.inter; 2 | 3 | import org.cybergarage.upnp.Device; 4 | 5 | public interface IController { 6 | 7 | /** 8 | * Play the video with the video path. 9 | * 10 | * @param device 11 | * The device be controlled. 12 | * @param path 13 | * The path of the video. 14 | * @return If is success to play the video. 15 | */ 16 | boolean play(Device device, String path); 17 | 18 | /** 19 | * Go on playing the video from the position. 20 | * 21 | * @param device 22 | * The device be controlled. 23 | * @param pausePosition 24 | * The format must be 00:00:00. 25 | */ 26 | boolean goon(Device device, String pausePosition); 27 | 28 | /** 29 | * All the state is "STOPPED" // "PLAYING" // "TRANSITIONING"// 30 | * "PAUSED_PLAYBACK"// "PAUSED_RECORDING"// "RECORDING" // 31 | * "NO_MEDIA_PRESENT// 32 | */ 33 | String getTransportState(Device device); 34 | 35 | /** 36 | * Get the min volume value,this must be 0. 37 | * 38 | * @param device 39 | * @return 40 | */ 41 | int getMinVolumeValue(Device device); 42 | 43 | /** 44 | * Get the max volume value, usually it is 100. 45 | * 46 | * @param device 47 | * The device be controlled. 48 | * @return The max volume value. 49 | */ 50 | int getMaxVolumeValue(Device device); 51 | 52 | /** 53 | * Seek the playing video to a target position. 54 | * 55 | * @param device 56 | * The device be controlled. 57 | * @param targetPosition 58 | * Target position we want to set. 59 | * @return 60 | */ 61 | boolean seek(Device device, String targetPosition); 62 | 63 | /** 64 | * Get the current playing position of the video. 65 | * 66 | * @param device 67 | * The device be controlled. 68 | * @return Current playing position is 00:00:00 69 | */ 70 | String getPositionInfo(Device device); 71 | 72 | /** 73 | * Get the duration of the video playing. 74 | * 75 | * @param device 76 | * The device be controlled. 77 | * @return The media duration like 00:00:00,if get failed it will return 78 | * null. 79 | */ 80 | String getMediaDuration(Device device); 81 | 82 | /** 83 | * Mute the device or not. 84 | * 85 | * @param device 86 | * The device be controlled. 87 | * @param targetValue 88 | * 1 is that want mute, 0 if you want make it off of mute. 89 | * @return If is success to mute the device. 90 | */ 91 | boolean setMute(Device device, String targetValue); 92 | 93 | /** 94 | * Get if the device is mute. 95 | * 96 | * @param device 97 | * The device be controlled. 98 | * @return 1 is mute, otherwise will return 0. 99 | */ 100 | String getMute(Device device); 101 | 102 | /** 103 | * Set the device's voice. 104 | * 105 | * @param device 106 | * The device be controlled. 107 | * @param value 108 | * Target voice want be set. 109 | * @return 110 | */ 111 | boolean setVoice(Device device, int value); 112 | 113 | /** 114 | * Get the current voice of the device. 115 | * 116 | * @param device 117 | * The device be controlled. 118 | * @return Current voice. 119 | */ 120 | int getVoice(Device device); 121 | 122 | /** 123 | * Stop to play. 124 | * 125 | * @param device 126 | * The device to controlled. 127 | * @return If if success to stop the video. 128 | */ 129 | boolean stop(Device device); 130 | 131 | /** 132 | * Pause the playing video. 133 | * 134 | * @param device 135 | * The device to controlled. 136 | * @return If if success to pause the video. 137 | */ 138 | boolean pause(Device device); 139 | } 140 | -------------------------------------------------------------------------------- /dmc_sample/src/main/java/com/charonchui/cyberlink/service/DLNAService.java: -------------------------------------------------------------------------------- 1 | package com.charon.cyberlink.service; 2 | 3 | import org.cybergarage.upnp.ControlPoint; 4 | 5 | import android.app.Service; 6 | import android.content.BroadcastReceiver; 7 | import android.content.Context; 8 | import android.content.Intent; 9 | import android.content.IntentFilter; 10 | import android.net.ConnectivityManager; 11 | import android.net.wifi.WifiManager; 12 | import android.os.Bundle; 13 | import android.os.IBinder; 14 | 15 | import com.charon.cyberlink.DMCApplication; 16 | import com.charon.cyberlink.engine.SearchThread; 17 | import com.charon.cyberlink.util.LogUtil; 18 | 19 | /** 20 | * The service to search the DLNA Device in background all the time. 21 | * 22 | * @author CharonChui 23 | * 24 | */ 25 | public class DLNAService extends Service { 26 | private static final String TAG = "DLNAService"; 27 | private ControlPoint mControlPoint; 28 | private SearchThread mSearchThread; 29 | private WifiStateReceiver mWifiStateReceiver; 30 | 31 | @Override 32 | public IBinder onBind(Intent intent) { 33 | return null; 34 | } 35 | 36 | @Override 37 | public void onCreate() { 38 | super.onCreate(); 39 | init(); 40 | } 41 | 42 | @Override 43 | public void onDestroy() { 44 | super.onDestroy(); 45 | unInit(); 46 | } 47 | 48 | @Override 49 | public int onStartCommand(Intent intent, int flags, int startId) { 50 | startThread(); 51 | return super.onStartCommand(intent, flags, startId); 52 | } 53 | 54 | private void init() { 55 | mControlPoint = new ControlPoint(); 56 | DMCApplication.getInstance().setControlPoint(mControlPoint); 57 | mSearchThread = new SearchThread(mControlPoint); 58 | registerWifiStateReceiver(); 59 | } 60 | 61 | private void unInit() { 62 | stopThread(); 63 | unregisterWifiStateReceiver(); 64 | } 65 | 66 | /** 67 | * Make the thread start to search devices. 68 | */ 69 | private void startThread() { 70 | if (mSearchThread != null) { 71 | LogUtil.d(TAG, "thread is not null"); 72 | mSearchThread.setSearcTimes(0); 73 | } else { 74 | LogUtil.d(TAG, "thread is null, create a new thread"); 75 | mSearchThread = new SearchThread(mControlPoint); 76 | } 77 | 78 | if (mSearchThread.isAlive()) { 79 | LogUtil.d(TAG, "thread is alive"); 80 | mSearchThread.awake(); 81 | } else { 82 | LogUtil.d(TAG, "start the thread"); 83 | mSearchThread.start(); 84 | } 85 | } 86 | 87 | private void stopThread() { 88 | if (mSearchThread != null) { 89 | mSearchThread.stopThread(); 90 | mControlPoint.stop(); 91 | mSearchThread = null; 92 | mControlPoint = null; 93 | LogUtil.w(TAG, "stop dlna service"); 94 | } 95 | } 96 | 97 | private void registerWifiStateReceiver() { 98 | if (mWifiStateReceiver == null) { 99 | mWifiStateReceiver = new WifiStateReceiver(); 100 | registerReceiver(mWifiStateReceiver, new IntentFilter( 101 | ConnectivityManager.CONNECTIVITY_ACTION)); 102 | } 103 | } 104 | 105 | private void unregisterWifiStateReceiver() { 106 | if (mWifiStateReceiver != null) { 107 | unregisterReceiver(mWifiStateReceiver); 108 | mWifiStateReceiver = null; 109 | } 110 | } 111 | 112 | private class WifiStateReceiver extends BroadcastReceiver { 113 | @Override 114 | public void onReceive(Context c, Intent intent) { 115 | Bundle bundle = intent.getExtras(); 116 | int statusInt = bundle.getInt("wifi_state"); 117 | switch (statusInt) { 118 | case WifiManager.WIFI_STATE_UNKNOWN: 119 | break; 120 | case WifiManager.WIFI_STATE_ENABLING: 121 | break; 122 | case WifiManager.WIFI_STATE_ENABLED: 123 | LogUtil.e(TAG, "wifi enable"); 124 | startThread(); 125 | break; 126 | case WifiManager.WIFI_STATE_DISABLING: 127 | break; 128 | case WifiManager.WIFI_STATE_DISABLED: 129 | LogUtil.e(TAG, "wifi disabled"); 130 | break; 131 | default: 132 | break; 133 | } 134 | } 135 | } 136 | 137 | } -------------------------------------------------------------------------------- /dmc_sample/src/main/java/com/charonchui/cyberlink/util/DLNAUtil.java: -------------------------------------------------------------------------------- 1 | package com.charon.cyberlink.util; 2 | 3 | import org.cybergarage.upnp.Device; 4 | 5 | public class DLNAUtil { 6 | private static final String MEDIARENDER = "urn:schemas-upnp-org:device:MediaRenderer:1"; 7 | 8 | /** 9 | * Check if the device is a media render device 10 | * 11 | * @param device 12 | * @return 13 | */ 14 | public static boolean isMediaRenderDevice(Device device) { 15 | if (device != null 16 | && MEDIARENDER.equalsIgnoreCase(device.getDeviceType())) { 17 | return true; 18 | } 19 | 20 | return false; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /dmc_sample/src/main/java/com/charonchui/cyberlink/util/LogUtil.java: -------------------------------------------------------------------------------- 1 | package com.charon.cyberlink.util; 2 | 3 | import android.util.Log; 4 | 5 | /** 6 | * Log utilities that can control whether print the log. 7 | */ 8 | public class LogUtil { 9 | private static final int LOG_LEVEL = 6; 10 | 11 | private static final int VERBOSE = 5; 12 | private static final int DEBUG = 4; 13 | private static final int INFO = 3; 14 | private static final int WARN = 2; 15 | private static final int ERROR = 1; 16 | 17 | public static void v(String tag, String msg) { 18 | if (LOG_LEVEL > VERBOSE) { 19 | Log.v(tag, msg); 20 | } 21 | } 22 | 23 | public static void d(String tag, String msg) { 24 | if (LOG_LEVEL > DEBUG) { 25 | Log.d(tag, msg); 26 | } 27 | } 28 | 29 | public static void i(String tag, String msg) { 30 | if (LOG_LEVEL > INFO) { 31 | Log.i(tag, msg); 32 | } 33 | } 34 | 35 | public static void w(String tag, String msg) { 36 | if (LOG_LEVEL > WARN) { 37 | Log.w(tag, msg); 38 | } 39 | } 40 | 41 | public static void e(String tag, String msg) { 42 | if (LOG_LEVEL > ERROR) { 43 | Log.e(tag, msg); 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /dmc_sample/src/main/java/com/charonchui/cyberlink/util/NetUtil.java: -------------------------------------------------------------------------------- 1 | package com.charon.cyberlink.util; 2 | 3 | import android.content.Context; 4 | import android.net.ConnectivityManager; 5 | import android.net.NetworkInfo; 6 | import android.net.wifi.WifiManager; 7 | 8 | /** 9 | * 网络连接的一些工具类 10 | */ 11 | public class NetUtil { 12 | 13 | /** 14 | * 判断当前网络是否可用 15 | */ 16 | public static boolean isNetAvailable(Context context) { 17 | ConnectivityManager connectivityManager = (ConnectivityManager) context 18 | .getSystemService(Context.CONNECTIVITY_SERVICE); 19 | NetworkInfo activeNetworkInfo = connectivityManager 20 | .getActiveNetworkInfo(); 21 | return activeNetworkInfo != null && activeNetworkInfo.isAvailable(); 22 | } 23 | 24 | /** 25 | * 判断WIFI是否使用 26 | */ 27 | public static boolean isWIFIActivate(Context context) { 28 | return ((WifiManager) context.getSystemService(Context.WIFI_SERVICE)) 29 | .isWifiEnabled(); 30 | } 31 | 32 | /** 33 | * 修改WIFI状态 34 | * 35 | * @param status 36 | * true为开启WIFI,false为关闭WIFI 37 | */ 38 | public static void changeWIFIStatus(Context context, boolean status) { 39 | ((WifiManager) context.getSystemService(Context.WIFI_SERVICE)) 40 | .setWifiEnabled(status); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable-hdpi/back_fast.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonChui/CyberLink4Android/0175bdc9c3cb3a35aab74ec68e6a9c745f135e1f/dmc_sample/src/main/res/drawable-hdpi/back_fast.png -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable-hdpi/back_fast_on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonChui/CyberLink4Android/0175bdc9c3cb3a35aab74ec68e6a9c745f135e1f/dmc_sample/src/main/res/drawable-hdpi/back_fast_on.png -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable-hdpi/devices.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonChui/CyberLink4Android/0175bdc9c3cb3a35aab74ec68e6a9c745f135e1f/dmc_sample/src/main/res/drawable-hdpi/devices.png -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable-hdpi/dlna_search_focused.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonChui/CyberLink4Android/0175bdc9c3cb3a35aab74ec68e6a9c745f135e1f/dmc_sample/src/main/res/drawable-hdpi/dlna_search_focused.9.png -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable-hdpi/dlna_search_normal.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonChui/CyberLink4Android/0175bdc9c3cb3a35aab74ec68e6a9c745f135e1f/dmc_sample/src/main/res/drawable-hdpi/dlna_search_normal.9.png -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable-hdpi/go_fast.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonChui/CyberLink4Android/0175bdc9c3cb3a35aab74ec68e6a9c745f135e1f/dmc_sample/src/main/res/drawable-hdpi/go_fast.png -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable-hdpi/go_fast_on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonChui/CyberLink4Android/0175bdc9c3cb3a35aab74ec68e6a9c745f135e1f/dmc_sample/src/main/res/drawable-hdpi/go_fast_on.png -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable-hdpi/home_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonChui/CyberLink4Android/0175bdc9c3cb3a35aab74ec68e6a9c745f135e1f/dmc_sample/src/main/res/drawable-hdpi/home_background.png -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonChui/CyberLink4Android/0175bdc9c3cb3a35aab74ec68e6a9c745f135e1f/dmc_sample/src/main/res/drawable-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable-hdpi/mediacontroller_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonChui/CyberLink4Android/0175bdc9c3cb3a35aab74ec68e6a9c745f135e1f/dmc_sample/src/main/res/drawable-hdpi/mediacontroller_bg.png -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable-hdpi/mediacontroller_pause01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonChui/CyberLink4Android/0175bdc9c3cb3a35aab74ec68e6a9c745f135e1f/dmc_sample/src/main/res/drawable-hdpi/mediacontroller_pause01.png -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable-hdpi/mediacontroller_pause02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonChui/CyberLink4Android/0175bdc9c3cb3a35aab74ec68e6a9c745f135e1f/dmc_sample/src/main/res/drawable-hdpi/mediacontroller_pause02.png -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable-hdpi/mediacontroller_play01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonChui/CyberLink4Android/0175bdc9c3cb3a35aab74ec68e6a9c745f135e1f/dmc_sample/src/main/res/drawable-hdpi/mediacontroller_play01.png -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable-hdpi/mediacontroller_play02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonChui/CyberLink4Android/0175bdc9c3cb3a35aab74ec68e6a9c745f135e1f/dmc_sample/src/main/res/drawable-hdpi/mediacontroller_play02.png -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable-hdpi/next_video_button_nomal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonChui/CyberLink4Android/0175bdc9c3cb3a35aab74ec68e6a9c745f135e1f/dmc_sample/src/main/res/drawable-hdpi/next_video_button_nomal.png -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable-hdpi/next_video_button_selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonChui/CyberLink4Android/0175bdc9c3cb3a35aab74ec68e6a9c745f135e1f/dmc_sample/src/main/res/drawable-hdpi/next_video_button_selected.png -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable-hdpi/pause_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonChui/CyberLink4Android/0175bdc9c3cb3a35aab74ec68e6a9c745f135e1f/dmc_sample/src/main/res/drawable-hdpi/pause_button.png -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable-hdpi/play_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonChui/CyberLink4Android/0175bdc9c3cb3a35aab74ec68e6a9c745f135e1f/dmc_sample/src/main/res/drawable-hdpi/play_button.png -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable-hdpi/pre_video_button_nomal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonChui/CyberLink4Android/0175bdc9c3cb3a35aab74ec68e6a9c745f135e1f/dmc_sample/src/main/res/drawable-hdpi/pre_video_button_nomal.png -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable-hdpi/pre_video_button_selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonChui/CyberLink4Android/0175bdc9c3cb3a35aab74ec68e6a9c745f135e1f/dmc_sample/src/main/res/drawable-hdpi/pre_video_button_selected.png -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable-hdpi/scrubber_control_disabled_holo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonChui/CyberLink4Android/0175bdc9c3cb3a35aab74ec68e6a9c745f135e1f/dmc_sample/src/main/res/drawable-hdpi/scrubber_control_disabled_holo.png -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable-hdpi/scrubber_control_focused_holo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonChui/CyberLink4Android/0175bdc9c3cb3a35aab74ec68e6a9c745f135e1f/dmc_sample/src/main/res/drawable-hdpi/scrubber_control_focused_holo.png -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable-hdpi/scrubber_control_normal_holo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonChui/CyberLink4Android/0175bdc9c3cb3a35aab74ec68e6a9c745f135e1f/dmc_sample/src/main/res/drawable-hdpi/scrubber_control_normal_holo.png -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable-hdpi/scrubber_control_pressed_holo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonChui/CyberLink4Android/0175bdc9c3cb3a35aab74ec68e6a9c745f135e1f/dmc_sample/src/main/res/drawable-hdpi/scrubber_control_pressed_holo.png -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable-hdpi/scrubber_primary_holo.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonChui/CyberLink4Android/0175bdc9c3cb3a35aab74ec68e6a9c745f135e1f/dmc_sample/src/main/res/drawable-hdpi/scrubber_primary_holo.9.png -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable-hdpi/scrubber_secondary_holo.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonChui/CyberLink4Android/0175bdc9c3cb3a35aab74ec68e6a9c745f135e1f/dmc_sample/src/main/res/drawable-hdpi/scrubber_secondary_holo.9.png -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable-hdpi/scrubber_track_holo_dark.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonChui/CyberLink4Android/0175bdc9c3cb3a35aab74ec68e6a9c745f135e1f/dmc_sample/src/main/res/drawable-hdpi/scrubber_track_holo_dark.9.png -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable-hdpi/splash.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonChui/CyberLink4Android/0175bdc9c3cb3a35aab74ec68e6a9c745f135e1f/dmc_sample/src/main/res/drawable-hdpi/splash.jpg -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable-hdpi/tip_bg.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonChui/CyberLink4Android/0175bdc9c3cb3a35aab74ec68e6a9c745f135e1f/dmc_sample/src/main/res/drawable-hdpi/tip_bg.9.png -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable-hdpi/volume_must.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonChui/CyberLink4Android/0175bdc9c3cb3a35aab74ec68e6a9c745f135e1f/dmc_sample/src/main/res/drawable-hdpi/volume_must.png -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable-hdpi/volume_no_nomal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonChui/CyberLink4Android/0175bdc9c3cb3a35aab74ec68e6a9c745f135e1f/dmc_sample/src/main/res/drawable-hdpi/volume_no_nomal.png -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable-hdpi/volume_no_selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonChui/CyberLink4Android/0175bdc9c3cb3a35aab74ec68e6a9c745f135e1f/dmc_sample/src/main/res/drawable-hdpi/volume_no_selected.png -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable/back_fast_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable/dlna_search_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable/go_fast_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable/mediacontroller_pause_button.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable/mediacontroller_play_button.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable/next_video_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable/pre_video_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable/scrubber_control_selector_holo.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /dmc_sample/src/main/res/drawable/scrubber_progress_horizontal_holo_dark.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 13 | 14 | 17 | 18 | 21 | 22 | 23 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /dmc_sample/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 |