2
0
mirror of https://github.com/KDE/kdeconnect-android synced 2025-09-01 22:55:10 +00:00

Apply coding style to whole project

Summary: Sorry for the huge diff, but all I did was applying Android Studio's 'Reformat Code' to all files. If everyone does that before submitting a patch we can keep it clean easily.

Test Plan: Compiles

Reviewers: #kde_connect, mtijink

Reviewed By: #kde_connect, mtijink

Subscribers: mtijink, sredman, #kde_connect

Tags: #kde_connect

Differential Revision: https://phabricator.kde.org/D10905
This commit is contained in:
Nicolas Fella
2018-03-03 16:06:52 +01:00
parent 0a08cd43cb
commit fa5a37c472
89 changed files with 1505 additions and 1345 deletions

View File

@@ -1,26 +1,25 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:paddingLeft="25dp"
android:paddingTop="25dp"
android:paddingRight="25dp"
android:paddingBottom="25dp"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent"
android:orientation="horizontal"
android:paddingBottom="25dp"
android:paddingLeft="25dp"
android:paddingRight="25dp"
android:paddingTop="25dp">
<ImageView <ImageView
android:id="@+id/album_art" android:id="@+id/album_art"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="1"
android:layout_marginRight="25dp" android:layout_marginRight="25dp"
android:layout_weight="1"
android:scaleType="fitCenter" /> android:scaleType="fitCenter" />
<include <include
layout="@layout/mpris_control"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="1" android:layout_weight="1" />
layout="@layout/mpris_control" />
</LinearLayout> </LinearLayout>

View File

@@ -2,105 +2,99 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical"
android:padding="@dimen/activity_vertical_margin" android:padding="@dimen/activity_vertical_margin"
tools:context="org.kde.kdeconnect.UserInterface.DeviceFragment" tools:context="org.kde.kdeconnect.UserInterface.DeviceFragment">
android:orientation="vertical">
<LinearLayout <LinearLayout
android:id="@+id/pairing_buttons"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" android:layout_gravity="center"
android:id="@+id/pairing_buttons" android:orientation="vertical">
android:layout_gravity="center">
<ProgressBar <ProgressBar
android:visibility="gone" android:id="@+id/pair_progress"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:id="@+id/pair_progress" /> android:visibility="gone" />
<TextView <TextView
android:id="@+id/pair_message"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="8dip" android:layout_marginBottom="8dip"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/device_not_paired" android:text="@string/device_not_paired"
android:id="@+id/pair_message" android:textAppearance="?android:attr/textAppearanceMedium" />
/>
<Button <Button
android:id="@+id/pair_button" android:id="@+id/pair_button"
android:background="@drawable/button_round"
android:textColor="@android:color/white"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@drawable/button_round"
android:text="@string/request_pairing" android:text="@string/request_pairing"
/> android:textColor="@android:color/white" />
<LinearLayout <LinearLayout
android:id="@+id/pair_request"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:visibility="gone" android:layout_gravity="center"
android:id="@+id/pair_request" android:visibility="gone">
android:layout_gravity="center">
<Button <Button
android:background="@drawable/button_round"
android:textColor="@android:color/white"
android:layout_margin="4dip"
android:id="@+id/accept_button" android:id="@+id/accept_button"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/pairing_accept" android:layout_margin="4dip"
android:layout_weight="1" android:layout_weight="1"
/> android:background="@drawable/button_round"
android:text="@string/pairing_accept"
android:textColor="@android:color/white" />
<Button <Button
android:background="@drawable/button_round"
android:textColor="@android:color/white"
android:layout_margin="4dip"
android:id="@+id/reject_button" android:id="@+id/reject_button"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="4dip"
android:layout_weight="1"
android:background="@drawable/button_round"
android:text="@string/pairing_reject" android:text="@string/pairing_reject"
android:layout_weight="1" /> android:textColor="@android:color/white" />
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
<TextView <TextView
android:id="@+id/not_reachable_message" android:id="@+id/not_reachable_message"
android:visibility="gone"
android:layout_width="match_parent" android:layout_width="match_parent"
android:drawableStart="@drawable/ic_error_outline_black_48dp" android:layout_height="match_parent"
android:drawableLeft="@drawable/ic_error_outline_black_48dp" android:drawableLeft="@drawable/ic_error_outline_black_48dp"
android:drawablePadding="8dip" android:drawablePadding="8dip"
android:layout_height="match_parent" android:drawableStart="@drawable/ic_error_outline_black_48dp"
android:gravity="center_vertical" android:gravity="center_vertical"
android:text="@string/unreachable_description" android:text="@string/unreachable_description"
android:textAppearance="?android:attr/textAppearanceMedium" android:textAppearance="?android:attr/textAppearanceMedium"
/> android:visibility="gone" />
<TextView <TextView
android:id="@+id/on_data_message" android:id="@+id/on_data_message"
android:visibility="gone"
android:layout_width="match_parent" android:layout_width="match_parent"
android:drawableStart="@drawable/ic_error_outline_black_48dp" android:layout_height="match_parent"
android:drawableLeft="@drawable/ic_error_outline_black_48dp" android:drawableLeft="@drawable/ic_error_outline_black_48dp"
android:drawablePadding="8dip" android:drawablePadding="8dip"
android:layout_height="match_parent" android:drawableStart="@drawable/ic_error_outline_black_48dp"
android:gravity="center_vertical" android:gravity="center_vertical"
android:text="@string/on_data_message" android:text="@string/on_data_message"
android:textAppearance="?android:attr/textAppearanceMedium" android:textAppearance="?android:attr/textAppearanceMedium"
/> android:visibility="gone" />
<ListView <ListView
android:id="@+id/buttons_list" android:id="@+id/buttons_list"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:fillViewport="true" android:fillViewport="true"
tools:context=".DeviceActivity" tools:context=".DeviceActivity" />
/>
</LinearLayout> </LinearLayout>

View File

@@ -2,25 +2,22 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin" android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="org.kde.kdeconnect.Plugins.FindMyPhonePlugin.FindMyPhoneActivity"> tools:context="org.kde.kdeconnect.Plugins.FindMyPhonePlugin.FindMyPhoneActivity">
<Button <Button
android:id="@+id/bFindMyPhone"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:layout_height="fill_parent"
android:text="@string/findmyphone_found"
android:textSize="50dp"
android:id="@+id/bFindMyPhone"
android:layout_alignParentBottom="true" android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true" android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" /> android:layout_alignParentStart="true"
android:text="@string/findmyphone_found"
android:textSize="50dp" />
</RelativeLayout> </RelativeLayout>

View File

@@ -1,11 +1,10 @@
<ListView xmlns:android="http://schemas.android.com/apk/res/android" <ListView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/listView1"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:addStatesFromChildren="true"
android:orientation="vertical"
android:paddingLeft="16dip" android:paddingLeft="16dip"
android:paddingRight="16dip" android:paddingRight="16dip"
tools:context="org.kde.kdeconnect.UserInterface.MaterialActivity" tools:context="org.kde.kdeconnect.UserInterface.MaterialActivity"></ListView>
android:id="@+id/listView1"
android:addStatesFromChildren="true"
android:orientation="vertical">
</ListView>

View File

@@ -1,7 +1,6 @@
<android.support.v4.widget.DrawerLayout <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout" android:id="@+id/drawer_layout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
@@ -9,37 +8,35 @@
tools:context="org.kde.kdeconnect.UserInterface.MaterialActivity"> <!-- fitSystemWindows to make the drawer slide below the Lollipop transparent status bar --> tools:context="org.kde.kdeconnect.UserInterface.MaterialActivity"> <!-- fitSystemWindows to make the drawer slide below the Lollipop transparent status bar -->
<LinearLayout <LinearLayout
android:layout_height="match_parent"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"> android:orientation="vertical">
<android.support.v7.widget.Toolbar <android.support.v7.widget.Toolbar
android:id="@+id/toolbar" android:id="@+id/toolbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="?attr/actionBarSize"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" android:background="?attr/colorPrimary"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
android:elevation="8dp" android:elevation="8dp"
android:background="?attr/colorPrimary" /> app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
<FrameLayout <FrameLayout
android:id="@+id/container" android:id="@+id/container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent"></FrameLayout>
</FrameLayout>
</LinearLayout> </LinearLayout>
<android.support.design.widget.NavigationView <android.support.design.widget.NavigationView
android:id="@+id/navigation_drawer" android:id="@+id/navigation_drawer"
android:background="@drawable/state_list_drawer_background"
app:itemBackground="@drawable/state_list_drawer_background"
app:itemTextColor="@color/state_list_drawer_text"
app:itemIconTint="@color/state_list_drawer_text"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_gravity="start" android:layout_gravity="start"
android:background="@drawable/state_list_drawer_background"
app:headerLayout="@layout/nav_header" app:headerLayout="@layout/nav_header"
/> app:itemBackground="@drawable/state_list_drawer_background"
app:itemIconTint="@color/state_list_drawer_text"
app:itemTextColor="@color/state_list_drawer_text" />
</android.support.v4.widget.DrawerLayout> </android.support.v4.widget.DrawerLayout>

View File

@@ -1,25 +1,25 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:keepScreenOn="true" android:id="@+id/mousepad_view"
android:orientation="vertical"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:id="@+id/mousepad_view"> android:keepScreenOn="true"
android:orientation="vertical">
<TextView <TextView
style="@android:style/TextAppearance.Medium"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/mousepad_info"
android:gravity="center"
style="@android:style/TextAppearance.Medium"
android:layout_centerInParent="true" android:layout_centerInParent="true"
android:padding="12dip" /> android:gravity="center"
android:padding="12dip"
android:text="@string/mousepad_info" />
<view <view
android:layout_width="wrap_content" android:id="@+id/keyListener"
android:layout_height="wrap_content"
class="org.kde.kdeconnect.Plugins.MousePadPlugin.KeyListenerView" class="org.kde.kdeconnect.Plugins.MousePadPlugin.KeyListenerView"
android:id="@+id/keyListener" /> android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout> </RelativeLayout>

View File

@@ -1,25 +1,24 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:paddingLeft="25dp"
android:paddingTop="25dp"
android:paddingRight="25dp"
android:paddingBottom="25dp"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="25dp"
android:paddingLeft="25dp"
android:paddingRight="25dp"
android:paddingTop="25dp">
<ImageView <ImageView
android:id="@+id/album_art" android:id="@+id/album_art"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_weight="4"
android:layout_marginBottom="25dp" android:layout_marginBottom="25dp"
android:layout_weight="4"
android:scaleType="fitCenter" /> android:scaleType="fitCenter" />
<include <include
layout="@layout/mpris_control"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content" />
layout="@layout/mpris_control" />
</LinearLayout> </LinearLayout>

View File

@@ -6,27 +6,26 @@
tools:context="org.kde.kdeconnect.Plugins.NotificationsPlugin.NotificationFilterActivity"> tools:context="org.kde.kdeconnect.Plugins.NotificationsPlugin.NotificationFilterActivity">
<TextView <TextView
android:text="@string/filter_apps_info" android:id="@+id/tFilter"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingBottom="5dp" android:paddingBottom="5dp"
android:id="@+id/tFilter"/> android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:text="@string/filter_apps_info" />
<ProgressBar <ProgressBar
android:layout_marginTop="64dip" android:id="@+id/spinner"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
android:id="@+id/spinner" /> android:layout_marginTop="64dip" />
<ListView <ListView
android:id="@+id/lvFilterApps"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:layout_height="fill_parent"
android:id="@+id/lvFilterApps" android:visibility="gone" />
android:visibility="gone"
/>
</LinearLayout> </LinearLayout>

View File

@@ -1,17 +1,18 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" <android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/refresh_list_layout" android:id="@+id/refresh_list_layout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<ListView android:layout_width="match_parent" <ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:addStatesFromChildren="true"
android:orientation="vertical"
android:paddingLeft="16dip" android:paddingLeft="16dip"
android:paddingRight="16dip" android:paddingRight="16dip"
tools:context=".MainActivity" tools:context=".MainActivity" />
android:id="@+id/listView1"
android:addStatesFromChildren="true"
android:orientation="vertical"/>
</android.support.v4.widget.SwipeRefreshLayout> </android.support.v4.widget.SwipeRefreshLayout>

View File

@@ -1,36 +1,35 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin" android:paddingTop="@dimen/activity_vertical_margin">
android:paddingBottom="@dimen/activity_vertical_margin"
android:orientation="vertical">
<ListView <ListView
android:id="@android:id/list"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="0dp" android:layout_height="0dp"
android:id="@android:id/list" android:layout_weight="1" />
android:layout_weight="1"
/>
<TextView <TextView
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="100dp" android:layout_height="100dp"
android:text="@string/custom_dev_list_help"/> android:text="@string/custom_dev_list_help" />
<EditText <EditText
android:layout_width="fill_parent" android:id="@+id/ip_edittext"
android:layout_height="wrap_content" android:layout_width="fill_parent"
android:imeOptions="actionSend" android:layout_height="wrap_content"
android:hint="@string/add_host_hint" android:hint="@string/add_host_hint"
android:id="@+id/ip_edittext"/> android:imeOptions="actionSend" />
<Button <Button
android:layout_width="fill_parent" android:id="@android:id/button1"
android:layout_height="wrap_content" android:layout_width="fill_parent"
android:text="@string/add_host" android:layout_height="wrap_content"
android:id="@android:id/button1"/> android:text="@string/add_host" />
</LinearLayout> </LinearLayout>

View File

@@ -1,34 +1,31 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:layout_height="wrap_content" android:orientation="vertical">
android:orientation="vertical">
<TextView xmlns:android="http://schemas.android.com/apk/res/android" <TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:drawableBottom="@drawable/text_section_header" android:id="@+id/list_item_category_text"
android:textStyle="bold" android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:textColor="?android:textColorSecondary" android:drawableBottom="@drawable/text_section_header"
android:drawablePadding="4dp" android:drawablePadding="4dp"
android:textSize="14sp"
android:textAllCaps="true"
android:paddingLeft="8dip" android:paddingLeft="8dip"
android:paddingRight="8dip" android:paddingRight="8dip"
android:layout_height="wrap_content" android:textAllCaps="true"
android:layout_width="match_parent" android:textColor="?android:textColorSecondary"
android:id="@+id/list_item_category_text" android:textSize="14sp"
/> android:textStyle="bold" />
<TextView <TextView
android:id="@+id/list_item_category_empty_placeholder"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="10dip" android:layout_margin="10dip"
android:visibility="gone"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="@string/device_list_empty" android:text="@string/device_list_empty"
android:id="@+id/list_item_category_empty_placeholder" android:textAppearance="?android:attr/textAppearanceSmall"
android:layout_gravity="center" /> android:visibility="gone" />
</LinearLayout> </LinearLayout>

View File

@@ -1,37 +1,38 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:baselineAligned="false"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingLeft="12dip"
android:paddingStart="12dip"
android:minHeight="?android:attr/listPreferredItemHeight"
android:gravity="center_vertical"
android:paddingRight="?android:attr/scrollbarSize"
android:paddingEnd="?android:attr/scrollbarSize"
android:background="@drawable/abc_list_selector_holo_dark" android:background="@drawable/abc_list_selector_holo_dark"
android:orientation="vertical"> android:baselineAligned="false"
android:gravity="center_vertical"
android:minHeight="?android:attr/listPreferredItemHeight"
android:orientation="vertical"
android:paddingEnd="?android:attr/scrollbarSize"
android:paddingLeft="12dip"
android:paddingRight="?android:attr/scrollbarSize"
android:paddingStart="12dip">
<!-- We should use android:background="@android:/listChoiceBackgroundIndicator" <!-- We should use android:background="@android:/listChoiceBackgroundIndicator"
instead of abc_list_selector_holo_dark but that's only supported from API11 --> instead of abc_list_selector_holo_dark but that's only supported from API11 -->
<TextView android:id="@+id/list_item_entry_title" <TextView
android:id="@+id/list_item_entry_title"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceLarge"
android:ellipsize="marquee" android:ellipsize="marquee"
android:fadingEdge="horizontal" android:fadingEdge="horizontal"
android:text="" /> android:singleLine="true"
android:text=""
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView android:id="@+id/list_item_entry_summary" <TextView
android:id="@+id/list_item_entry_summary"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:singleLine="true" android:singleLine="true"
android:visibility="gone" android:text=""
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="@android:color/darker_gray" android:textColor="@android:color/darker_gray"
android:text="" /> android:visibility="gone" />
</LinearLayout> </LinearLayout>

View File

@@ -1,72 +1,75 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:baselineAligned="false"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingLeft="12dip" android:baselineAligned="false"
android:paddingStart="12dip"
android:minHeight="?android:attr/listPreferredItemHeight"
android:gravity="center_vertical" android:gravity="center_vertical"
android:paddingRight="?android:attr/scrollbarSize" android:minHeight="?android:attr/listPreferredItemHeight"
android:orientation="horizontal"
android:paddingEnd="?android:attr/scrollbarSize" android:paddingEnd="?android:attr/scrollbarSize"
android:orientation="horizontal"> android:paddingLeft="12dip"
android:paddingRight="?android:attr/scrollbarSize"
android:paddingStart="12dip">
<ImageView android:id="@+id/list_item_entry_icon" <ImageView
android:layout_width="wrap_content" android:id="@+id/list_item_entry_icon"
android:layout_height="match_parent" android:layout_width="wrap_content"
android:layout_gravity="center_vertical" android:layout_height="match_parent"
android:src="@drawable/ic_device_laptop" android:layout_gravity="center_vertical"
android:layout_weight="0" /> android:layout_weight="0"
android:src="@drawable/ic_device_laptop" />
<LinearLayout <LinearLayout
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:layout_height="wrap_content"> android:orientation="vertical">
<TextView android:id="@+id/list_item_entry_title" <TextView
android:layout_width="wrap_content" android:id="@+id/list_item_entry_title"
android:layout_height="wrap_content" android:layout_width="wrap_content"
android:layout_gravity="center_vertical" android:layout_height="wrap_content"
android:layout_marginLeft="8dip" android:layout_gravity="center_vertical"
android:layout_marginStart="8dip" android:layout_marginLeft="8dip"
android:singleLine="true" android:layout_marginStart="8dip"
android:textAppearance="?android:attr/textAppearanceMedium" android:ellipsize="marquee"
android:ellipsize="marquee" android:fadingEdge="horizontal"
android:fadingEdge="horizontal" android:singleLine="true"
android:text=""/> android:text=""
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView android:id="@+id/list_item_entry_summary" <TextView
android:layout_width="wrap_content" android:id="@+id/list_item_entry_summary"
android:layout_height="wrap_content" android:layout_width="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall" android:layout_height="wrap_content"
android:singleLine="true" android:singleLine="true"
android:textColor="#CC2222" android:text=""
android:visibility="gone" android:textAppearance="?android:attr/textAppearanceSmall"
android:text="" /> android:textColor="#CC2222"
android:visibility="gone" />
</LinearLayout> </LinearLayout>
<ProgressBar <ProgressBar
android:id="@+id/progressBar"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:id="@+id/progressBar"
android:layout_weight="0" android:layout_weight="0"
android:indeterminate="true" /> android:indeterminate="true" />
<Button <Button
android:layout_width="wrap_content"
android:minWidth="128dip"
android:layout_height="wrap_content"
android:text="@string/request_pairing"
android:padding="8dip"
android:background="@drawable/button_round"
android:textColor="#FFFFFF"
android:id="@+id/entry_pair_button" android:id="@+id/entry_pair_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0" android:layout_weight="0"
android:nestedScrollingEnabled="false" /> android:background="@drawable/button_round"
android:minWidth="128dip"
android:nestedScrollingEnabled="false"
android:padding="8dip"
android:text="@string/request_pairing"
android:textColor="#FFFFFF" />
</LinearLayout> </LinearLayout>

View File

@@ -1,52 +1,54 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:baselineAligned="false"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingLeft="12dip"
android:paddingStart="12dip"
android:minHeight="?android:attr/listPreferredItemHeight"
android:gravity="center_vertical"
android:paddingRight="?android:attr/scrollbarSize"
android:paddingEnd="?android:attr/scrollbarSize"
android:clickable="true"
android:background="@drawable/abc_list_selector_holo_dark" android:background="@drawable/abc_list_selector_holo_dark"
android:orientation="horizontal"> android:baselineAligned="false"
android:clickable="true"
android:gravity="center_vertical"
android:minHeight="?android:attr/listPreferredItemHeight"
android:orientation="horizontal"
android:paddingEnd="?android:attr/scrollbarSize"
android:paddingLeft="12dip"
android:paddingRight="?android:attr/scrollbarSize"
android:paddingStart="12dip">
<ImageView android:id="@+id/list_item_entry_icon" <ImageView
android:id="@+id/list_item_entry_icon"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:src="@drawable/ic_device_laptop" android:src="@drawable/ic_device_laptop" />
/>
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:orientation="vertical" android:layout_height="wrap_content"
android:layout_height="wrap_content"> android:orientation="vertical">
<TextView android:id="@+id/list_item_entry_title" <TextView
android:id="@+id/list_item_entry_title"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:layout_marginLeft="8dip" android:layout_marginLeft="8dip"
android:layout_marginStart="8dip" android:layout_marginStart="8dip"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceMedium"
android:ellipsize="marquee" android:ellipsize="marquee"
android:fadingEdge="horizontal" android:fadingEdge="horizontal"
android:text="" /> android:singleLine="true"
android:text=""
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView android:id="@+id/list_item_entry_summary" <TextView
android:id="@+id/list_item_entry_summary"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="8dip" android:layout_marginLeft="8dip"
android:layout_marginStart="8dip" android:layout_marginStart="8dip"
android:textAppearance="?android:attr/textAppearanceSmall"
android:singleLine="true" android:singleLine="true"
android:text=""
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="#CC2222" android:textColor="#CC2222"
android:visibility="gone" android:visibility="gone" />
android:text="" />
</LinearLayout> </LinearLayout>

View File

@@ -2,164 +2,155 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical" android:id="@+id/mpris_control_view"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:id="@+id/mpris_control_view" android:layout_gravity="center"
android:gravity="center" android:gravity="center"
android:layout_gravity="center"> android:orientation="vertical">
<TextView <TextView
android:id="@+id/no_players"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium" android:layout_gravity="center_horizontal"
android:text="@string/no_players_connected" android:text="@string/no_players_connected"
android:id="@+id/no_players" android:textAppearance="?android:attr/textAppearanceMedium" />
android:layout_gravity="center_horizontal" />
<Spinner <Spinner
android:id="@+id/player_spinner"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:id="@+id/player_spinner" android:layout_gravity="center" />
android:layout_gravity="center"
/>
<TextView <TextView
android:id="@+id/now_playing_textview"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium" android:layout_gravity="center"
android:id="@+id/now_playing_textview"
android:ellipsize="marquee" android:ellipsize="marquee"
android:gravity="center"
android:marqueeRepeatLimit="marquee_forever" android:marqueeRepeatLimit="marquee_forever"
android:padding="8dip"
android:scrollHorizontally="true" android:scrollHorizontally="true"
android:singleLine="true" android:singleLine="true"
android:gravity="center" android:textAppearance="?android:attr/textAppearanceMedium" />
android:padding="8dip"
android:layout_gravity="center"
/>
<ImageButton <ImageButton
android:id="@+id/play_button"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="75dp" android:layout_height="75dp"
android:id="@+id/play_button"
android:src="@drawable/ic_play_black"
android:contentDescription="@string/mpris_play"
android:layout_gravity="center" android:layout_gravity="center"
android:layout_weight="0" android:layout_weight="0"
android:clickable="false"
android:adjustViewBounds="false" android:adjustViewBounds="false"
android:baselineAlignBottom="true" /> android:baselineAlignBottom="true"
android:clickable="false"
android:contentDescription="@string/mpris_play"
android:src="@drawable/ic_play_black" />
<LinearLayout <LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="60dip" android:layout_height="60dip"
android:layout_gravity="center" android:layout_gravity="center"
> android:orientation="horizontal">
<ImageButton <ImageButton
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:id="@+id/prev_button" android:id="@+id/prev_button"
android:src="@drawable/ic_previous_black" android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_weight="0.25"
android:contentDescription="@string/mpris_previous" android:contentDescription="@string/mpris_previous"
android:layout_weight="0.25" android:src="@drawable/ic_previous_black" />
/>
<ImageButton <ImageButton
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:id="@+id/rew_button" android:id="@+id/rew_button"
android:src="@drawable/ic_rewind_black" android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_weight="0.25"
android:contentDescription="@string/mpris_rew" android:contentDescription="@string/mpris_rew"
android:layout_weight="0.25" android:src="@drawable/ic_rewind_black" />
/>
<ImageButton <ImageButton
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:id="@+id/ff_button" android:id="@+id/ff_button"
android:src="@drawable/ic_fast_forward_black"
android:contentDescription="@string/mpris_ff"
android:layout_weight="0.25"
/>
<ImageButton
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="fill_parent" android:layout_height="fill_parent"
android:id="@+id/next_button"
android:src="@drawable/ic_next_black"
android:contentDescription="@string/mpris_next"
android:layout_weight="0.25" android:layout_weight="0.25"
/> android:contentDescription="@string/mpris_ff"
android:src="@drawable/ic_fast_forward_black" />
<ImageButton
android:id="@+id/next_button"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_weight="0.25"
android:contentDescription="@string/mpris_next"
android:src="@drawable/ic_next_black" />
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
android:orientation="horizontal" android:id="@+id/progress_slider"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:id="@+id/progress_slider"> android:orientation="horizontal">
<TextView <TextView
android:id="@+id/progress_textview"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium" android:layout_gravity="center"
android:id="@+id/progress_textview"
android:singleLine="true"
android:gravity="center" android:gravity="center"
android:padding="8dip" android:padding="8dip"
android:layout_gravity="center" android:singleLine="true"
android:text="00:00" /> android:text="00:00"
android:textAppearance="?android:attr/textAppearanceMedium" />
<SeekBar <SeekBar
android:id="@+id/positionSeek"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:id="@+id/positionSeek" android:layout_gravity="center"
android:layout_weight="1" android:layout_weight="1" />
android:layout_gravity="center" />
<TextView <TextView
android:id="@+id/time_textview"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium" android:layout_gravity="center"
android:id="@+id/time_textview"
android:singleLine="true"
android:gravity="center" android:gravity="center"
android:padding="8dip" android:padding="8dip"
android:layout_gravity="center" android:singleLine="true"
android:text="00:00" /> android:text="00:00"
android:textAppearance="?android:attr/textAppearanceMedium" />
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
android:orientation="horizontal" android:id="@+id/volume_layout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:id="@+id/volume_layout" android:layout_gravity="center"
android:layout_gravity="center" android:layout_marginTop="8dip"
android:layout_marginTop="8dip"> android:orientation="horizontal">
<ImageView <ImageView
android:id="@+id/imageView"
android:layout_width="30dip" android:layout_width="30dip"
android:layout_height="30dip" android:layout_height="30dip"
android:maxWidth="30dip"
android:layout_marginRight="10dip"
android:layout_marginEnd="10dip" android:layout_marginEnd="10dip"
android:id="@+id/imageView" android:layout_marginRight="10dip"
android:layout_weight="0" android:layout_weight="0"
android:contentDescription="@string/mpris_volume" android:contentDescription="@string/mpris_volume"
android:src="@drawable/ic_volume_black" android:maxWidth="30dip"
/> android:src="@drawable/ic_volume_black" />
<SeekBar <SeekBar
android:id="@+id/volume_seek"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:id="@+id/volume_seek"
android:layout_weight="1"
android:max="100"
android:layout_gravity="center" android:layout_gravity="center"
/> android:layout_weight="1"
android:max="100" />
</LinearLayout> </LinearLayout>

View File

@@ -3,36 +3,35 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="160dp" android:layout_height="160dp"
android:background="@drawable/drawer_header" android:background="@drawable/drawer_header"
android:orientation="vertical" android:gravity="bottom"
android:gravity="bottom"> android:orientation="vertical">
<TextView <TextView
android:id="@+id/kdeconnect_label"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="KDE Connect" android:paddingEnd="48dp"
android:textColor="#FFF"
android:textStyle="bold"
android:id="@+id/kdeconnect_label"
android:paddingLeft="16dp" android:paddingLeft="16dp"
android:paddingRight="48dp"
android:paddingStart="16dp" android:paddingStart="16dp"
android:paddingTop="8dp" android:paddingTop="8dp"
android:paddingRight="48dp" android:text="KDE Connect"
android:paddingEnd="48dp" android:textColor="#FFF"
/> android:textStyle="bold" />
<TextView <TextView
android:id="@+id/device_name"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="My device"
android:id="@+id/device_name"
android:layout_marginBottom="0dp" android:layout_marginBottom="0dp"
android:textColor="#fff"
android:paddingBottom="16dp" android:paddingBottom="16dp"
android:paddingTop="4dp"
android:paddingRight="48dp"
android:paddingEnd="48dp" android:paddingEnd="48dp"
android:paddingLeft="16dp"
android:paddingRight="48dp"
android:paddingStart="16dp" android:paddingStart="16dp"
android:paddingLeft="16dp" /> android:paddingTop="4dp"
android:text="My device"
android:textColor="#fff" />
<!-- <!--
<ImageView <ImageView

View File

@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?><!-- Copyright (C) 2006 The Android Open Source Project
<!-- Copyright (C) 2006 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
@@ -20,16 +19,17 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight" android:background="?attr/selectableItemBackground"
android:gravity="center_vertical" android:gravity="center_vertical"
android:minHeight="?android:attr/listPreferredItemHeight"
android:paddingEnd="?android:attr/scrollbarSize" android:paddingEnd="?android:attr/scrollbarSize"
android:paddingRight="?android:attr/scrollbarSize"
android:paddingStart="12dip"
android:paddingLeft="12dip" android:paddingLeft="12dip"
android:background="?attr/selectableItemBackground"> android:paddingRight="?android:attr/scrollbarSize"
android:paddingStart="12dip">
<!-- Preference will place its actual preference widget here. --> <!-- Preference will place its actual preference widget here. -->
<LinearLayout android:id="@android:id/widget_frame" <LinearLayout
android:id="@android:id/widget_frame"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:gravity="center_vertical" android:gravity="center_vertical"
@@ -38,40 +38,42 @@
<RelativeLayout <RelativeLayout
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="12dip"
android:layout_marginLeft="12dip"
android:layout_marginEnd="4dip"
android:layout_marginRight="4dip"
android:layout_marginTop="6dip"
android:layout_marginBottom="6dip" android:layout_marginBottom="6dip"
android:layout_marginEnd="4dip"
android:layout_marginLeft="12dip"
android:layout_marginRight="4dip"
android:layout_marginStart="12dip"
android:layout_marginTop="6dip"
android:layout_weight="1"> android:layout_weight="1">
<TextView android:id="@+android:id/title" <TextView
android:id="@+android:id/title"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceMedium"
android:ellipsize="marquee" android:ellipsize="marquee"
android:fadingEdge="horizontal" /> android:fadingEdge="horizontal"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView android:id="@android:id/summary" <TextView
android:id="@android:id/summary"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_below="@android:id/title"
android:layout_alignStart="@android:id/title"
android:layout_alignLeft="@android:id/title" android:layout_alignLeft="@android:id/title"
android:layout_alignStart="@android:id/title"
android:layout_below="@android:id/title"
android:maxLines="3"
android:textAppearance="?android:attr/textAppearanceSmall" android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorSecondary" android:textColor="?android:attr/textColorSecondary" />
android:maxLines="3" />
</RelativeLayout> </RelativeLayout>
<ImageButton <ImageButton
android:id="@+id/settingsButton"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:id="@+id/settingsButton"
android:padding="8dip"
android:background="@drawable/abc_btn_borderless_material" android:background="@drawable/abc_btn_borderless_material"
android:src="@drawable/ic_action_settings_inverted"/> android:padding="8dip"
android:src="@drawable/ic_action_settings_inverted" />
</LinearLayout> </LinearLayout>

View File

@@ -2,16 +2,19 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android" <menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:kdeconnect="http://schemas.android.com/apk/res-auto"> xmlns:kdeconnect="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/menu_show_keyboard" <item
android:title="@string/show_keyboard" android:id="@+id/menu_show_keyboard"
android:icon="@drawable/ic_action_keyboard" android:icon="@drawable/ic_action_keyboard"
android:title="@string/show_keyboard"
kdeconnect:showAsAction="ifRoom" /> kdeconnect:showAsAction="ifRoom" />
<item android:id="@+id/menu_right_click" <item
android:id="@+id/menu_right_click"
android:title="@string/right_click" android:title="@string/right_click"
kdeconnect:showAsAction="never" /> kdeconnect:showAsAction="never" />
<item android:id="@+id/menu_middle_click" <item
android:id="@+id/menu_middle_click"
android:title="@string/middle_click" android:title="@string/middle_click"
kdeconnect:showAsAction="never" /> kdeconnect:showAsAction="never" />

View File

@@ -5,22 +5,19 @@
android:id="@+id/menu_refresh" android:id="@+id/menu_refresh"
android:icon="@drawable/ic_action_refresh" android:icon="@drawable/ic_action_refresh"
android:orderInCategory="200" android:orderInCategory="200"
kdeconnect:showAsAction="never"
android:title="@string/refresh" android:title="@string/refresh"
/> kdeconnect:showAsAction="never" />
<item <item
android:id="@+id/menu_rename" android:id="@+id/menu_rename"
android:orderInCategory="300" android:orderInCategory="300"
android:title="@string/device_rename_title" android:title="@string/device_rename_title"
kdeconnect:showAsAction="never" kdeconnect:showAsAction="never" />
/>
<item <item
android:id="@+id/menu_custom_device_list" android:id="@+id/menu_custom_device_list"
android:orderInCategory="900" android:orderInCategory="900"
android:title="@string/custom_device_list" android:title="@string/custom_device_list"
kdeconnect:showAsAction="never" kdeconnect:showAsAction="never" />
/>
</menu> </menu>

View File

@@ -2,11 +2,10 @@
xmlns:kdeconnect="http://schemas.android.com/apk/res-auto/android"> xmlns:kdeconnect="http://schemas.android.com/apk/res-auto/android">
<item <item
android:id="@+id/menu_refresh" android:id="@+id/menu_refresh"
android:icon="@drawable/ic_action_refresh" android:icon="@drawable/ic_action_refresh"
android:orderInCategory="200" android:orderInCategory="200"
kdeconnect:showAsAction="never" android:title="@string/refresh"
android:title="@string/refresh" kdeconnect:showAsAction="never" />
/>
</menu> </menu>

View File

@@ -18,10 +18,8 @@
<item name="windowNoTitle">true</item> <item name="windowNoTitle">true</item>
</style> </style>
<style name="KdeConnectTheme" parent="KdeConnectThemeBase"> <style name="KdeConnectTheme" parent="KdeConnectThemeBase"></style>
</style>
<style name="KdeConnectTheme.NoActionBar" parent="KdeConnectThemeBase.NoActionBar"> <style name="KdeConnectTheme.NoActionBar" parent="KdeConnectThemeBase.NoActionBar"></style>
</style>
</resources> </resources>

View File

@@ -1,4 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android"> <paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="." /> <external-path
name="external_files"
path="." />
</paths> </paths>

View File

@@ -10,7 +10,7 @@
android:entryValues="@array/mousepad_tap_values" android:entryValues="@array/mousepad_tap_values"
android:key="@string/mousepad_double_tap_key" android:key="@string/mousepad_double_tap_key"
android:summary="%s" android:summary="%s"
android:title="@string/mousepad_double_tap_settings_title"/> android:title="@string/mousepad_double_tap_settings_title" />
<ListPreference <ListPreference
android:id="@+id/mousepad_triple_tap_preference" android:id="@+id/mousepad_triple_tap_preference"
@@ -19,7 +19,7 @@
android:entryValues="@array/mousepad_tap_values" android:entryValues="@array/mousepad_tap_values"
android:key="@string/mousepad_triple_tap_key" android:key="@string/mousepad_triple_tap_key"
android:summary="%s" android:summary="%s"
android:title="@string/mousepad_triple_tap_settings_title"/> android:title="@string/mousepad_triple_tap_settings_title" />
<ListPreference <ListPreference
android:id="@+id/mousepad_sensitivity_preference" android:id="@+id/mousepad_sensitivity_preference"
@@ -28,11 +28,11 @@
android:entryValues="@array/mousepad_sensitivity_values" android:entryValues="@array/mousepad_sensitivity_values"
android:key="@string/mousepad_sensitivity_key" android:key="@string/mousepad_sensitivity_key"
android:summary="%s" android:summary="%s"
android:title="@string/mousepad_sensitivity_settings_title"/> android:title="@string/mousepad_sensitivity_settings_title" />
<CheckBoxPreference <CheckBoxPreference
android:id="@+id/mousepad_scroll_preference" android:id="@+id/mousepad_scroll_preference"
android:defaultValue="false"
android:key="@string/mousepad_scroll_direction" android:key="@string/mousepad_scroll_direction"
android:title="@string/mousepad_scroll_direction_title" android:title="@string/mousepad_scroll_direction_title" />
android:defaultValue="false" />
</PreferenceScreen> </PreferenceScreen>

View File

@@ -5,18 +5,18 @@
<ListPreference <ListPreference
android:id="@+id/mpris_time_preference" android:id="@+id/mpris_time_preference"
android:key="@string/mpris_time_key" android:defaultValue="@string/mpris_time_default"
android:title="@string/mpris_time_settings_title"
android:summary="@string/mpris_time_settings_summary"
android:entries="@array/mpris_time_entries" android:entries="@array/mpris_time_entries"
android:entryValues="@array/mpris_time_entries_values" android:entryValues="@array/mpris_time_entries_values"
android:defaultValue="@string/mpris_time_default" /> android:key="@string/mpris_time_key"
android:summary="@string/mpris_time_settings_summary"
android:title="@string/mpris_time_settings_title" />
<CheckBoxPreference <CheckBoxPreference
android:id="@+id/mpris_notification_preference" android:id="@+id/mpris_notification_preference"
android:defaultValue="true"
android:key="@string/mpris_notification_key" android:key="@string/mpris_notification_key"
android:title="@string/mpris_notification_settings_title"
android:summary="@string/mpris_notification_settings_summary" android:summary="@string/mpris_notification_settings_summary"
android:defaultValue="true" /> android:title="@string/mpris_notification_settings_title" />
</PreferenceScreen> </PreferenceScreen>

View File

@@ -1,14 +1,25 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Keyboard <Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
android:keyHeight="@dimen/key_height"
android:horizontalGap="0px" android:horizontalGap="0px"
android:verticalGap="0px" > android:keyHeight="@dimen/key_height"
android:verticalGap="0px">
<Row android:rowEdgeFlags="bottom"> <Row android:rowEdgeFlags="bottom">
<Key android:keyIcon="@drawable/ic_keyboard_hide_white_36dp" android:codes="0" android:keyWidth="20%" /> <Key
<Key android:keyIcon="@drawable/ic_action_settings" android:codes="1" android:keyWidth="40%"/> android:codes="0"
<Key android:keyIcon="@drawable/ic_action_keyboard" android:codes="2" android:keyWidth="40%"/> android:keyIcon="@drawable/ic_keyboard_hide_white_36dp"
<Key android:keyIcon="@drawable/ic_phonelink_white_36dp" android:codes="3" android:keyWidth="20%" />--> android:keyWidth="20%" />
</Row> <Key
android:codes="1"
android:keyIcon="@drawable/ic_action_settings"
android:keyWidth="40%" />
<Key
android:codes="2"
android:keyIcon="@drawable/ic_action_keyboard"
android:keyWidth="40%" />
<Key
android:codes="3"
android:keyIcon="@drawable/ic_phonelink_white_36dp"
android:keyWidth="20%" />-->
</Row>
</Keyboard> </Keyboard>

View File

@@ -1,4 +1,3 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<input-method xmlns:android="http://schemas.android.com/apk/res/android" <input-method xmlns:android="http://schemas.android.com/apk/res/android"
android:supportsSwitchingToNextInputMethod="true"> android:supportsSwitchingToNextInputMethod="true"></input-method>
</input-method>

View File

@@ -5,7 +5,7 @@
<CheckBoxPreference <CheckBoxPreference
android:id="@+id/remotekeyboard_editing_only" android:id="@+id/remotekeyboard_editing_only"
android:defaultValue="true"
android:key="@string/remotekeyboard_editing_only" android:key="@string/remotekeyboard_editing_only"
android:title="@string/remotekeyboard_editing_only_title" android:title="@string/remotekeyboard_editing_only_title" />
android:defaultValue="true" />
</PreferenceScreen> </PreferenceScreen>

View File

@@ -5,11 +5,11 @@
<CheckBoxPreference <CheckBoxPreference
android:id="@+id/share_destination_customize" android:id="@+id/share_destination_customize"
android:defaultValue="false"
android:key="share_destination_custom" android:key="share_destination_custom"
android:title="@string/share_destination_customize"
android:summaryOff="@string/share_destination_customize_summary_disabled" android:summaryOff="@string/share_destination_customize_summary_disabled"
android:summaryOn="@string/share_destination_customize_summary_enabled" android:summaryOn="@string/share_destination_customize_summary_enabled"
android:defaultValue="false" /> android:title="@string/share_destination_customize" />
<Preference <Preference
android:id="@+id/share_destination_folder_preference" android:id="@+id/share_destination_folder_preference"
@@ -18,9 +18,9 @@
<CheckBoxPreference <CheckBoxPreference
android:id="@+id/share_notification_preference" android:id="@+id/share_notification_preference"
android:defaultValue="true"
android:key="share_notification_preference" android:key="share_notification_preference"
android:title="@string/share_notification_preference"
android:summary="@string/share_notification_preference_summary" android:summary="@string/share_notification_preference_summary"
android:defaultValue="true" /> android:title="@string/share_notification_preference" />
</PreferenceScreen> </PreferenceScreen>

View File

@@ -2,9 +2,8 @@
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<EditTextPreference <EditTextPreference
android:dialogMessage="@string/telephony_pref_blocked_dialog_desc"
android:key="telephony_blocked_numbers" android:key="telephony_blocked_numbers"
android:title="@string/telephony_pref_blocked_title" android:title="@string/telephony_pref_blocked_title"></EditTextPreference>
android:dialogMessage="@string/telephony_pref_blocked_dialog_desc">
</EditTextPreference>
</PreferenceScreen> </PreferenceScreen>

View File

@@ -36,7 +36,11 @@ import org.kde.kdeconnect.Device;
import org.kde.kdeconnect.Helpers.SecurityHelpers.RsaHelper; import org.kde.kdeconnect.Helpers.SecurityHelpers.RsaHelper;
import org.kde.kdeconnect.NetworkPackage; import org.kde.kdeconnect.NetworkPackage;
import java.io.*; import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.Reader;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.security.PublicKey; import java.security.PublicKey;
import java.util.UUID; import java.util.UUID;
@@ -88,7 +92,7 @@ public class BluetoothLink extends BaseLink {
if (np.getType().equals(NetworkPackage.PACKAGE_TYPE_ENCRYPTED)) { if (np.getType().equals(NetworkPackage.PACKAGE_TYPE_ENCRYPTED)) {
try { try {
np = RsaHelper.decrypt(np, privateKey); np = RsaHelper.decrypt(np, privateKey);
} catch(Exception e) { } catch (Exception e) {
Log.e("BluetoothLink/receiving", "Exception decrypting the package", e); Log.e("BluetoothLink/receiving", "Exception decrypting the package", e);
} }
} }
@@ -102,7 +106,10 @@ public class BluetoothLink extends BaseLink {
np.setPayload(transferSocket.getInputStream(), np.getPayloadSize()); np.setPayload(transferSocket.getInputStream(), np.getPayloadSize());
} catch (Exception e) { } catch (Exception e) {
if (transferSocket != null) { if (transferSocket != null) {
try { transferSocket.close(); } catch(IOException ignored) { } try {
transferSocket.close();
} catch (IOException ignored) {
}
} }
Log.e("BluetoothLink/receiving", "Unable to get payload", e); Log.e("BluetoothLink/receiving", "Unable to get payload", e);
} }
@@ -147,9 +154,9 @@ public class BluetoothLink extends BaseLink {
private void sendMessage(NetworkPackage np) throws JSONException, IOException { private void sendMessage(NetworkPackage np) throws JSONException, IOException {
byte[] message = np.serialize().getBytes(Charset.forName("UTF-8")); byte[] message = np.serialize().getBytes(Charset.forName("UTF-8"));
OutputStream socket = this.socket.getOutputStream(); OutputStream socket = this.socket.getOutputStream();
Log.i("BluetoothLink","Beginning to send message"); Log.i("BluetoothLink", "Beginning to send message");
socket.write(message); socket.write(message);
Log.i("BluetoothLink","Finished sending message"); Log.i("BluetoothLink", "Finished sending message");
} }
@Override @Override
@@ -219,7 +226,10 @@ public class BluetoothLink extends BaseLink {
callback.onFailure(e); callback.onFailure(e);
return false; return false;
} finally { } finally {
try { transferSocket.close(); } catch (IOException ignored) { } try {
transferSocket.close();
} catch (IOException ignored) {
}
} }
} }

View File

@@ -23,8 +23,8 @@ package org.kde.kdeconnect.Backends.BluetoothBackend;
import android.annotation.TargetApi; import android.annotation.TargetApi;
import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.bluetooth.BluetoothServerSocket; import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
@@ -37,11 +37,14 @@ import org.kde.kdeconnect.Backends.BaseLinkProvider;
import org.kde.kdeconnect.Device; import org.kde.kdeconnect.Device;
import org.kde.kdeconnect.NetworkPackage; import org.kde.kdeconnect.NetworkPackage;
import java.io.*; import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.Reader;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.UUID;
import java.util.Set; import java.util.Set;
import java.util.UUID;
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
public class BluetoothLinkProvider extends BaseLinkProvider { public class BluetoothLinkProvider extends BaseLinkProvider {
@@ -60,7 +63,7 @@ public class BluetoothLinkProvider extends BaseLinkProvider {
private void addLink(NetworkPackage identityPackage, BluetoothLink link) { private void addLink(NetworkPackage identityPackage, BluetoothLink link) {
String deviceId = identityPackage.getString("deviceId"); String deviceId = identityPackage.getString("deviceId");
Log.i("BluetoothLinkProvider","addLink to "+deviceId); Log.i("BluetoothLinkProvider", "addLink to " + deviceId);
BluetoothLink oldLink = visibleComputers.get(deviceId); BluetoothLink oldLink = visibleComputers.get(deviceId);
if (oldLink == link) { if (oldLink == link) {
Log.e("BluetoothLinkProvider", "oldLink == link. This should not happen!"); Log.e("BluetoothLinkProvider", "oldLink == link. This should not happen!");
@@ -70,7 +73,7 @@ public class BluetoothLinkProvider extends BaseLinkProvider {
connectionAccepted(identityPackage, link); connectionAccepted(identityPackage, link);
link.startListening(); link.startListening();
if (oldLink != null) { if (oldLink != null) {
Log.i("BluetoothLinkProvider","Removing old connection to same device"); Log.i("BluetoothLinkProvider", "Removing old connection to same device");
oldLink.disconnect(); oldLink.disconnect();
} }
} }
@@ -80,7 +83,7 @@ public class BluetoothLinkProvider extends BaseLinkProvider {
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (bluetoothAdapter == null) { if (bluetoothAdapter == null) {
Log.e("BluetoothLinkProvider","No bluetooth adapter found."); Log.e("BluetoothLinkProvider", "No bluetooth adapter found.");
} }
} }
@@ -92,7 +95,7 @@ public class BluetoothLinkProvider extends BaseLinkProvider {
if (!bluetoothAdapter.isEnabled()) { if (!bluetoothAdapter.isEnabled()) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
Log.e("BluetoothLinkProvider","Bluetooth adapter not enabled."); Log.e("BluetoothLinkProvider", "Bluetooth adapter not enabled.");
// TODO: next line needs to be called from an existing activity, so move it? // TODO: next line needs to be called from an existing activity, so move it?
// startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); // startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
// TODO: Check result of the previous command, whether the user allowed bluetooth or not. // TODO: Check result of the previous command, whether the user allowed bluetooth or not.
@@ -194,7 +197,7 @@ public class BluetoothLinkProvider extends BaseLinkProvider {
Reader reader = new InputStreamReader(socket.getInputStream(), "UTF-8"); Reader reader = new InputStreamReader(socket.getInputStream(), "UTF-8");
int charsRead; int charsRead;
char[] buf = new char[512]; char[] buf = new char[512];
while(sb.lastIndexOf("\n") == -1 && (charsRead = reader.read(buf)) != -1) { while (sb.lastIndexOf("\n") == -1 && (charsRead = reader.read(buf)) != -1) {
sb.append(buf, 0, charsRead); sb.append(buf, 0, charsRead);
} }
@@ -263,7 +266,7 @@ public class BluetoothLinkProvider extends BaseLinkProvider {
} }
@Override @Override
@TargetApi(value=Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) @TargetApi(value = Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1)
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
String action = intent.getAction(); String action = intent.getAction();
if (action.equals(BluetoothDevice.ACTION_UUID)) { if (action.equals(BluetoothDevice.ACTION_UUID)) {
@@ -278,7 +281,7 @@ public class BluetoothLinkProvider extends BaseLinkProvider {
return; return;
} }
for (Parcelable uuid: activeUuids) { for (Parcelable uuid : activeUuids) {
if (uuid.toString().equals(SERVICE_UUID.toString())) { if (uuid.toString().equals(SERVICE_UUID.toString())) {
connectToDevice(device); connectToDevice(device);
return; return;
@@ -327,8 +330,8 @@ public class BluetoothLinkProvider extends BaseLinkProvider {
try { try {
int character; int character;
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
while(sb.lastIndexOf("\n") == -1 && (character = socket.getInputStream().read()) != -1) { while (sb.lastIndexOf("\n") == -1 && (character = socket.getInputStream().read()) != -1) {
sb.append((char)character); sb.append((char) character);
} }
String message = sb.toString(); String message = sb.toString();
@@ -359,7 +362,7 @@ public class BluetoothLinkProvider extends BaseLinkProvider {
identityPackage.getString("deviceId"), BluetoothLinkProvider.this); identityPackage.getString("deviceId"), BluetoothLinkProvider.this);
NetworkPackage np2 = NetworkPackage.createIdentityPackage(context); NetworkPackage np2 = NetworkPackage.createIdentityPackage(context);
link.sendPackage(np2,new Device.SendPackageStatusCallback() { link.sendPackage(np2, new Device.SendPackageStatusCallback() {
@Override @Override
public void onSuccess() { public void onSuccess() {
addLink(identityPackage, link); addLink(identityPackage, link);

View File

@@ -21,6 +21,7 @@
package org.kde.kdeconnect.Backends.BluetoothBackend; package org.kde.kdeconnect.Backends.BluetoothBackend;
import android.util.Log; import android.util.Log;
import org.kde.kdeconnect.Backends.BasePairingHandler; import org.kde.kdeconnect.Backends.BasePairingHandler;
import org.kde.kdeconnect.Device; import org.kde.kdeconnect.Device;
import org.kde.kdeconnect.NetworkPackage; import org.kde.kdeconnect.NetworkPackage;
@@ -32,6 +33,7 @@ import java.util.TimerTask;
public class BluetoothPairingHandler extends BasePairingHandler { public class BluetoothPairingHandler extends BasePairingHandler {
Timer mPairingTimer; Timer mPairingTimer;
public BluetoothPairingHandler(Device device, final PairingHandlerCallback callback) { public BluetoothPairingHandler(Device device, final PairingHandlerCallback callback) {
super(device, callback); super(device, callback);
@@ -42,7 +44,7 @@ public class BluetoothPairingHandler extends BasePairingHandler {
} }
} }
// @Override // @Override
public NetworkPackage createPairPackage() { public NetworkPackage createPairPackage() {
NetworkPackage np = new NetworkPackage(NetworkPackage.PACKAGE_TYPE_PAIR); NetworkPackage np = new NetworkPackage(NetworkPackage.PACKAGE_TYPE_PAIR);
np.set("pair", true); np.set("pair", true);
@@ -50,7 +52,7 @@ public class BluetoothPairingHandler extends BasePairingHandler {
} }
@Override @Override
public void packageReceived(NetworkPackage np) throws Exception{ public void packageReceived(NetworkPackage np) throws Exception {
boolean wantsPair = np.getBoolean("pair"); boolean wantsPair = np.getBoolean("pair");
@@ -66,7 +68,7 @@ public class BluetoothPairingHandler extends BasePairingHandler {
if (wantsPair) { if (wantsPair) {
if (mPairStatus == PairStatus.Requested) { //We started pairing if (mPairStatus == PairStatus.Requested) { //We started pairing
hidePairingNotification(); hidePairingNotification();
pairingDone(); pairingDone();
} else { } else {
@@ -89,11 +91,11 @@ public class BluetoothPairingHandler extends BasePairingHandler {
mPairingTimer.schedule(new TimerTask() { mPairingTimer.schedule(new TimerTask() {
@Override @Override
public void run() { public void run() {
Log.w("KDE/Device","Unpairing (timeout B)"); Log.w("KDE/Device", "Unpairing (timeout B)");
mPairStatus = PairStatus.NotPaired; mPairStatus = PairStatus.NotPaired;
hidePairingNotification(); hidePairingNotification();
} }
}, 25*1000); //Time to show notification, waiting for user to accept (peer will timeout in 30 seconds) }, 25 * 1000); //Time to show notification, waiting for user to accept (peer will timeout in 30 seconds)
mPairStatus = PairStatus.RequestedByPeer; mPairStatus = PairStatus.RequestedByPeer;
mCallback.incomingRequest(); mCallback.incomingRequest();
@@ -126,10 +128,10 @@ public class BluetoothPairingHandler extends BasePairingHandler {
@Override @Override
public void run() { public void run() {
mCallback.pairingFailed(mDevice.getContext().getString(R.string.error_timed_out)); mCallback.pairingFailed(mDevice.getContext().getString(R.string.error_timed_out));
Log.w("KDE/Device","Unpairing (timeout A)"); Log.w("KDE/Device", "Unpairing (timeout A)");
mPairStatus = PairStatus.NotPaired; mPairStatus = PairStatus.NotPaired;
} }
}, 30*1000); //Time to wait for the other to accept }, 30 * 1000); //Time to wait for the other to accept
mPairStatus = PairStatus.Requested; mPairStatus = PairStatus.Requested;
} }
@@ -144,7 +146,7 @@ public class BluetoothPairingHandler extends BasePairingHandler {
public void hidePairingNotification() { public void hidePairingNotification() {
mDevice.hidePairingNotification(); mDevice.hidePairingNotification();
if (mPairingTimer != null) { if (mPairingTimer != null) {
mPairingTimer .cancel(); mPairingTimer.cancel();
} }
} }

View File

@@ -60,7 +60,7 @@ public class BackgroundService extends Service {
private final HashSet<Object> discoveryModeAcquisitions = new HashSet<>(); private final HashSet<Object> discoveryModeAcquisitions = new HashSet<>();
public static BackgroundService getInstance(){ public static BackgroundService getInstance() {
return instance; return instance;
} }
@@ -113,14 +113,17 @@ public class BackgroundService extends Service {
public void incomingRequest() { public void incomingRequest() {
onDeviceListChanged(); onDeviceListChanged();
} }
@Override @Override
public void pairingSuccessful() { public void pairingSuccessful() {
onDeviceListChanged(); onDeviceListChanged();
} }
@Override @Override
public void pairingFailed(String error) { public void pairingFailed(String error) {
onDeviceListChanged(); onDeviceListChanged();
} }
@Override @Override
public void unpaired() { public void unpaired() {
onDeviceListChanged(); onDeviceListChanged();
@@ -128,7 +131,7 @@ public class BackgroundService extends Service {
}; };
public void onDeviceListChanged() { public void onDeviceListChanged() {
for(DeviceListChangedCallback callback : deviceListChangedCallbacks.values()) { for (DeviceListChangedCallback callback : deviceListChangedCallbacks.values()) {
callback.onDeviceListChanged(); callback.onDeviceListChanged();
} }
} }
@@ -137,11 +140,11 @@ public class BackgroundService extends Service {
//Log.e("BackgroundService", "Loading remembered trusted devices"); //Log.e("BackgroundService", "Loading remembered trusted devices");
SharedPreferences preferences = getSharedPreferences("trusted_devices", Context.MODE_PRIVATE); SharedPreferences preferences = getSharedPreferences("trusted_devices", Context.MODE_PRIVATE);
Set<String> trustedDevices = preferences.getAll().keySet(); Set<String> trustedDevices = preferences.getAll().keySet();
for(String deviceId : trustedDevices) { for (String deviceId : trustedDevices) {
//Log.e("BackgroundService", "Loading device "+deviceId); //Log.e("BackgroundService", "Loading device "+deviceId);
if (preferences.getBoolean(deviceId, false)) { if (preferences.getBoolean(deviceId, false)) {
Device device = new Device(this, deviceId); Device device = new Device(this, deviceId);
devices.put(deviceId,device); devices.put(deviceId, device);
device.addPairingCallback(devicePairingCallback); device.addPairingCallback(devicePairingCallback);
} }
} }
@@ -167,7 +170,7 @@ public class BackgroundService extends Service {
new Thread(new Runnable() { new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
for(Device d : devices.values()) { for (Device d : devices.values()) {
if (!d.isPaired() && !d.isPairRequested() && !d.isPairRequestedByPeer() && !d.deviceShouldBeKeptAlive()) { if (!d.isPaired() && !d.isPairRequested() && !d.isPairRequestedByPeer() && !d.deviceShouldBeKeptAlive()) {
d.disconnect(); d.disconnect();
} }
@@ -192,8 +195,7 @@ public class BackgroundService extends Service {
device = new Device(BackgroundService.this, identityPackage, link); device = new Device(BackgroundService.this, identityPackage, link);
if (device.isPaired() || device.isPairRequested() || device.isPairRequestedByPeer() if (device.isPaired() || device.isPairRequested() || device.isPairRequestedByPeer()
|| link.linkShouldBeKeptAlive() || link.linkShouldBeKeptAlive()
||!discoveryModeAcquisitions.isEmpty() ) || !discoveryModeAcquisitions.isEmpty()) {
{
devices.put(deviceId, device); devices.put(deviceId, device);
device.addPairingCallback(devicePairingCallback); device.addPairingCallback(devicePairingCallback);
} else { } else {
@@ -247,6 +249,7 @@ public class BackgroundService extends Service {
public void addDeviceListChangedCallback(String key, DeviceListChangedCallback callback) { public void addDeviceListChangedCallback(String key, DeviceListChangedCallback callback) {
deviceListChangedCallbacks.put(key, callback); deviceListChangedCallbacks.put(key, callback);
} }
public void removeDeviceListChangedCallback(String key) { public void removeDeviceListChangedCallback(String key) {
deviceListChangedCallbacks.remove(key); deviceListChangedCallbacks.remove(key);
} }
@@ -290,7 +293,7 @@ public class BackgroundService extends Service {
} }
@Override @Override
public IBinder onBind (Intent intent) { public IBinder onBind(Intent intent) {
return new Binder(); return new Binder();
} }

View File

@@ -110,19 +110,26 @@ public class Device implements BaseLink.PackageReceiver {
if ("phone".equals(s)) return Phone; if ("phone".equals(s)) return Phone;
return Computer; //Default return Computer; //Default
} }
public String toString() { public String toString() {
switch (this) { switch (this) {
case Tablet: return "tablet"; case Tablet:
case Phone: return "phone"; return "tablet";
default: return "desktop"; case Phone:
return "phone";
default:
return "desktop";
} }
} }
} }
public interface PairingCallback { public interface PairingCallback {
void incomingRequest(); void incomingRequest();
void pairingSuccessful(); void pairingSuccessful();
void pairingFailed(String error); void pairingFailed(String error);
void unpaired(); void unpaired();
} }
@@ -147,7 +154,7 @@ public class Device implements BaseLink.PackageReceiver {
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
Log.e("KDE/Device","Exception deserializing stored public key for device"); Log.e("KDE/Device", "Exception deserializing stored public key for device");
} }
//Assume every plugin is supported until addLink is called and we can get the actual list //Assume every plugin is supported until addLink is called and we can get the actual list
@@ -176,16 +183,20 @@ public class Device implements BaseLink.PackageReceiver {
} }
public String getName() { public String getName() {
return name != null? name : context.getString(R.string.unknown_device); return name != null ? name : context.getString(R.string.unknown_device);
} }
public Drawable getIcon() public Drawable getIcon() {
{
int drawableId; int drawableId;
switch (deviceType) { switch (deviceType) {
case Phone: drawableId = R.drawable.ic_device_phone; break; case Phone:
case Tablet: drawableId = R.drawable.ic_device_tablet; break; drawableId = R.drawable.ic_device_phone;
default: drawableId = R.drawable.ic_device_laptop; break;
case Tablet:
drawableId = R.drawable.ic_device_tablet;
break;
default:
drawableId = R.drawable.ic_device_laptop;
} }
return ContextCompat.getDrawable(context, drawableId); return ContextCompat.getDrawable(context, drawableId);
} }
@@ -208,8 +219,6 @@ public class Device implements BaseLink.PackageReceiver {
} }
// //
// Pairing-related functions // Pairing-related functions
// //
@@ -221,7 +230,7 @@ public class Device implements BaseLink.PackageReceiver {
/* Asks all pairing handlers that, is pair requested? */ /* Asks all pairing handlers that, is pair requested? */
public boolean isPairRequested() { public boolean isPairRequested() {
boolean pairRequested = false; boolean pairRequested = false;
for (BasePairingHandler ph: pairingHandlers.values()) { for (BasePairingHandler ph : pairingHandlers.values()) {
pairRequested = pairRequested || ph.isPairRequested(); pairRequested = pairRequested || ph.isPairRequested();
} }
return pairRequested; return pairRequested;
@@ -248,7 +257,7 @@ public class Device implements BaseLink.PackageReceiver {
Resources res = context.getResources(); Resources res = context.getResources();
switch(pairStatus) { switch (pairStatus) {
case Paired: case Paired:
for (PairingCallback cb : pairingCallback) { for (PairingCallback cb : pairingCallback) {
cb.pairingFailed(res.getString(R.string.error_already_paired)); cb.pairingFailed(res.getString(R.string.error_already_paired));
@@ -311,7 +320,7 @@ public class Device implements BaseLink.PackageReceiver {
//Store as trusted device //Store as trusted device
SharedPreferences preferences = context.getSharedPreferences("trusted_devices", Context.MODE_PRIVATE); SharedPreferences preferences = context.getSharedPreferences("trusted_devices", Context.MODE_PRIVATE);
preferences.edit().putBoolean(deviceId,true).apply(); preferences.edit().putBoolean(deviceId, true).apply();
SharedPreferences.Editor editor = context.getSharedPreferences(deviceId, Context.MODE_PRIVATE).edit(); SharedPreferences.Editor editor = context.getSharedPreferences(deviceId, Context.MODE_PRIVATE).edit();
editor.putString("deviceName", name); editor.putString("deviceName", name);
@@ -366,7 +375,7 @@ public class Device implements BaseLink.PackageReceiver {
hidePairingNotification(); hidePairingNotification();
notificationId = (int)System.currentTimeMillis(); notificationId = (int) System.currentTimeMillis();
Intent intent = new Intent(getContext(), MaterialActivity.class); Intent intent = new Intent(getContext(), MaterialActivity.class);
intent.putExtra("deviceId", getDeviceId()); intent.putExtra("deviceId", getDeviceId());
@@ -378,12 +387,12 @@ public class Device implements BaseLink.PackageReceiver {
acceptIntent.putExtra("deviceId", getDeviceId()); acceptIntent.putExtra("deviceId", getDeviceId());
acceptIntent.putExtra("notificationId", notificationId); acceptIntent.putExtra("notificationId", notificationId);
acceptIntent.setAction("action "+System.currentTimeMillis()); acceptIntent.setAction("action " + System.currentTimeMillis());
acceptIntent.putExtra(MaterialActivity.PAIR_REQUEST_STATUS, MaterialActivity.PAIRING_ACCEPTED); acceptIntent.putExtra(MaterialActivity.PAIR_REQUEST_STATUS, MaterialActivity.PAIRING_ACCEPTED);
rejectIntent.putExtra("deviceId", getDeviceId()); rejectIntent.putExtra("deviceId", getDeviceId());
rejectIntent.putExtra("notificationId", notificationId); rejectIntent.putExtra("notificationId", notificationId);
rejectIntent.setAction("action "+System.currentTimeMillis()); rejectIntent.setAction("action " + System.currentTimeMillis());
rejectIntent.putExtra(MaterialActivity.PAIR_REQUEST_STATUS, MaterialActivity.PAIRING_REJECTED); rejectIntent.putExtra(MaterialActivity.PAIR_REQUEST_STATUS, MaterialActivity.PAIRING_REJECTED);
PendingIntent acceptedPendingIntent = PendingIntent.getActivity(getContext(), 2, acceptIntent, PendingIntent.FLAG_ONE_SHOT); PendingIntent acceptedPendingIntent = PendingIntent.getActivity(getContext(), 2, acceptIntent, PendingIntent.FLAG_ONE_SHOT);
@@ -466,7 +475,7 @@ public class Device implements BaseLink.PackageReceiver {
Log.e("KDE/Device", "Exception reading our own private key"); //Should not happen Log.e("KDE/Device", "Exception reading our own private key"); //Should not happen
} }
Log.i("KDE/Device","addLink "+link.getLinkProvider().getName()+" -> "+getName() + " active links: "+ links.size()); Log.i("KDE/Device", "addLink " + link.getLinkProvider().getName() + " -> " + getName() + " active links: " + links.size());
if (!pairingHandlers.containsKey(link.getName())) { if (!pairingHandlers.containsKey(link.getName())) {
BasePairingHandler.PairingHandlerCallback callback = new BasePairingHandler.PairingHandlerCallback() { BasePairingHandler.PairingHandlerCallback callback = new BasePairingHandler.PairingHandlerCallback() {
@@ -543,12 +552,12 @@ public class Device implements BaseLink.PackageReceiver {
Log.i("KDE/Device", "Pair package"); Log.i("KDE/Device", "Pair package");
for (BasePairingHandler ph: pairingHandlers.values()) { for (BasePairingHandler ph : pairingHandlers.values()) {
try { try {
ph.packageReceived(np); ph.packageReceived(np);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
Log.e("PairingPackageReceived","Exception"); Log.e("PairingPackageReceived", "Exception");
} }
} }
} else if (isPaired()) { } else if (isPaired()) {
@@ -600,13 +609,18 @@ public class Device implements BaseLink.PackageReceiver {
public static abstract class SendPackageStatusCallback { public static abstract class SendPackageStatusCallback {
public abstract void onSuccess(); public abstract void onSuccess();
public abstract void onFailure(Throwable e); public abstract void onFailure(Throwable e);
public void onProgressChanged(int percent) { }
public void onProgressChanged(int percent) {
}
} }
private SendPackageStatusCallback defaultCallback = new SendPackageStatusCallback() { private SendPackageStatusCallback defaultCallback = new SendPackageStatusCallback() {
@Override @Override
public void onSuccess() { } public void onSuccess() {
}
@Override @Override
public void onFailure(Throwable e) { public void onFailure(Throwable e) {
if (e != null) { if (e != null) {
@@ -651,7 +665,8 @@ public class Device implements BaseLink.PackageReceiver {
boolean success = false; boolean success = false;
//Make a copy to avoid concurrent modification exception if the original list changes //Make a copy to avoid concurrent modification exception if the original list changes
for (final BaseLink link : links) { for (final BaseLink link : links) {
if (link == null) continue; //Since we made a copy, maybe somebody destroyed the link in the meanwhile if (link == null)
continue; //Since we made a copy, maybe somebody destroyed the link in the meanwhile
if (useEncryption) { if (useEncryption) {
success = link.sendPackageEncrypted(np, callback, publicKey); success = link.sendPackageEncrypted(np, callback, publicKey);
} else { } else {
@@ -661,7 +676,7 @@ public class Device implements BaseLink.PackageReceiver {
} }
if (!success) { if (!success) {
Log.e("KDE/sendPackage", "No device link (of "+links.size()+" available) could send the package. Package "+np.getType()+" to " + name + " lost!"); Log.e("KDE/sendPackage", "No device link (of " + links.size() + " available) could send the package. Package " + np.getType() + " to " + name + " lost!");
} }
return success; return success;
@@ -672,11 +687,11 @@ public class Device implements BaseLink.PackageReceiver {
// //
public <T extends Plugin> T getPlugin(Class<T> pluginClass) { public <T extends Plugin> T getPlugin(Class<T> pluginClass) {
return (T)getPlugin(Plugin.getPluginKey(pluginClass)); return (T) getPlugin(Plugin.getPluginKey(pluginClass));
} }
public <T extends Plugin> T getPlugin(Class<T> pluginClass, boolean includeFailed) { public <T extends Plugin> T getPlugin(Class<T> pluginClass, boolean includeFailed) {
return (T)getPlugin(Plugin.getPluginKey(pluginClass), includeFailed); return (T) getPlugin(Plugin.getPluginKey(pluginClass), includeFailed);
} }
public Plugin getPlugin(String pluginKey) { public Plugin getPlugin(String pluginKey) {
@@ -713,7 +728,7 @@ public class Device implements BaseLink.PackageReceiver {
final Plugin plugin = PluginFactory.instantiatePluginForDevice(context, pluginKey, this); final Plugin plugin = PluginFactory.instantiatePluginForDevice(context, pluginKey, this);
if (plugin == null) { if (plugin == null) {
Log.e("KDE/addPlugin","could not instantiate plugin: "+pluginKey); Log.e("KDE/addPlugin", "could not instantiate plugin: " + pluginKey);
//Can't put a null //Can't put a null
//failedPlugins.put(pluginKey, null); //failedPlugins.put(pluginKey, null);
return false; return false;
@@ -743,7 +758,7 @@ public class Device implements BaseLink.PackageReceiver {
failedPlugins.put(pluginKey, plugin); failedPlugins.put(pluginKey, plugin);
} }
if(!plugin.checkRequiredPermissions()){ if (!plugin.checkRequiredPermissions()) {
Log.e("KDE/addPlugin", "No permission " + pluginKey); Log.e("KDE/addPlugin", "No permission " + pluginKey);
plugins.remove(pluginKey); plugins.remove(pluginKey);
pluginsWithoutPermissions.put(pluginKey, plugin); pluginsWithoutPermissions.put(pluginKey, plugin);
@@ -782,14 +797,14 @@ public class Device implements BaseLink.PackageReceiver {
//Log.e("removePlugin","removed " + pluginKey); //Log.e("removePlugin","removed " + pluginKey);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
Log.e("KDE/removePlugin","Exception calling onDestroy for plugin "+pluginKey); Log.e("KDE/removePlugin", "Exception calling onDestroy for plugin " + pluginKey);
} }
return true; return true;
} }
public void setPluginEnabled(String pluginKey, boolean value) { public void setPluginEnabled(String pluginKey, boolean value) {
settings.edit().putBoolean(pluginKey,value).apply(); settings.edit().putBoolean(pluginKey, value).apply();
reloadPluginsFromSettings(); reloadPluginsFromSettings();
} }
@@ -842,11 +857,11 @@ public class Device implements BaseLink.PackageReceiver {
} }
} }
public ConcurrentHashMap<String,Plugin> getLoadedPlugins() { public ConcurrentHashMap<String, Plugin> getLoadedPlugins() {
return plugins; return plugins;
} }
public ConcurrentHashMap<String,Plugin> getFailedPlugins() { public ConcurrentHashMap<String, Plugin> getFailedPlugins() {
return failedPlugins; return failedPlugins;
} }
@@ -854,7 +869,7 @@ public class Device implements BaseLink.PackageReceiver {
return pluginsWithoutPermissions; return pluginsWithoutPermissions;
} }
public ConcurrentHashMap<String,Plugin> getPluginsWithoutOptionalPermissions() { public ConcurrentHashMap<String, Plugin> getPluginsWithoutOptionalPermissions() {
return pluginsWithoutOptionalPermissions; return pluginsWithoutOptionalPermissions;
} }
@@ -867,7 +882,7 @@ public class Device implements BaseLink.PackageReceiver {
} }
public void disconnect() { public void disconnect() {
for(BaseLink link : links) { for (BaseLink link : links) {
link.disconnect(); link.disconnect();
} }
} }
@@ -880,7 +895,7 @@ public class Device implements BaseLink.PackageReceiver {
return true; //Already paired return true; //Already paired
} }
for(BaseLink l : links) { for (BaseLink l : links) {
if (l.linkShouldBeKeptAlive()) { if (l.linkShouldBeKeptAlive()) {
return true; return true;
} }
@@ -894,8 +909,9 @@ public class Device implements BaseLink.PackageReceiver {
public void hackToMakeRetrocompatiblePacketTypes(NetworkPackage np) { public void hackToMakeRetrocompatiblePacketTypes(NetworkPackage np) {
if (protocolVersion >= 6) return; if (protocolVersion >= 6) return;
np.mType = np.getType().replace(".request",""); np.mType = np.getType().replace(".request", "");
} }
public String hackToMakeRetrocompatiblePacketTypes(String type) { public String hackToMakeRetrocompatiblePacketTypes(String type) {
if (protocolVersion >= 6) return type; if (protocolVersion >= 6) return type;
return type.replace(".request", ""); return type.replace(".request", "");

View File

@@ -40,7 +40,7 @@ public class AppsHelper {
} catch (final PackageManager.NameNotFoundException e) { } catch (final PackageManager.NameNotFoundException e) {
e.printStackTrace(); e.printStackTrace();
Log.e("AppsHelper","Could not resolve name "+packageName); Log.e("AppsHelper", "Could not resolve name " + packageName);
return null; return null;
@@ -53,13 +53,13 @@ public class AppsHelper {
try { try {
PackageManager pm = context.getPackageManager(); PackageManager pm = context.getPackageManager();
ApplicationInfo ai = pm.getApplicationInfo( packageName, 0); ApplicationInfo ai = pm.getApplicationInfo(packageName, 0);
return pm.getApplicationIcon(ai); return pm.getApplicationIcon(ai);
} catch (final PackageManager.NameNotFoundException e) { } catch (final PackageManager.NameNotFoundException e) {
e.printStackTrace(); e.printStackTrace();
Log.e("AppsHelper","Could not find icon for "+packageName); Log.e("AppsHelper", "Could not find icon for " + packageName);
return null; return null;
@@ -68,5 +68,4 @@ public class AppsHelper {
} }
} }

View File

@@ -51,7 +51,7 @@ public class ContactsHelper {
try { try {
cursor = context.getContentResolver().query( cursor = context.getContentResolver().query(
uri, uri,
new String[] { new String[]{
PhoneLookup.DISPLAY_NAME, PhoneLookup.DISPLAY_NAME,
ContactsContract.PhoneLookup.PHOTO_URI ContactsContract.PhoneLookup.PHOTO_URI
/*, PhoneLookup.TYPE /*, PhoneLookup.TYPE
@@ -75,7 +75,10 @@ public class ContactsHelper {
contactInfo.put("photoID", cursor.getString(nameIndex)); contactInfo.put("photoID", cursor.getString(nameIndex));
} }
try { cursor.close(); } catch (Exception e) {} try {
cursor.close();
} catch (Exception e) {
}
if (!contactInfo.isEmpty()) { if (!contactInfo.isEmpty()) {
return contactInfo; return contactInfo;
@@ -92,7 +95,7 @@ public class ContactsHelper {
Uri photoUri = Uri.parse(photoId); Uri photoUri = Uri.parse(photoId);
InputStream input = null; InputStream input = null;
Base64OutputStream output= null; Base64OutputStream output = null;
try { try {
ByteArrayOutputStream encodedPhoto = new ByteArrayOutputStream(); ByteArrayOutputStream encodedPhoto = new ByteArrayOutputStream();
output = new Base64OutputStream(encodedPhoto, Base64.DEFAULT); output = new Base64OutputStream(encodedPhoto, Base64.DEFAULT);
@@ -107,8 +110,16 @@ public class ContactsHelper {
Log.e("ContactsHelper", ex.toString()); Log.e("ContactsHelper", ex.toString());
return ""; return "";
} finally { } finally {
try { input.close(); } catch(Exception ignored) { }; try {
try { output.close(); } catch(Exception ignored) { }; input.close();
} catch (Exception ignored) {
}
;
try {
output.close();
} catch (Exception ignored) {
}
;
} }
} }
} }

View File

@@ -38,412 +38,413 @@ public class DeviceHelper {
//from https://github.com/meetup/android-device-names //from https://github.com/meetup/android-device-names
//Converted to java using: //Converted to java using:
//cat android_models.properties | awk -F'=' '{sub(/ *$/, "", $1)} sub(/^ */, "", $2) { if ($2 != "") print "humanReadableNames.put(\""$1"\",\"" $2 "\");"}' | sed -e 's/\\ /_/g' //cat android_models.properties | awk -F'=' '{sub(/ *$/, "", $1)} sub(/^ */, "", $2) { if ($2 != "") print "humanReadableNames.put(\""$1"\",\"" $2 "\");"}' | sed -e 's/\\ /_/g'
private final static HashMap<String,String> humanReadableNames = new HashMap<>(); private final static HashMap<String, String> humanReadableNames = new HashMap<>();
static { static {
humanReadableNames.put("5860E","Coolpad Quattro 4G"); humanReadableNames.put("5860E", "Coolpad Quattro 4G");
humanReadableNames.put("831C","HTC One M8"); humanReadableNames.put("831C", "HTC One M8");
humanReadableNames.put("9920","Star Alps S9920"); humanReadableNames.put("9920", "Star Alps S9920");
humanReadableNames.put("A0001","OnePlus One"); humanReadableNames.put("A0001", "OnePlus One");
humanReadableNames.put("A1-810","Acer Iconia A1-810"); humanReadableNames.put("A1-810", "Acer Iconia A1-810");
humanReadableNames.put("ADR6300","HTC Droid Incredible"); humanReadableNames.put("ADR6300", "HTC Droid Incredible");
humanReadableNames.put("ADR6330VW","HTC Rhyme"); humanReadableNames.put("ADR6330VW", "HTC Rhyme");
humanReadableNames.put("ADR6350","HTC Droid Incredible 2"); humanReadableNames.put("ADR6350", "HTC Droid Incredible 2");
humanReadableNames.put("ADR6400L","HTC Thunderbolt"); humanReadableNames.put("ADR6400L", "HTC Thunderbolt");
humanReadableNames.put("ADR6410LVW","HTC Droid Incredible 4G"); humanReadableNames.put("ADR6410LVW", "HTC Droid Incredible 4G");
humanReadableNames.put("ADR6425LVW","HTC Rezound 4G"); humanReadableNames.put("ADR6425LVW", "HTC Rezound 4G");
humanReadableNames.put("ALCATEL_ONE_TOUCH_5035X","Alcatel One Touch X Pop"); humanReadableNames.put("ALCATEL_ONE_TOUCH_5035X", "Alcatel One Touch X Pop");
humanReadableNames.put("ALCATEL_ONE_TOUCH_7041X","Alcatel One Touch Pop C7"); humanReadableNames.put("ALCATEL_ONE_TOUCH_7041X", "Alcatel One Touch Pop C7");
humanReadableNames.put("ASUS_T00J","Asus ZenFone 5"); humanReadableNames.put("ASUS_T00J", "Asus ZenFone 5");
humanReadableNames.put("ASUS_Transformer_Pad_TF300T","Asus Transformer Pad"); humanReadableNames.put("ASUS_Transformer_Pad_TF300T", "Asus Transformer Pad");
humanReadableNames.put("ASUS_Transformer_Pad_TF700T","Asus Transformer Pad"); humanReadableNames.put("ASUS_Transformer_Pad_TF700T", "Asus Transformer Pad");
humanReadableNames.put("Aquaris_E4.5","bq Aquaris E4.5"); humanReadableNames.put("Aquaris_E4.5", "bq Aquaris E4.5");
humanReadableNames.put("C1905","Sony Xperia M"); humanReadableNames.put("C1905", "Sony Xperia M");
humanReadableNames.put("C2105","Sony Xperia L"); humanReadableNames.put("C2105", "Sony Xperia L");
humanReadableNames.put("C5155","Kyocera Rise"); humanReadableNames.put("C5155", "Kyocera Rise");
humanReadableNames.put("C5170","Kyocera Hydro"); humanReadableNames.put("C5170", "Kyocera Hydro");
humanReadableNames.put("C5302","Xperia SP"); humanReadableNames.put("C5302", "Xperia SP");
humanReadableNames.put("C5303","Sony Xperia SP"); humanReadableNames.put("C5303", "Sony Xperia SP");
humanReadableNames.put("C5306","Xperia SP"); humanReadableNames.put("C5306", "Xperia SP");
humanReadableNames.put("C6603","Sony Xperia Z"); humanReadableNames.put("C6603", "Sony Xperia Z");
humanReadableNames.put("C6606","Sony Xperia Z"); humanReadableNames.put("C6606", "Sony Xperia Z");
humanReadableNames.put("C6833","Sony Xperia Z Ultra"); humanReadableNames.put("C6833", "Sony Xperia Z Ultra");
humanReadableNames.put("C6903","Sony Xperia Z1"); humanReadableNames.put("C6903", "Sony Xperia Z1");
humanReadableNames.put("C6916","Sony Xperia Z1S"); humanReadableNames.put("C6916", "Sony Xperia Z1S");
humanReadableNames.put("CM990","Huawei Evolution III"); humanReadableNames.put("CM990", "Huawei Evolution III");
humanReadableNames.put("CUBOT_ONE","Cubot One"); humanReadableNames.put("CUBOT_ONE", "Cubot One");
humanReadableNames.put("D2005","Sony Xperia E1"); humanReadableNames.put("D2005", "Sony Xperia E1");
humanReadableNames.put("D2302","Xperia M2"); humanReadableNames.put("D2302", "Xperia M2");
humanReadableNames.put("D2303","Sony Xperia M2"); humanReadableNames.put("D2303", "Sony Xperia M2");
humanReadableNames.put("D2305","Xperia M2"); humanReadableNames.put("D2305", "Xperia M2");
humanReadableNames.put("D2306","Xperia M2"); humanReadableNames.put("D2306", "Xperia M2");
humanReadableNames.put("D2316","Xperia M2"); humanReadableNames.put("D2316", "Xperia M2");
humanReadableNames.put("D5503","Sony Xperia Z1"); humanReadableNames.put("D5503", "Sony Xperia Z1");
humanReadableNames.put("D5803","Sony Xperia Z3 Compact"); humanReadableNames.put("D5803", "Sony Xperia Z3 Compact");
humanReadableNames.put("D5833","Xperia Z3 Compact"); humanReadableNames.put("D5833", "Xperia Z3 Compact");
humanReadableNames.put("D6503","Sony Xperia Z2"); humanReadableNames.put("D6503", "Sony Xperia Z2");
humanReadableNames.put("D6603","Sony Xperia Z3"); humanReadableNames.put("D6603", "Sony Xperia Z3");
humanReadableNames.put("D6653","Sony Xperia Z3"); humanReadableNames.put("D6653", "Sony Xperia Z3");
humanReadableNames.put("DROID2","Motorola Droid 2"); humanReadableNames.put("DROID2", "Motorola Droid 2");
humanReadableNames.put("DROID2_GLOBAL","Motorola Droid 2 Global"); humanReadableNames.put("DROID2_GLOBAL", "Motorola Droid 2 Global");
humanReadableNames.put("DROID3","Motorola Droid 3"); humanReadableNames.put("DROID3", "Motorola Droid 3");
humanReadableNames.put("DROID4","Motorola Droid 4"); humanReadableNames.put("DROID4", "Motorola Droid 4");
humanReadableNames.put("DROIDX","Motorola Droid X"); humanReadableNames.put("DROIDX", "Motorola Droid X");
humanReadableNames.put("DROID_BIONIC","Motorola Droid Bionic"); humanReadableNames.put("DROID_BIONIC", "Motorola Droid Bionic");
humanReadableNames.put("DROID_Pro","Motorola Droid Pro"); humanReadableNames.put("DROID_Pro", "Motorola Droid Pro");
humanReadableNames.put("DROID_RAZR","Motorola Droid Razr"); humanReadableNames.put("DROID_RAZR", "Motorola Droid Razr");
humanReadableNames.put("DROID_RAZR_HD","Motorola Droid Razr HD"); humanReadableNames.put("DROID_RAZR_HD", "Motorola Droid Razr HD");
humanReadableNames.put("DROID_X2","Motorola Droid X2"); humanReadableNames.put("DROID_X2", "Motorola Droid X2");
humanReadableNames.put("Desire_HD","HTC Desire HD"); humanReadableNames.put("Desire_HD", "HTC Desire HD");
humanReadableNames.put("Droid","Motorola Droid"); humanReadableNames.put("Droid", "Motorola Droid");
humanReadableNames.put("EVO","HTC Evo"); humanReadableNames.put("EVO", "HTC Evo");
humanReadableNames.put("GT-I8160","Samsung Galaxy Ace 2"); humanReadableNames.put("GT-I8160", "Samsung Galaxy Ace 2");
humanReadableNames.put("GT-I8190","Samsung Galaxy S III Mini"); humanReadableNames.put("GT-I8190", "Samsung Galaxy S III Mini");
humanReadableNames.put("GT-I8190L","Samsung Galaxy S3 Mini"); humanReadableNames.put("GT-I8190L", "Samsung Galaxy S3 Mini");
humanReadableNames.put("GT-I8190N","Samsung Galaxy S III Mini"); humanReadableNames.put("GT-I8190N", "Samsung Galaxy S III Mini");
humanReadableNames.put("GT-I8260","Samsung Galaxy Core"); humanReadableNames.put("GT-I8260", "Samsung Galaxy Core");
humanReadableNames.put("GT-I8262","Samsung Galaxy Core"); humanReadableNames.put("GT-I8262", "Samsung Galaxy Core");
humanReadableNames.put("GT-I8550L","Samsung Galaxy Win"); humanReadableNames.put("GT-I8550L", "Samsung Galaxy Win");
humanReadableNames.put("GT-I9000","Samsung Galaxy S"); humanReadableNames.put("GT-I9000", "Samsung Galaxy S");
humanReadableNames.put("GT-I9001","Samsung Galaxy S Plus"); humanReadableNames.put("GT-I9001", "Samsung Galaxy S Plus");
humanReadableNames.put("GT-I9060","Samsung Galaxy Grand Neo"); humanReadableNames.put("GT-I9060", "Samsung Galaxy Grand Neo");
humanReadableNames.put("GT-I9063T","Samsung Galaxy Grand Neo Duos"); humanReadableNames.put("GT-I9063T", "Samsung Galaxy Grand Neo Duos");
humanReadableNames.put("GT-I9070","Samsung Galaxy S Advance"); humanReadableNames.put("GT-I9070", "Samsung Galaxy S Advance");
humanReadableNames.put("GT-I9082","Samsung Galaxy Grand"); humanReadableNames.put("GT-I9082", "Samsung Galaxy Grand");
humanReadableNames.put("GT-I9100","Samsung Galaxy S II"); humanReadableNames.put("GT-I9100", "Samsung Galaxy S II");
humanReadableNames.put("GT-I9100M","Samsung Galaxy S II"); humanReadableNames.put("GT-I9100M", "Samsung Galaxy S II");
humanReadableNames.put("GT-I9100P","Samsung Galaxy S II"); humanReadableNames.put("GT-I9100P", "Samsung Galaxy S II");
humanReadableNames.put("GT-I9100T","Samsung Galaxy S II"); humanReadableNames.put("GT-I9100T", "Samsung Galaxy S II");
humanReadableNames.put("GT-I9105P","Samsung Galaxy S2 Plus"); humanReadableNames.put("GT-I9105P", "Samsung Galaxy S2 Plus");
humanReadableNames.put("GT-I9190","Samsung Galaxy S4 Mini"); humanReadableNames.put("GT-I9190", "Samsung Galaxy S4 Mini");
humanReadableNames.put("GT-I9192","Samsung Galaxy S4 Mini Duos"); humanReadableNames.put("GT-I9192", "Samsung Galaxy S4 Mini Duos");
humanReadableNames.put("GT-I9195","Samsung Galaxy S4 Mini"); humanReadableNames.put("GT-I9195", "Samsung Galaxy S4 Mini");
humanReadableNames.put("GT-I9197","Galaxy S4 Mini"); humanReadableNames.put("GT-I9197", "Galaxy S4 Mini");
humanReadableNames.put("GT-I9198","Galaxy S4 Mini"); humanReadableNames.put("GT-I9198", "Galaxy S4 Mini");
humanReadableNames.put("GT-I9210","Galaxy S2"); humanReadableNames.put("GT-I9210", "Galaxy S2");
humanReadableNames.put("GT-I9295","Samsung Galaxy S4 Active"); humanReadableNames.put("GT-I9295", "Samsung Galaxy S4 Active");
humanReadableNames.put("GT-I9300","Samsung Galaxy S III"); humanReadableNames.put("GT-I9300", "Samsung Galaxy S III");
humanReadableNames.put("GT-I9300T","Samsung Galaxy S III"); humanReadableNames.put("GT-I9300T", "Samsung Galaxy S III");
humanReadableNames.put("GT-I9305","Samsung Galaxy S III"); humanReadableNames.put("GT-I9305", "Samsung Galaxy S III");
humanReadableNames.put("GT-I9305T","Samsung Galaxy S III"); humanReadableNames.put("GT-I9305T", "Samsung Galaxy S III");
humanReadableNames.put("GT-I9500","Samsung Galaxy S4"); humanReadableNames.put("GT-I9500", "Samsung Galaxy S4");
humanReadableNames.put("GT-I9505","Samsung Galaxy S4"); humanReadableNames.put("GT-I9505", "Samsung Galaxy S4");
humanReadableNames.put("GT-I9506","Samsung Galaxy S4"); humanReadableNames.put("GT-I9506", "Samsung Galaxy S4");
humanReadableNames.put("GT-I9507","Samsung Galaxy S4"); humanReadableNames.put("GT-I9507", "Samsung Galaxy S4");
humanReadableNames.put("GT-N5110","Samsung Galaxy Note 8.0"); humanReadableNames.put("GT-N5110", "Samsung Galaxy Note 8.0");
humanReadableNames.put("GT-N7000","Samsung Galaxy Note"); humanReadableNames.put("GT-N7000", "Samsung Galaxy Note");
humanReadableNames.put("GT-N7100","Samsung Galaxy Note II"); humanReadableNames.put("GT-N7100", "Samsung Galaxy Note II");
humanReadableNames.put("GT-N7105","Samsung Galaxy Note II"); humanReadableNames.put("GT-N7105", "Samsung Galaxy Note II");
humanReadableNames.put("GT-N7105T","Samsung Galaxy Note II"); humanReadableNames.put("GT-N7105T", "Samsung Galaxy Note II");
humanReadableNames.put("GT-N8000","Samsung Galaxy Note 10.1"); humanReadableNames.put("GT-N8000", "Samsung Galaxy Note 10.1");
humanReadableNames.put("GT-N8010","Samsung Galaxy Note 10.1"); humanReadableNames.put("GT-N8010", "Samsung Galaxy Note 10.1");
humanReadableNames.put("GT-N8013","Samsung Galaxy Note 10.1"); humanReadableNames.put("GT-N8013", "Samsung Galaxy Note 10.1");
humanReadableNames.put("GT-P3100","Samsung Galaxy Tab 2"); humanReadableNames.put("GT-P3100", "Samsung Galaxy Tab 2");
humanReadableNames.put("GT-P3110","Samsung Galaxy Tab 2"); humanReadableNames.put("GT-P3110", "Samsung Galaxy Tab 2");
humanReadableNames.put("GT-P3113","Samsung Galaxy Tab 2 7.0"); humanReadableNames.put("GT-P3113", "Samsung Galaxy Tab 2 7.0");
humanReadableNames.put("GT-P5110","Samsung Galaxy Tab 2"); humanReadableNames.put("GT-P5110", "Samsung Galaxy Tab 2");
humanReadableNames.put("GT-P5113","Samsnung Galaxy Tab 2 10.1"); humanReadableNames.put("GT-P5113", "Samsnung Galaxy Tab 2 10.1");
humanReadableNames.put("GT-P5210","Samsung Galaxy Tab 3 10.1"); humanReadableNames.put("GT-P5210", "Samsung Galaxy Tab 3 10.1");
humanReadableNames.put("GT-P7510","Samsung Galaxy Tab 10.1"); humanReadableNames.put("GT-P7510", "Samsung Galaxy Tab 10.1");
humanReadableNames.put("GT-S5301L","Samsung Galaxy Pocket Plus"); humanReadableNames.put("GT-S5301L", "Samsung Galaxy Pocket Plus");
humanReadableNames.put("GT-S5360","Samsung Galaxy Y"); humanReadableNames.put("GT-S5360", "Samsung Galaxy Y");
humanReadableNames.put("GT-S5570","Samsung Galaxy Mini"); humanReadableNames.put("GT-S5570", "Samsung Galaxy Mini");
humanReadableNames.put("GT-S5830","Samsung Galaxy Ace"); humanReadableNames.put("GT-S5830", "Samsung Galaxy Ace");
humanReadableNames.put("GT-S5830i","Samsung Galaxy Ace"); humanReadableNames.put("GT-S5830i", "Samsung Galaxy Ace");
humanReadableNames.put("GT-S6310","Samsung Galaxy Young"); humanReadableNames.put("GT-S6310", "Samsung Galaxy Young");
humanReadableNames.put("GT-S6310N","Samsung Galaxy Young"); humanReadableNames.put("GT-S6310N", "Samsung Galaxy Young");
humanReadableNames.put("GT-S6810P","Samsung Galaxy Fame"); humanReadableNames.put("GT-S6810P", "Samsung Galaxy Fame");
humanReadableNames.put("GT-S7560M","Samsung Galaxy Ace II X"); humanReadableNames.put("GT-S7560M", "Samsung Galaxy Ace II X");
humanReadableNames.put("GT-S7562","Samsung Galaxy S Duos"); humanReadableNames.put("GT-S7562", "Samsung Galaxy S Duos");
humanReadableNames.put("GT-S7580","Samsung Galaxy Trend Plus"); humanReadableNames.put("GT-S7580", "Samsung Galaxy Trend Plus");
humanReadableNames.put("Galaxy_Nexus","Samsung Galaxy Nexus"); humanReadableNames.put("Galaxy_Nexus", "Samsung Galaxy Nexus");
humanReadableNames.put("HM_1SW","Xiaomi Redmi"); humanReadableNames.put("HM_1SW", "Xiaomi Redmi");
humanReadableNames.put("HTC6435LVW","HTC Droid DNA"); humanReadableNames.put("HTC6435LVW", "HTC Droid DNA");
humanReadableNames.put("HTC6500LVW","HTC One"); humanReadableNames.put("HTC6500LVW", "HTC One");
humanReadableNames.put("HTC6525LVW","HTC One M8"); humanReadableNames.put("HTC6525LVW", "HTC One M8");
humanReadableNames.put("HTCEVODesign4G","HTC Evo Design 4G"); humanReadableNames.put("HTCEVODesign4G", "HTC Evo Design 4G");
humanReadableNames.put("HTCEVOV4G","HTC Evo V 4G"); humanReadableNames.put("HTCEVOV4G", "HTC Evo V 4G");
humanReadableNames.put("HTCONE","HTC One"); humanReadableNames.put("HTCONE", "HTC One");
humanReadableNames.put("HTC_Desire_500","HTC Desire 500"); humanReadableNames.put("HTC_Desire_500", "HTC Desire 500");
humanReadableNames.put("HTC_Desire_HD_A9191","HTC Desire HD"); humanReadableNames.put("HTC_Desire_HD_A9191", "HTC Desire HD");
humanReadableNames.put("HTC_One_mini","HTC One mini"); humanReadableNames.put("HTC_One_mini", "HTC One mini");
humanReadableNames.put("HTC_PH39100","HTC Vivid 4G"); humanReadableNames.put("HTC_PH39100", "HTC Vivid 4G");
humanReadableNames.put("HTC_PN071","HTC One"); humanReadableNames.put("HTC_PN071", "HTC One");
humanReadableNames.put("HTC_Sensation_Z710e","HTC Sensation"); humanReadableNames.put("HTC_Sensation_Z710e", "HTC Sensation");
humanReadableNames.put("HTC_Sensation_4G","HTC Sensation"); humanReadableNames.put("HTC_Sensation_4G", "HTC Sensation");
humanReadableNames.put("HTC_VLE_U","HTC One S"); humanReadableNames.put("HTC_VLE_U", "HTC One S");
humanReadableNames.put("HUAWEI_G510-0251","Huawei Ascend G510"); humanReadableNames.put("HUAWEI_G510-0251", "Huawei Ascend G510");
humanReadableNames.put("HUAWEI_P6-U06","Huawei Ascend P6"); humanReadableNames.put("HUAWEI_P6-U06", "Huawei Ascend P6");
humanReadableNames.put("HUAWEI_Y300-0100","Huawei Ascend Y300"); humanReadableNames.put("HUAWEI_Y300-0100", "Huawei Ascend Y300");
humanReadableNames.put("ISW11SC","Galaxy S2"); humanReadableNames.put("ISW11SC", "Galaxy S2");
humanReadableNames.put("KFJWA","Kindle Fire HD 8.9"); humanReadableNames.put("KFJWA", "Kindle Fire HD 8.9");
humanReadableNames.put("KFJWI","Kindle Fire HD 8.9"); humanReadableNames.put("KFJWI", "Kindle Fire HD 8.9");
humanReadableNames.put("KFOT","Kindle Fire"); humanReadableNames.put("KFOT", "Kindle Fire");
humanReadableNames.put("KFTT","Kindle Fire HD 7"); humanReadableNames.put("KFTT", "Kindle Fire HD 7");
humanReadableNames.put("L-01F","G2"); humanReadableNames.put("L-01F", "G2");
humanReadableNames.put("LG-C800","LG myTouch Q"); humanReadableNames.put("LG-C800", "LG myTouch Q");
humanReadableNames.put("LG-D415","LG Optimus L90"); humanReadableNames.put("LG-D415", "LG Optimus L90");
humanReadableNames.put("LG-D620","LG G2 Mini"); humanReadableNames.put("LG-D620", "LG G2 Mini");
humanReadableNames.put("LG-D686","LG G Pro Lite Dual"); humanReadableNames.put("LG-D686", "LG G Pro Lite Dual");
humanReadableNames.put("LG-D800","LG G2"); humanReadableNames.put("LG-D800", "LG G2");
humanReadableNames.put("LG-D801","LG G2"); humanReadableNames.put("LG-D801", "LG G2");
humanReadableNames.put("LG-D802","LG G2"); humanReadableNames.put("LG-D802", "LG G2");
humanReadableNames.put("LG-D803","G2"); humanReadableNames.put("LG-D803", "G2");
humanReadableNames.put("LG-D805","G2"); humanReadableNames.put("LG-D805", "G2");
humanReadableNames.put("LG-D850","LG G3"); humanReadableNames.put("LG-D850", "LG G3");
humanReadableNames.put("LG-D851","LG G3"); humanReadableNames.put("LG-D851", "LG G3");
humanReadableNames.put("LG-D852","G3"); humanReadableNames.put("LG-D852", "G3");
humanReadableNames.put("LG-D855","LG G3"); humanReadableNames.put("LG-D855", "LG G3");
humanReadableNames.put("LG-E411g","LG Optimus L1 II"); humanReadableNames.put("LG-E411g", "LG Optimus L1 II");
humanReadableNames.put("LG-E425g","LG Optimus L3 II"); humanReadableNames.put("LG-E425g", "LG Optimus L3 II");
humanReadableNames.put("LG-E440g","LG Optimus L4 II"); humanReadableNames.put("LG-E440g", "LG Optimus L4 II");
humanReadableNames.put("LG-E460","LG Optimus L5 II"); humanReadableNames.put("LG-E460", "LG Optimus L5 II");
humanReadableNames.put("LG-E610","LG Optimus L5"); humanReadableNames.put("LG-E610", "LG Optimus L5");
humanReadableNames.put("LG-E612g","LG Optimus L5 Dual"); humanReadableNames.put("LG-E612g", "LG Optimus L5 Dual");
humanReadableNames.put("LG-E739","LG MyTouch e739"); humanReadableNames.put("LG-E739", "LG MyTouch e739");
humanReadableNames.put("LG-E970","LG Optimus G"); humanReadableNames.put("LG-E970", "LG Optimus G");
humanReadableNames.put("LG-E971","Optimus G"); humanReadableNames.put("LG-E971", "Optimus G");
humanReadableNames.put("LG-E980","LG Optimus G Pro"); humanReadableNames.put("LG-E980", "LG Optimus G Pro");
humanReadableNames.put("LG-H815","G4"); humanReadableNames.put("LG-H815", "G4");
humanReadableNames.put("LG-LG730","LG Venice"); humanReadableNames.put("LG-LG730", "LG Venice");
humanReadableNames.put("LG-LS720","LG Optimus F3"); humanReadableNames.put("LG-LS720", "LG Optimus F3");
humanReadableNames.put("LG-LS840","LG Viper"); humanReadableNames.put("LG-LS840", "LG Viper");
humanReadableNames.put("LG-LS970","LG Optimus G"); humanReadableNames.put("LG-LS970", "LG Optimus G");
humanReadableNames.put("LG-LS980","LG G2"); humanReadableNames.put("LG-LS980", "LG G2");
humanReadableNames.put("LG-MS770","LG Motion 4G"); humanReadableNames.put("LG-MS770", "LG Motion 4G");
humanReadableNames.put("LG-MS910","LG Esteem"); humanReadableNames.put("LG-MS910", "LG Esteem");
humanReadableNames.put("LG-P509","LG Optimus T"); humanReadableNames.put("LG-P509", "LG Optimus T");
humanReadableNames.put("LG-P760","LG Optimus L9"); humanReadableNames.put("LG-P760", "LG Optimus L9");
humanReadableNames.put("LG-P768","LG Optimus L9"); humanReadableNames.put("LG-P768", "LG Optimus L9");
humanReadableNames.put("LG-P769","LG Optimus L9"); humanReadableNames.put("LG-P769", "LG Optimus L9");
humanReadableNames.put("LG-P999","LG G2X P999"); humanReadableNames.put("LG-P999", "LG G2X P999");
humanReadableNames.put("LG-VM696","LG Optimus Elite"); humanReadableNames.put("LG-VM696", "LG Optimus Elite");
humanReadableNames.put("LGL34C","LG Optimus Fuel"); humanReadableNames.put("LGL34C", "LG Optimus Fuel");
humanReadableNames.put("LGL55C","LG LGL55C"); humanReadableNames.put("LGL55C", "LG LGL55C");
humanReadableNames.put("LGLS740","LG Volt"); humanReadableNames.put("LGLS740", "LG Volt");
humanReadableNames.put("LGLS990","LG G3"); humanReadableNames.put("LGLS990", "LG G3");
humanReadableNames.put("LGMS323","LG Optimus L70"); humanReadableNames.put("LGMS323", "LG Optimus L70");
humanReadableNames.put("LGMS500","LG Optimus F6"); humanReadableNames.put("LGMS500", "LG Optimus F6");
humanReadableNames.put("LGMS769","LG Optimus L9"); humanReadableNames.put("LGMS769", "LG Optimus L9");
humanReadableNames.put("LS670","LG Optimus S"); humanReadableNames.put("LS670", "LG Optimus S");
humanReadableNames.put("LT22i","Sony Xperia P"); humanReadableNames.put("LT22i", "Sony Xperia P");
humanReadableNames.put("LT25i","Sony Xperia V"); humanReadableNames.put("LT25i", "Sony Xperia V");
humanReadableNames.put("LT26i","Sony Xperia S"); humanReadableNames.put("LT26i", "Sony Xperia S");
humanReadableNames.put("LT30p","Sony Xperia T"); humanReadableNames.put("LT30p", "Sony Xperia T");
humanReadableNames.put("MB855","Motorola Photon 4G"); humanReadableNames.put("MB855", "Motorola Photon 4G");
humanReadableNames.put("MB860","Motorola Atrix 4G"); humanReadableNames.put("MB860", "Motorola Atrix 4G");
humanReadableNames.put("MB865","Motorola Atrix 2"); humanReadableNames.put("MB865", "Motorola Atrix 2");
humanReadableNames.put("MB886","Motorola Atrix HD"); humanReadableNames.put("MB886", "Motorola Atrix HD");
humanReadableNames.put("ME173X","Asus MeMO Pad HD 7"); humanReadableNames.put("ME173X", "Asus MeMO Pad HD 7");
humanReadableNames.put("MI_3W","Xiaomi Mi 3"); humanReadableNames.put("MI_3W", "Xiaomi Mi 3");
humanReadableNames.put("MOTWX435KT","Motorola Triumph"); humanReadableNames.put("MOTWX435KT", "Motorola Triumph");
humanReadableNames.put("N3","Star NO.1 N3"); humanReadableNames.put("N3", "Star NO.1 N3");
humanReadableNames.put("N860","ZTE Warp N860"); humanReadableNames.put("N860", "ZTE Warp N860");
humanReadableNames.put("NEXUS_4","Nexus 4"); humanReadableNames.put("NEXUS_4", "Nexus 4");
humanReadableNames.put("NEXUS_5","Nexus 5"); humanReadableNames.put("NEXUS_5", "Nexus 5");
humanReadableNames.put("NEXUS_5X","Nexus 5X"); humanReadableNames.put("NEXUS_5X", "Nexus 5X");
humanReadableNames.put("LG-D820","Nexus 5"); humanReadableNames.put("LG-D820", "Nexus 5");
humanReadableNames.put("LG-D821","Nexus 5"); humanReadableNames.put("LG-D821", "Nexus 5");
humanReadableNames.put("NEXUS_6","Nexus 6"); humanReadableNames.put("NEXUS_6", "Nexus 6");
humanReadableNames.put("NEXUS_6P","Nexus 6P"); humanReadableNames.put("NEXUS_6P", "Nexus 6P");
humanReadableNames.put("Nexus_10","Google Nexus 10"); humanReadableNames.put("Nexus_10", "Google Nexus 10");
humanReadableNames.put("Nexus_4","Google Nexus 4"); humanReadableNames.put("Nexus_4", "Google Nexus 4");
humanReadableNames.put("Nexus_7","Asus Nexus 7"); humanReadableNames.put("Nexus_7", "Asus Nexus 7");
humanReadableNames.put("Nexus_S","Samsung Nexus S"); humanReadableNames.put("Nexus_S", "Samsung Nexus S");
humanReadableNames.put("Nexus_S_4G","Samsung Nexus S 4G"); humanReadableNames.put("Nexus_S_4G", "Samsung Nexus S 4G");
humanReadableNames.put("Orange_Daytona","Huawei Ascend G510"); humanReadableNames.put("Orange_Daytona", "Huawei Ascend G510");
humanReadableNames.put("PC36100","HTC Evo 4G"); humanReadableNames.put("PC36100", "HTC Evo 4G");
humanReadableNames.put("PG06100","HTC EVO Shift 4G"); humanReadableNames.put("PG06100", "HTC EVO Shift 4G");
humanReadableNames.put("PG86100","HTC Evo 3D"); humanReadableNames.put("PG86100", "HTC Evo 3D");
humanReadableNames.put("PH44100","HTC Evo Design 4G"); humanReadableNames.put("PH44100", "HTC Evo Design 4G");
humanReadableNames.put("PantechP9070","Pantech Burst"); humanReadableNames.put("PantechP9070", "Pantech Burst");
humanReadableNames.put("QMV7A","Verizon Ellipsis 7"); humanReadableNames.put("QMV7A", "Verizon Ellipsis 7");
humanReadableNames.put("SAMSUNG-SGH-I317","Samsung Galaxy Note II"); humanReadableNames.put("SAMSUNG-SGH-I317", "Samsung Galaxy Note II");
humanReadableNames.put("SAMSUNG-SGH-I337","Samsung Galaxy S4"); humanReadableNames.put("SAMSUNG-SGH-I337", "Samsung Galaxy S4");
humanReadableNames.put("SAMSUNG-SGH-I527","Samsung Galaxy Mega"); humanReadableNames.put("SAMSUNG-SGH-I527", "Samsung Galaxy Mega");
humanReadableNames.put("SAMSUNG-SGH-I537","Samsung Galaxy S4 Active"); humanReadableNames.put("SAMSUNG-SGH-I537", "Samsung Galaxy S4 Active");
humanReadableNames.put("SAMSUNG-SGH-I717","Samsung Galaxy Note"); humanReadableNames.put("SAMSUNG-SGH-I717", "Samsung Galaxy Note");
humanReadableNames.put("SAMSUNG-SGH-I727","Samsung Skyrocket"); humanReadableNames.put("SAMSUNG-SGH-I727", "Samsung Skyrocket");
humanReadableNames.put("SAMSUNG-SGH-I747","Samsung Galaxy S III"); humanReadableNames.put("SAMSUNG-SGH-I747", "Samsung Galaxy S III");
humanReadableNames.put("SAMSUNG-SGH-I777","Samsung Galaxy S II"); humanReadableNames.put("SAMSUNG-SGH-I777", "Samsung Galaxy S II");
humanReadableNames.put("SAMSUNG-SGH-I897","Samsung Captivate"); humanReadableNames.put("SAMSUNG-SGH-I897", "Samsung Captivate");
humanReadableNames.put("SAMSUNG-SGH-I927","Samsung Captivate Glide"); humanReadableNames.put("SAMSUNG-SGH-I927", "Samsung Captivate Glide");
humanReadableNames.put("SAMSUNG-SGH-I997","Samsung Infuse 4G"); humanReadableNames.put("SAMSUNG-SGH-I997", "Samsung Infuse 4G");
humanReadableNames.put("SAMSUNG-SM-G730A","Samsung Galaxy S3 Mini"); humanReadableNames.put("SAMSUNG-SM-G730A", "Samsung Galaxy S3 Mini");
humanReadableNames.put("SAMSUNG-SM-G870A","Samsung Galaxy S5 Active"); humanReadableNames.put("SAMSUNG-SM-G870A", "Samsung Galaxy S5 Active");
humanReadableNames.put("SAMSUNG-SM-G900A","Samsung Galaxy S5"); humanReadableNames.put("SAMSUNG-SM-G900A", "Samsung Galaxy S5");
humanReadableNames.put("SAMSUNG-SM-G920A","Samsung Galaxy S6"); humanReadableNames.put("SAMSUNG-SM-G920A", "Samsung Galaxy S6");
humanReadableNames.put("SAMSUNG-SM-N900A","Samsung Galaxy Note 3"); humanReadableNames.put("SAMSUNG-SM-N900A", "Samsung Galaxy Note 3");
humanReadableNames.put("SAMSUNG-SM-N910A","Samsung Galaxy Note 4"); humanReadableNames.put("SAMSUNG-SM-N910A", "Samsung Galaxy Note 4");
humanReadableNames.put("SC-02C","Galaxy S2"); humanReadableNames.put("SC-02C", "Galaxy S2");
humanReadableNames.put("SC-03E","Galaxy S3"); humanReadableNames.put("SC-03E", "Galaxy S3");
humanReadableNames.put("SC-04E","Galaxy S4"); humanReadableNames.put("SC-04E", "Galaxy S4");
humanReadableNames.put("SC-06D","Galaxy S3"); humanReadableNames.put("SC-06D", "Galaxy S3");
humanReadableNames.put("SCH-I200","Samsung Galaxy Stellar"); humanReadableNames.put("SCH-I200", "Samsung Galaxy Stellar");
humanReadableNames.put("SCH-I337","Galaxy S4"); humanReadableNames.put("SCH-I337", "Galaxy S4");
humanReadableNames.put("SCH-I405","Samsung Stratosphere"); humanReadableNames.put("SCH-I405", "Samsung Stratosphere");
humanReadableNames.put("SCH-I415","Samsung Galaxy Stratosphere II"); humanReadableNames.put("SCH-I415", "Samsung Galaxy Stratosphere II");
humanReadableNames.put("SCH-I435","Samsung Galaxy S4 Mini"); humanReadableNames.put("SCH-I435", "Samsung Galaxy S4 Mini");
humanReadableNames.put("SCH-I500","Samsung Fascinate"); humanReadableNames.put("SCH-I500", "Samsung Fascinate");
humanReadableNames.put("SCH-I510","Samsung Droid Charge"); humanReadableNames.put("SCH-I510", "Samsung Droid Charge");
humanReadableNames.put("SCH-I535","Samsung Galaxy S III"); humanReadableNames.put("SCH-I535", "Samsung Galaxy S III");
humanReadableNames.put("SCH-I545","Samsung Galaxy S4"); humanReadableNames.put("SCH-I545", "Samsung Galaxy S4");
humanReadableNames.put("SCH-I605","Samsung Galaxy Note II"); humanReadableNames.put("SCH-I605", "Samsung Galaxy Note II");
humanReadableNames.put("SCH-I800","Samsung Galaxy Tab 7.0"); humanReadableNames.put("SCH-I800", "Samsung Galaxy Tab 7.0");
humanReadableNames.put("SCH-I939","Galaxy S3"); humanReadableNames.put("SCH-I939", "Galaxy S3");
humanReadableNames.put("SCH-I959","Galaxy S4"); humanReadableNames.put("SCH-I959", "Galaxy S4");
humanReadableNames.put("SCH-J021","Galaxy S3"); humanReadableNames.put("SCH-J021", "Galaxy S3");
humanReadableNames.put("SCH-R530C","Samsung Galaxy S3"); humanReadableNames.put("SCH-R530C", "Samsung Galaxy S3");
humanReadableNames.put("SCH-R530M","Samsung Galaxy S III"); humanReadableNames.put("SCH-R530M", "Samsung Galaxy S III");
humanReadableNames.put("SCH-R530U","Samsung Galaxy S III"); humanReadableNames.put("SCH-R530U", "Samsung Galaxy S III");
humanReadableNames.put("SCH-R720","Samsung Admire"); humanReadableNames.put("SCH-R720", "Samsung Admire");
humanReadableNames.put("SCH-R760","Galaxy S2"); humanReadableNames.put("SCH-R760", "Galaxy S2");
humanReadableNames.put("SCH-R970","Samsung Galaxy S4"); humanReadableNames.put("SCH-R970", "Samsung Galaxy S4");
humanReadableNames.put("SCH-S720C","Samsung Proclaim"); humanReadableNames.put("SCH-S720C", "Samsung Proclaim");
humanReadableNames.put("SCH-S738C","Samsung Galaxy Centura"); humanReadableNames.put("SCH-S738C", "Samsung Galaxy Centura");
humanReadableNames.put("SCH-S968C","Samsung Galaxy S III"); humanReadableNames.put("SCH-S968C", "Samsung Galaxy S III");
humanReadableNames.put("SCL21","Galaxy S3"); humanReadableNames.put("SCL21", "Galaxy S3");
humanReadableNames.put("SGH-I257M","Samsung Galaxy S4 Mini"); humanReadableNames.put("SGH-I257M", "Samsung Galaxy S4 Mini");
humanReadableNames.put("SGH-I317M","Samsung Galaxy Note II"); humanReadableNames.put("SGH-I317M", "Samsung Galaxy Note II");
humanReadableNames.put("SGH-I337M","Samsung Galaxy S4"); humanReadableNames.put("SGH-I337M", "Samsung Galaxy S4");
humanReadableNames.put("SGH-I727R","Samsung Galaxy S II"); humanReadableNames.put("SGH-I727R", "Samsung Galaxy S II");
humanReadableNames.put("SGH-I747M","Samsung Galaxy S III"); humanReadableNames.put("SGH-I747M", "Samsung Galaxy S III");
humanReadableNames.put("SGH-I757M","Galaxy S2"); humanReadableNames.put("SGH-I757M", "Galaxy S2");
humanReadableNames.put("SGH-I777M","Galaxy S2"); humanReadableNames.put("SGH-I777M", "Galaxy S2");
humanReadableNames.put("SGH-M919","Samsung Galaxy S4"); humanReadableNames.put("SGH-M919", "Samsung Galaxy S4");
humanReadableNames.put("SGH-M919N","Samsung Galaxy S4"); humanReadableNames.put("SGH-M919N", "Samsung Galaxy S4");
humanReadableNames.put("SGH-N035","Galaxy S3"); humanReadableNames.put("SGH-N035", "Galaxy S3");
humanReadableNames.put("SGH-N045","Galaxy S4"); humanReadableNames.put("SGH-N045", "Galaxy S4");
humanReadableNames.put("SGH-N064","Galaxy S3"); humanReadableNames.put("SGH-N064", "Galaxy S3");
humanReadableNames.put("SGH-T399","Samsung Galaxy Light"); humanReadableNames.put("SGH-T399", "Samsung Galaxy Light");
humanReadableNames.put("SGH-T399N","Samsung Galaxy Light"); humanReadableNames.put("SGH-T399N", "Samsung Galaxy Light");
humanReadableNames.put("SGH-T599N","Samsung Galaxy Exhibit"); humanReadableNames.put("SGH-T599N", "Samsung Galaxy Exhibit");
humanReadableNames.put("SGH-T679","Samsung Exhibit II"); humanReadableNames.put("SGH-T679", "Samsung Exhibit II");
humanReadableNames.put("SGH-T769","Samsung Galaxy S Blaze"); humanReadableNames.put("SGH-T769", "Samsung Galaxy S Blaze");
humanReadableNames.put("SGH-T889","Samsung Galaxy Note II"); humanReadableNames.put("SGH-T889", "Samsung Galaxy Note II");
humanReadableNames.put("SGH-T959","Samsung Galaxy S Vibrant"); humanReadableNames.put("SGH-T959", "Samsung Galaxy S Vibrant");
humanReadableNames.put("SGH-T959V","Samsung Galaxy S 4G"); humanReadableNames.put("SGH-T959V", "Samsung Galaxy S 4G");
humanReadableNames.put("SGH-T989","Samsung Galaxy S II"); humanReadableNames.put("SGH-T989", "Samsung Galaxy S II");
humanReadableNames.put("SGH-T989D","Samsung Galaxy S II"); humanReadableNames.put("SGH-T989D", "Samsung Galaxy S II");
humanReadableNames.put("SGH-T999","Samsung Galaxy S III"); humanReadableNames.put("SGH-T999", "Samsung Galaxy S III");
humanReadableNames.put("SGH-T999L","Samsung Galaxy S III"); humanReadableNames.put("SGH-T999L", "Samsung Galaxy S III");
humanReadableNames.put("SGH-T999V","Samsung Galaxy S III"); humanReadableNames.put("SGH-T999V", "Samsung Galaxy S III");
humanReadableNames.put("SGP312","Sony Xperia Tablet Z"); humanReadableNames.put("SGP312", "Sony Xperia Tablet Z");
humanReadableNames.put("SHV-E210K","Samsung Galaxy S3"); humanReadableNames.put("SHV-E210K", "Samsung Galaxy S3");
humanReadableNames.put("SHV-E210S","Samsung Galaxy S III"); humanReadableNames.put("SHV-E210S", "Samsung Galaxy S III");
humanReadableNames.put("SHV-E250K","Samsung Galaxy Note 2"); humanReadableNames.put("SHV-E250K", "Samsung Galaxy Note 2");
humanReadableNames.put("SHV-E250S","Samsung Galaxy Note II"); humanReadableNames.put("SHV-E250S", "Samsung Galaxy Note II");
humanReadableNames.put("SHV-E300","Galaxy S4"); humanReadableNames.put("SHV-E300", "Galaxy S4");
humanReadableNames.put("SHW-M250","Galaxy S2"); humanReadableNames.put("SHW-M250", "Galaxy S2");
humanReadableNames.put("SM-G3815","Samsung Galaxy Express II"); humanReadableNames.put("SM-G3815", "Samsung Galaxy Express II");
humanReadableNames.put("SM-G386T","Samsung Galaxy Avant"); humanReadableNames.put("SM-G386T", "Samsung Galaxy Avant");
humanReadableNames.put("SM-G386T1","Samsung Galaxy Avant"); humanReadableNames.put("SM-G386T1", "Samsung Galaxy Avant");
humanReadableNames.put("SM-G7102","Samsung Galaxy Grand II"); humanReadableNames.put("SM-G7102", "Samsung Galaxy Grand II");
humanReadableNames.put("SM-G800F","Samsung Galaxy S5 Mini"); humanReadableNames.put("SM-G800F", "Samsung Galaxy S5 Mini");
humanReadableNames.put("SM-G860P","Samsung Galaxy S5 Sport"); humanReadableNames.put("SM-G860P", "Samsung Galaxy S5 Sport");
humanReadableNames.put("SM-G900F","Samsung Galaxy S5"); humanReadableNames.put("SM-G900F", "Samsung Galaxy S5");
humanReadableNames.put("SM-G900H","Samsung Galaxy S5"); humanReadableNames.put("SM-G900H", "Samsung Galaxy S5");
humanReadableNames.put("SM-G900I","Samsung Galaxy S5"); humanReadableNames.put("SM-G900I", "Samsung Galaxy S5");
humanReadableNames.put("SM-G900P","Samsung Galaxy S5"); humanReadableNames.put("SM-G900P", "Samsung Galaxy S5");
humanReadableNames.put("SM-G900R4","Galaxy S5"); humanReadableNames.put("SM-G900R4", "Galaxy S5");
humanReadableNames.put("SM-G900RZWAUSC","Galaxy S5"); humanReadableNames.put("SM-G900RZWAUSC", "Galaxy S5");
humanReadableNames.put("SM-G900T","Samsung Galaxy S5"); humanReadableNames.put("SM-G900T", "Samsung Galaxy S5");
humanReadableNames.put("SM-G900V","Samsung Galaxy S5"); humanReadableNames.put("SM-G900V", "Samsung Galaxy S5");
humanReadableNames.put("SM-G900W8","Samsung Galaxy S5"); humanReadableNames.put("SM-G900W8", "Samsung Galaxy S5");
humanReadableNames.put("SM-G9200","Galaxy S6"); humanReadableNames.put("SM-G9200", "Galaxy S6");
humanReadableNames.put("SM-G920F","Galaxy S6"); humanReadableNames.put("SM-G920F", "Galaxy S6");
humanReadableNames.put("SM-G920I","Galaxy S6"); humanReadableNames.put("SM-G920I", "Galaxy S6");
humanReadableNames.put("SM-G920P","Samsung Galaxy S6"); humanReadableNames.put("SM-G920P", "Samsung Galaxy S6");
humanReadableNames.put("SM-G920R","Galaxy S6"); humanReadableNames.put("SM-G920R", "Galaxy S6");
humanReadableNames.put("SM-G920T","Samsung Galaxy S6"); humanReadableNames.put("SM-G920T", "Samsung Galaxy S6");
humanReadableNames.put("SM-G920V","Samsung Galaxy S6"); humanReadableNames.put("SM-G920V", "Samsung Galaxy S6");
humanReadableNames.put("SM-G920W8","Galaxy S6"); humanReadableNames.put("SM-G920W8", "Galaxy S6");
humanReadableNames.put("SM-G9250","Galaxy S6 Edge"); humanReadableNames.put("SM-G9250", "Galaxy S6 Edge");
humanReadableNames.put("SM-G925A","Galaxy S6 Edge"); humanReadableNames.put("SM-G925A", "Galaxy S6 Edge");
humanReadableNames.put("SM-G925F","Galaxy S6 Edge"); humanReadableNames.put("SM-G925F", "Galaxy S6 Edge");
humanReadableNames.put("SM-G925P","Galaxy S6 Edge"); humanReadableNames.put("SM-G925P", "Galaxy S6 Edge");
humanReadableNames.put("SM-G925R","Galaxy S6 Edge"); humanReadableNames.put("SM-G925R", "Galaxy S6 Edge");
humanReadableNames.put("SM-G925T","Galaxy S6 Edge"); humanReadableNames.put("SM-G925T", "Galaxy S6 Edge");
humanReadableNames.put("SM-G925V","Galaxy S6 Edge"); humanReadableNames.put("SM-G925V", "Galaxy S6 Edge");
humanReadableNames.put("SM-G925W8","Galaxy S6 Edge"); humanReadableNames.put("SM-G925W8", "Galaxy S6 Edge");
humanReadableNames.put("SM-N7505","Samsung Galaxy Note 3 Neo"); humanReadableNames.put("SM-N7505", "Samsung Galaxy Note 3 Neo");
humanReadableNames.put("SM-N900","Samsung Galaxy Note 3"); humanReadableNames.put("SM-N900", "Samsung Galaxy Note 3");
humanReadableNames.put("SM-N9005","Samsung Galaxy Note 3"); humanReadableNames.put("SM-N9005", "Samsung Galaxy Note 3");
humanReadableNames.put("SM-N9006","Samsung Galaxy Note 3"); humanReadableNames.put("SM-N9006", "Samsung Galaxy Note 3");
humanReadableNames.put("SM-N900P","Samsung Galaxy Note 3"); humanReadableNames.put("SM-N900P", "Samsung Galaxy Note 3");
humanReadableNames.put("SM-N900T","Samsung Galaxy Note 3"); humanReadableNames.put("SM-N900T", "Samsung Galaxy Note 3");
humanReadableNames.put("SM-N900V","Samsung Galaxy Note 3"); humanReadableNames.put("SM-N900V", "Samsung Galaxy Note 3");
humanReadableNames.put("SM-N900W8","Samsung Galaxy Note 3"); humanReadableNames.put("SM-N900W8", "Samsung Galaxy Note 3");
humanReadableNames.put("SM-N910C","Samsung Galaxy Note 4"); humanReadableNames.put("SM-N910C", "Samsung Galaxy Note 4");
humanReadableNames.put("SM-N910F","Samsung Galaxy Note 4"); humanReadableNames.put("SM-N910F", "Samsung Galaxy Note 4");
humanReadableNames.put("SM-N910G","Samsung Galaxy Note 4"); humanReadableNames.put("SM-N910G", "Samsung Galaxy Note 4");
humanReadableNames.put("SM-N910P","Samsung Galaxy Note 4"); humanReadableNames.put("SM-N910P", "Samsung Galaxy Note 4");
humanReadableNames.put("SM-N910T","Samsung Galaxy Note 4"); humanReadableNames.put("SM-N910T", "Samsung Galaxy Note 4");
humanReadableNames.put("SM-N910V","Samsung Galaxy Note 4"); humanReadableNames.put("SM-N910V", "Samsung Galaxy Note 4");
humanReadableNames.put("SM-N910W8","Samsung Galaxy Note 4"); humanReadableNames.put("SM-N910W8", "Samsung Galaxy Note 4");
humanReadableNames.put("SM-P600","Samsung Galaxy Note 10.1"); humanReadableNames.put("SM-P600", "Samsung Galaxy Note 10.1");
humanReadableNames.put("SM-T210R","Samsung Galaxy Tab 3 7.0"); humanReadableNames.put("SM-T210R", "Samsung Galaxy Tab 3 7.0");
humanReadableNames.put("SM-T217S","Samsung Galaxy Tab 3 7.0"); humanReadableNames.put("SM-T217S", "Samsung Galaxy Tab 3 7.0");
humanReadableNames.put("SM-T230NU","Samsung Galaxy Tab 4"); humanReadableNames.put("SM-T230NU", "Samsung Galaxy Tab 4");
humanReadableNames.put("SM-T310","Samsung Galaxy Tab 3 8.0"); humanReadableNames.put("SM-T310", "Samsung Galaxy Tab 3 8.0");
humanReadableNames.put("SM-T530NU","Samsung Galaxy Tab 4 10.1"); humanReadableNames.put("SM-T530NU", "Samsung Galaxy Tab 4 10.1");
humanReadableNames.put("SM-T800","Samsung Galaxy Tab S 10.5"); humanReadableNames.put("SM-T800", "Samsung Galaxy Tab S 10.5");
humanReadableNames.put("SPH-D600","Samsung Conquer 4G"); humanReadableNames.put("SPH-D600", "Samsung Conquer 4G");
humanReadableNames.put("SPH-D700","Samsung Epic 4G"); humanReadableNames.put("SPH-D700", "Samsung Epic 4G");
humanReadableNames.put("SPH-D710","Samsung Epic"); humanReadableNames.put("SPH-D710", "Samsung Epic");
humanReadableNames.put("SPH-D710BST","Samsung Galaxy S II"); humanReadableNames.put("SPH-D710BST", "Samsung Galaxy S II");
humanReadableNames.put("SPH-D710VMUB","Samsung Galaxy S II"); humanReadableNames.put("SPH-D710VMUB", "Samsung Galaxy S II");
humanReadableNames.put("SPH-L300","Samsung Galaxy Victory"); humanReadableNames.put("SPH-L300", "Samsung Galaxy Victory");
humanReadableNames.put("SPH-L520","Samsung Galaxy S4 Mini"); humanReadableNames.put("SPH-L520", "Samsung Galaxy S4 Mini");
humanReadableNames.put("SPH-L710","Samsung Galaxy S III"); humanReadableNames.put("SPH-L710", "Samsung Galaxy S III");
humanReadableNames.put("SPH-L710T","Samsung Galaxy S III"); humanReadableNames.put("SPH-L710T", "Samsung Galaxy S III");
humanReadableNames.put("SPH-L720","Samsung Galaxy S4"); humanReadableNames.put("SPH-L720", "Samsung Galaxy S4");
humanReadableNames.put("SPH-L720T","Samsung Galaxy S4"); humanReadableNames.put("SPH-L720T", "Samsung Galaxy S4");
humanReadableNames.put("SPH-L900","Samsung Galaxy Note II"); humanReadableNames.put("SPH-L900", "Samsung Galaxy Note II");
humanReadableNames.put("SPH-M820-BST","Samsung Galaxy Prevail"); humanReadableNames.put("SPH-M820-BST", "Samsung Galaxy Prevail");
humanReadableNames.put("SPH-M830","Samsung Galaxy Rush"); humanReadableNames.put("SPH-M830", "Samsung Galaxy Rush");
humanReadableNames.put("SPH-M840","Samsung Galaxy Prevail 2"); humanReadableNames.put("SPH-M840", "Samsung Galaxy Prevail 2");
humanReadableNames.put("SPH-M930BST","Samsung Transform Ultra"); humanReadableNames.put("SPH-M930BST", "Samsung Transform Ultra");
humanReadableNames.put("ST21i","Sony Xperia Tipo"); humanReadableNames.put("ST21i", "Sony Xperia Tipo");
humanReadableNames.put("ST25i","Sony Xperia U"); humanReadableNames.put("ST25i", "Sony Xperia U");
humanReadableNames.put("ST26i","Sony Xperia J"); humanReadableNames.put("ST26i", "Sony Xperia J");
humanReadableNames.put("Transformer_Prime_TF201","Asus Transformer Prime"); humanReadableNames.put("Transformer_Prime_TF201", "Asus Transformer Prime");
humanReadableNames.put("Transformer_TF101","Asus Transformer"); humanReadableNames.put("Transformer_TF101", "Asus Transformer");
humanReadableNames.put("VM670","LG Optimus V"); humanReadableNames.put("VM670", "LG Optimus V");
humanReadableNames.put("VS840_4G","LG Lucid 4G"); humanReadableNames.put("VS840_4G", "LG Lucid 4G");
humanReadableNames.put("VS870_4G","LG Lucid 2"); humanReadableNames.put("VS870_4G", "LG Lucid 2");
humanReadableNames.put("VS910_4G","LG Revolution 4G"); humanReadableNames.put("VS910_4G", "LG Revolution 4G");
humanReadableNames.put("VS920_4G","LG Spectrum 4G"); humanReadableNames.put("VS920_4G", "LG Spectrum 4G");
humanReadableNames.put("VS930_4G","LG Spectrum 2"); humanReadableNames.put("VS930_4G", "LG Spectrum 2");
humanReadableNames.put("VS980_4G","LG G2"); humanReadableNames.put("VS980_4G", "LG G2");
humanReadableNames.put("VS985_4G","LG G3 4G"); humanReadableNames.put("VS985_4G", "LG G3 4G");
humanReadableNames.put("XT1022","Motorola Moto E"); humanReadableNames.put("XT1022", "Motorola Moto E");
humanReadableNames.put("XT1028","Motorola Moto G"); humanReadableNames.put("XT1028", "Motorola Moto G");
humanReadableNames.put("XT1030","Motorola Droid Mini"); humanReadableNames.put("XT1030", "Motorola Droid Mini");
humanReadableNames.put("XT1031","Motorola Moto G"); humanReadableNames.put("XT1031", "Motorola Moto G");
humanReadableNames.put("XT1032","Motorola Moto G"); humanReadableNames.put("XT1032", "Motorola Moto G");
humanReadableNames.put("XT1033","Motorola Moto G"); humanReadableNames.put("XT1033", "Motorola Moto G");
humanReadableNames.put("XT1034","Motorola Moto G"); humanReadableNames.put("XT1034", "Motorola Moto G");
humanReadableNames.put("XT1039","Motorola Moto G"); humanReadableNames.put("XT1039", "Motorola Moto G");
humanReadableNames.put("XT1045","Motorola Moto G"); humanReadableNames.put("XT1045", "Motorola Moto G");
humanReadableNames.put("XT1049","Motorola Moto X"); humanReadableNames.put("XT1049", "Motorola Moto X");
humanReadableNames.put("XT1053","Motorola Moto X"); humanReadableNames.put("XT1053", "Motorola Moto X");
humanReadableNames.put("XT1056","Motorola Moto X"); humanReadableNames.put("XT1056", "Motorola Moto X");
humanReadableNames.put("XT1058","Motorola Moto X"); humanReadableNames.put("XT1058", "Motorola Moto X");
humanReadableNames.put("XT1060","Motorola Moto X"); humanReadableNames.put("XT1060", "Motorola Moto X");
humanReadableNames.put("XT1068","Motorola Moto G"); humanReadableNames.put("XT1068", "Motorola Moto G");
humanReadableNames.put("XT1080","Motorola Droid Ultra"); humanReadableNames.put("XT1080", "Motorola Droid Ultra");
humanReadableNames.put("XT1095","Motorola Moto X"); humanReadableNames.put("XT1095", "Motorola Moto X");
humanReadableNames.put("XT1096","Motorola Moto X"); humanReadableNames.put("XT1096", "Motorola Moto X");
humanReadableNames.put("XT1097","Motorola Moto X"); humanReadableNames.put("XT1097", "Motorola Moto X");
humanReadableNames.put("XT1254","Motorola Droid Turbo"); humanReadableNames.put("XT1254", "Motorola Droid Turbo");
humanReadableNames.put("XT897","Motorola Photo Q"); humanReadableNames.put("XT897", "Motorola Photo Q");
humanReadableNames.put("XT907","Motorola Droid Razr M"); humanReadableNames.put("XT907", "Motorola Droid Razr M");
humanReadableNames.put("Xoom","Motorola Xoom"); humanReadableNames.put("Xoom", "Motorola Xoom");
humanReadableNames.put("Z970","ZTE ZMax"); humanReadableNames.put("Z970", "ZTE ZMax");
humanReadableNames.put("bq_Aquaris_5","bq Aquaris 5"); humanReadableNames.put("bq_Aquaris_5", "bq Aquaris 5");
humanReadableNames.put("bq_Aquaris_5_HD","bq Aquaris 5 HD"); humanReadableNames.put("bq_Aquaris_5_HD", "bq Aquaris 5 HD");
humanReadableNames.put("google_sdk","Android Emulator"); humanReadableNames.put("google_sdk", "Android Emulator");
humanReadableNames.put("myTouch_4G_Slide","HTC myTouch 4G Slide"); humanReadableNames.put("myTouch_4G_Slide", "HTC myTouch 4G Slide");
} }
@@ -481,11 +482,11 @@ public class DeviceHelper {
} }
//It returns getAndroidDeviceName() if no user-defined name has been set with setDeviceName(). //It returns getAndroidDeviceName() if no user-defined name has been set with setDeviceName().
public static String getDeviceName(Context context){ public static String getDeviceName(Context context) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
// Could use prefrences.contains but would need to check for empty String anyway. // Could use prefrences.contains but would need to check for empty String anyway.
String deviceName = preferences.getString(KEY_DEVICE_NAME_PREFERENCE, ""); String deviceName = preferences.getString(KEY_DEVICE_NAME_PREFERENCE, "");
if (deviceName.isEmpty()){ if (deviceName.isEmpty()) {
deviceName = DeviceHelper.getAndroidDeviceName(); deviceName = DeviceHelper.getAndroidDeviceName();
Log.i("MainSettingsActivity", "New device name: " + deviceName); Log.i("MainSettingsActivity", "New device name: " + deviceName);
preferences.edit().putString(KEY_DEVICE_NAME_PREFERENCE, deviceName).apply(); preferences.edit().putString(KEY_DEVICE_NAME_PREFERENCE, deviceName).apply();
@@ -493,7 +494,7 @@ public class DeviceHelper {
return deviceName; return deviceName;
} }
public static void setDeviceName(Context context, String name){ public static void setDeviceName(Context context, String name) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
preferences.edit().putString(KEY_DEVICE_NAME_PREFERENCE, name).apply(); preferences.edit().putString(KEY_DEVICE_NAME_PREFERENCE, name).apply();
} }

View File

@@ -34,8 +34,9 @@ public class FilesHelper {
public static String getFileNameWithoutExt(String filename) { public static String getFileNameWithoutExt(String filename) {
int dot = filename.lastIndexOf("."); int dot = filename.lastIndexOf(".");
return (dot < 0)? filename : filename.substring(0, dot); return (dot < 0) ? filename : filename.substring(0, dot);
} }
public static String getMimeTypeFromFile(String file) { public static String getMimeTypeFromFile(String file) {
String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(getFileExt(file)); String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(getFileExt(file));
if (mime == null) mime = "*/*"; if (mime == null) mime = "*/*";
@@ -44,12 +45,12 @@ public class FilesHelper {
public static String findNonExistingNameForNewFile(String path, String filename) { public static String findNonExistingNameForNewFile(String path, String filename) {
int dot = filename.lastIndexOf("."); int dot = filename.lastIndexOf(".");
String name = (dot < 0)? filename : filename.substring(0, dot); String name = (dot < 0) ? filename : filename.substring(0, dot);
String ext = (dot < 0)? "" : filename.substring(filename.lastIndexOf(".")); String ext = (dot < 0) ? "" : filename.substring(filename.lastIndexOf("."));
int num = 1; int num = 1;
while (new File(path+"/"+filename).exists()) { while (new File(path + "/" + filename).exists()) {
filename = name+" ("+num+")"+ext; filename = name + " (" + num + ")" + ext;
num++; num++;
} }
@@ -57,6 +58,7 @@ public class FilesHelper {
} }
//Following code from http://activemq.apache.org/maven/5.7.0/kahadb/apidocs/src-html/org/apache/kahadb/util/IOHelper.html //Following code from http://activemq.apache.org/maven/5.7.0/kahadb/apidocs/src-html/org/apache/kahadb/util/IOHelper.html
/** /**
* Converts any string into a string that is safe to use as a file name. * Converts any string into a string that is safe to use as a file name.
* The result will only include ascii characters and numbers, and the "-","_", and "." characters. * The result will only include ascii characters and numbers, and the "-","_", and "." characters.
@@ -70,7 +72,7 @@ public class FilesHelper {
valid = valid || (c >= 'A' && c <= 'Z'); valid = valid || (c >= 'A' && c <= 'Z');
valid = valid || (c >= '0' && c <= '9'); valid = valid || (c >= '0' && c <= '9');
valid = valid || (c == '_') || (c == '-') || (c == '.'); valid = valid || (c == '_') || (c == '-') || (c == '.');
valid = valid || (dirSeparators && ( (c == '/') || (c == '\\'))); valid = valid || (dirSeparators && ((c == '/') || (c == '\\')));
if (valid) { if (valid) {
rc.append(c); rc.append(c);
@@ -78,13 +80,15 @@ public class FilesHelper {
} }
String result = rc.toString(); String result = rc.toString();
if (result.length() > maxFileLength) { if (result.length() > maxFileLength) {
result = result.substring(result.length()-maxFileLength,result.length()); result = result.substring(result.length() - maxFileLength, result.length());
} }
return result; return result;
} }
public static String toFileSystemSafeName(String name, boolean dirSeparators) { public static String toFileSystemSafeName(String name, boolean dirSeparators) {
return toFileSystemSafeName(name, dirSeparators, 255); return toFileSystemSafeName(name, dirSeparators, 255);
} }
public static String toFileSystemSafeName(String name) { public static String toFileSystemSafeName(String name) {
return toFileSystemSafeName(name, true, 255); return toFileSystemSafeName(name, true, 255);
} }
@@ -94,6 +98,6 @@ public class FilesHelper {
} }
public static void LogOpenFileCount() { public static void LogOpenFileCount() {
Log.e("KDE/FileCount",""+GetOpenFileCount()); Log.e("KDE/FileCount", "" + GetOpenFileCount());
} }
} }

View File

@@ -27,9 +27,9 @@ import android.graphics.drawable.Drawable;
public class ImagesHelper { public class ImagesHelper {
public static Bitmap drawableToBitmap (Drawable drawable) { public static Bitmap drawableToBitmap(Drawable drawable) {
if (drawable instanceof BitmapDrawable) { if (drawable instanceof BitmapDrawable) {
return ((BitmapDrawable)drawable).getBitmap(); return ((BitmapDrawable) drawable).getBitmap();
} }
Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);

View File

@@ -32,7 +32,8 @@ public class NetworkHelper {
continue; continue;
} }
//Log.e(info.getTypeName(),""+info.isAvailable()); //Log.e(info.getTypeName(),""+info.isAvailable());
if (info.isAvailable()) return false; //We are connected to at least one non-mobile network if (info.isAvailable())
return false; //We are connected to at least one non-mobile network
} }
if (mobile) { //We suspect we are on a mobile net if (mobile) { //We suspect we are on a mobile net
try { try {
@@ -48,7 +49,7 @@ public class NetworkHelper {
e.printStackTrace(); e.printStackTrace();
} }
} }
} catch(Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
Log.d("isOnMobileNetwork", "Something went wrong, but this is non-critical."); Log.d("isOnMobileNetwork", "Something went wrong, but this is non-critical.");
} }

View File

@@ -8,7 +8,7 @@ public class NotificationHelper {
public static void notifyCompat(NotificationManager notificationManager, int notificationId, Notification notification) { public static void notifyCompat(NotificationManager notificationManager, int notificationId, Notification notification) {
try { try {
notificationManager.notify(notificationId, notification); notificationManager.notify(notificationId, notification);
} catch(Exception e) { } catch (Exception e) {
//4.1 will throw an exception about not having the VIBRATE permission, ignore it. //4.1 will throw an exception about not having the VIBRATE permission, ignore it.
//https://android.googlesource.com/platform/frameworks/base/+/android-4.2.1_r1.2%5E%5E!/ //https://android.googlesource.com/platform/frameworks/base/+/android-4.2.1_r1.2%5E%5E!/
} }
@@ -17,7 +17,7 @@ public class NotificationHelper {
public static void notifyCompat(NotificationManager notificationManager, String tag, int notificationId, Notification notification) { public static void notifyCompat(NotificationManager notificationManager, String tag, int notificationId, Notification notification) {
try { try {
notificationManager.notify(tag, notificationId, notification); notificationManager.notify(tag, notificationId, notification);
} catch(Exception e) { } catch (Exception e) {
//4.1 will throw an exception about not having the VIBRATE permission, ignore it. //4.1 will throw an exception about not having the VIBRATE permission, ignore it.
//https://android.googlesource.com/platform/frameworks/base/+/android-4.2.1_r1.2%5E%5E!/ //https://android.googlesource.com/platform/frameworks/base/+/android-4.2.1_r1.2%5E%5E!/
} }

View File

@@ -6,13 +6,13 @@ import java.security.SecureRandom;
public class RandomHelper { public class RandomHelper {
public static SecureRandom secureRandom = new SecureRandom(); public static SecureRandom secureRandom = new SecureRandom();
private static final char[] symbols = ("ABCDEFGHIJKLMNOPQRSTUVWXYZ"+ private static final char[] symbols = ("ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
"abcdefghijklmnopqrstuvwxyz"+ "abcdefghijklmnopqrstuvwxyz" +
"1234567890").toCharArray(); "1234567890").toCharArray();
public static String randomString(int length) { public static String randomString(int length) {
char[] buffer= new char[length]; char[] buffer = new char[length];
for (int idx = 0; idx < length; ++idx) { for (int idx = 0; idx < length; ++idx) {
buffer[idx] = symbols[secureRandom.nextInt(symbols.length)]; buffer[idx] = symbols[secureRandom.nextInt(symbols.length)];
} }

View File

@@ -76,8 +76,8 @@ public class RsaHelper {
try { try {
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
byte[] publicKeyBytes = Base64.decode(settings.getString("publicKey", ""), 0); byte[] publicKeyBytes = Base64.decode(settings.getString("publicKey", ""), 0);
return KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(publicKeyBytes)); return KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(publicKeyBytes));
} catch (Exception e) { } catch (Exception e) {
throw e; throw e;
} }

View File

@@ -64,7 +64,7 @@ import javax.net.ssl.X509TrustManager;
public class SslHelper { public class SslHelper {
public enum SslMode{ public enum SslMode {
Client, Client,
Server Server
} }
@@ -73,14 +73,14 @@ public class SslHelper {
public static final BouncyCastleProvider BC = new BouncyCastleProvider(); public static final BouncyCastleProvider BC = new BouncyCastleProvider();
public static void initialiseCertificate(Context context){ public static void initialiseCertificate(Context context) {
PrivateKey privateKey; PrivateKey privateKey;
PublicKey publicKey; PublicKey publicKey;
try { try {
privateKey = RsaHelper.getPrivateKey(context); privateKey = RsaHelper.getPrivateKey(context);
publicKey = RsaHelper.getPublicKey(context); publicKey = RsaHelper.getPublicKey(context);
}catch (Exception e){ } catch (Exception e) {
Log.e("SslHelper", "Error getting keys, can't create certificate"); Log.e("SslHelper", "Error getting keys, can't create certificate");
return; return;
} }
@@ -112,7 +112,7 @@ public class SslHelper {
edit.putString("certificate", Base64.encodeToString(certificate.getEncoded(), 0)); edit.putString("certificate", Base64.encodeToString(certificate.getEncoded(), 0));
edit.apply(); edit.apply();
} catch(Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
Log.e("KDE/initialiseCert", "Exception"); Log.e("KDE/initialiseCert", "Exception");
} }
@@ -144,7 +144,7 @@ public class SslHelper {
// Get remote device certificate if trusted // Get remote device certificate if trusted
X509Certificate remoteDeviceCertificate = null; X509Certificate remoteDeviceCertificate = null;
if (isDeviceTrusted){ if (isDeviceTrusted) {
SharedPreferences devicePreferences = context.getSharedPreferences(deviceId, Context.MODE_PRIVATE); SharedPreferences devicePreferences = context.getSharedPreferences(deviceId, Context.MODE_PRIVATE);
byte[] certificateBytes = Base64.decode(devicePreferences.getString("certificate", ""), 0); byte[] certificateBytes = Base64.decode(devicePreferences.getString("certificate", ""), 0);
X509CertificateHolder certificateHolder = new X509CertificateHolder(certificateBytes); X509CertificateHolder certificateHolder = new X509CertificateHolder(certificateBytes);
@@ -156,7 +156,7 @@ public class SslHelper {
keyStore.load(null, null); keyStore.load(null, null);
keyStore.setKeyEntry("key", privateKey, "".toCharArray(), new Certificate[]{certificate}); keyStore.setKeyEntry("key", privateKey, "".toCharArray(), new Certificate[]{certificate});
// Set certificate if device trusted // Set certificate if device trusted
if (remoteDeviceCertificate != null){ if (remoteDeviceCertificate != null) {
keyStore.setCertificateEntry(deviceId, remoteDeviceCertificate); keyStore.setCertificateEntry(deviceId, remoteDeviceCertificate);
} }
@@ -170,7 +170,7 @@ public class SslHelper {
trustManagerFactory.init(keyStore); trustManagerFactory.init(keyStore);
// Setup custom trust manager if device not trusted // Setup custom trust manager if device not trusted
TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() { TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() { public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0]; return new X509Certificate[0];
} }
@@ -189,7 +189,7 @@ public class SslHelper {
SSLContext tlsContext = SSLContext.getInstance("TLSv1"); //Newer TLS versions are only supported on API 16+ SSLContext tlsContext = SSLContext.getInstance("TLSv1"); //Newer TLS versions are only supported on API 16+
if (isDeviceTrusted) { if (isDeviceTrusted) {
tlsContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), RandomHelper.secureRandom); tlsContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), RandomHelper.secureRandom);
}else { } else {
tlsContext.init(keyManagerFactory.getKeyManagers(), trustAllCerts, RandomHelper.secureRandom); tlsContext.init(keyManagerFactory.getKeyManagers(), trustAllCerts, RandomHelper.secureRandom);
} }
return tlsContext; return tlsContext;
@@ -203,7 +203,7 @@ public class SslHelper {
public static void configureSslSocket(SSLSocket socket, boolean isDeviceTrusted, boolean isClient) { public static void configureSslSocket(SSLSocket socket, boolean isDeviceTrusted, boolean isClient) {
socket.setEnabledProtocols(new String[]{ "TLSv1" }); //Newer TLS versions are only supported on API 16+ socket.setEnabledProtocols(new String[]{"TLSv1"}); //Newer TLS versions are only supported on API 16+
// These cipher suites are most common of them that are accepted by kde and android during handshake // These cipher suites are most common of them that are accepted by kde and android during handshake
ArrayList<String> supportedCiphers = new ArrayList<>(); ArrayList<String> supportedCiphers = new ArrayList<>();
@@ -223,9 +223,9 @@ public class SslHelper {
} }
socket.setEnabledCipherSuites(supportedCiphers.toArray(new String[supportedCiphers.size()])); socket.setEnabledCipherSuites(supportedCiphers.toArray(new String[supportedCiphers.size()]));
if (isClient){ if (isClient) {
socket.setUseClientMode(true); socket.setUseClientMode(true);
}else{ } else {
socket.setUseClientMode(false); socket.setUseClientMode(false);
if (isDeviceTrusted) { if (isDeviceTrusted) {
socket.setNeedClientAuth(true); socket.setNeedClientAuth(true);
@@ -238,7 +238,7 @@ public class SslHelper {
public static SSLSocket convertToSslSocket(Context context, Socket socket, String deviceId, boolean isDeviceTrusted, boolean clientMode) throws IOException { public static SSLSocket convertToSslSocket(Context context, Socket socket, String deviceId, boolean isDeviceTrusted, boolean clientMode) throws IOException {
SSLSocketFactory sslsocketFactory = SslHelper.getSslContext(context, deviceId, isDeviceTrusted).getSocketFactory(); SSLSocketFactory sslsocketFactory = SslHelper.getSslContext(context, deviceId, isDeviceTrusted).getSocketFactory();
SSLSocket sslsocket = (SSLSocket)sslsocketFactory.createSocket(socket, socket.getInetAddress().getHostAddress(), socket.getPort(), true); SSLSocket sslsocket = (SSLSocket) sslsocketFactory.createSocket(socket, socket.getInetAddress().getHostAddress(), socket.getPort(), true);
SslHelper.configureSslSocket(sslsocket, isDeviceTrusted, clientMode); SslHelper.configureSslSocket(sslsocket, isDeviceTrusted, clientMode);
return sslsocket; return sslsocket;
} }
@@ -248,7 +248,7 @@ public class SslHelper {
byte[] hash = MessageDigest.getInstance("SHA-1").digest(certificate.getEncoded()); byte[] hash = MessageDigest.getInstance("SHA-1").digest(certificate.getEncoded());
Formatter formatter = new Formatter(); Formatter formatter = new Formatter();
int i; int i;
for (i = 0; i < hash.length-1; i++) { for (i = 0; i < hash.length - 1; i++) {
formatter.format("%02x:", hash[i]); formatter.format("%02x:", hash[i]);
} }
formatter.format("%02x", hash[i]); formatter.format("%02x", hash[i]);

View File

@@ -81,11 +81,11 @@ public class StorageHelper {
if (storage.exists() && storage.isDirectory()) { if (storage.exists() && storage.isDirectory()) {
String mounts = null; String mounts = null;
try { try {
Scanner scanner = new Scanner( new File("/proc/mounts") ); Scanner scanner = new Scanner(new File("/proc/mounts"));
mounts = scanner.useDelimiter("\\A").next(); mounts = scanner.useDelimiter("\\A").next();
scanner.close(); scanner.close();
//Log.e("Mounts",mounts); //Log.e("Mounts",mounts);
} catch(Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
@@ -98,7 +98,7 @@ public class StorageHelper {
try { try {
//Log.e(dir.getAbsolutePath(), dir.getCanonicalPath()); //Log.e(dir.getAbsolutePath(), dir.getCanonicalPath());
path = dir.getCanonicalPath(); path = dir.getCanonicalPath();
} catch(Exception e){ } catch (Exception e) {
path = path2; path = path2;
} }
if (!path.startsWith("/storage/emulated") || dirs.length == 1) { if (!path.startsWith("/storage/emulated") || dirs.length == 1) {
@@ -120,7 +120,7 @@ public class StorageHelper {
try { try {
buf_reader = new BufferedReader(new FileReader("/proc/mounts")); buf_reader = new BufferedReader(new FileReader("/proc/mounts"));
String entry; String entry;
while((entry = buf_reader.readLine()) != null) { while ((entry = buf_reader.readLine()) != null) {
//Log.e("getStorageList", entry); //Log.e("getStorageList", entry);
if (entry.contains("vfat") || entry.contains("exfat") || entry.contains("ntfs") || entry.contains("/mnt")) { if (entry.contains("vfat") || entry.contains("exfat") || entry.contains("ntfs") || entry.contains("/mnt")) {
if (entry.contains("/storage/sdcard")) entries.add(0, entry); if (entry.contains("/storage/sdcard")) entries.add(0, entry);

View File

@@ -27,8 +27,7 @@ import android.net.ConnectivityManager;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
import android.util.Log; import android.util.Log;
public class KdeConnectBroadcastReceiver extends BroadcastReceiver public class KdeConnectBroadcastReceiver extends BroadcastReceiver {
{
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
@@ -37,7 +36,7 @@ public class KdeConnectBroadcastReceiver extends BroadcastReceiver
String action = intent.getAction(); String action = intent.getAction();
switch(action) { switch (action) {
case Intent.ACTION_PACKAGE_REPLACED: case Intent.ACTION_PACKAGE_REPLACED:
Log.i("KdeConnect", "UpdateReceiver"); Log.i("KdeConnect", "UpdateReceiver");
if (!intent.getData().getSchemeSpecificPart().equals(context.getPackageName())) { if (!intent.getData().getSchemeSpecificPart().equals(context.getPackageName())) {
@@ -81,12 +80,11 @@ public class KdeConnectBroadcastReceiver extends BroadcastReceiver
}); });
break; break;
default: default:
Log.i("BroadcastReceiver", "Ignoring broadcast event: "+intent.getAction()); Log.i("BroadcastReceiver", "Ignoring broadcast event: " + intent.getAction());
break; break;
} }
} }
} }

View File

@@ -79,22 +79,85 @@ public class NetworkPackage {
} }
//Most commons getters and setters defined for convenience //Most commons getters and setters defined for convenience
public String getString(String key) { return mBody.optString(key,""); } public String getString(String key) {
public String getString(String key, String defaultValue) { return mBody.optString(key,defaultValue); } return mBody.optString(key, "");
public void set(String key, String value) { if (value == null) return; try { mBody.put(key,value); } catch(Exception e) { } } }
public int getInt(String key) { return mBody.optInt(key,-1); }
public int getInt(String key, int defaultValue) { return mBody.optInt(key,defaultValue); } public String getString(String key, String defaultValue) {
public long getLong(String key) { return mBody.optLong(key,-1); } return mBody.optString(key, defaultValue);
public long getLong(String key,long defaultValue) { return mBody.optLong(key,defaultValue); } }
public void set(String key, int value) { try { mBody.put(key,value); } catch(Exception e) { } }
public boolean getBoolean(String key) { return mBody.optBoolean(key,false); } public void set(String key, String value) {
public boolean getBoolean(String key, boolean defaultValue) { return mBody.optBoolean(key,defaultValue); } if (value == null) return;
public void set(String key, boolean value) { try { mBody.put(key,value); } catch(Exception e) { } } try {
public double getDouble(String key) { return mBody.optDouble(key,Double.NaN); } mBody.put(key, value);
public double getDouble(String key, double defaultValue) { return mBody.optDouble(key,defaultValue); } } catch (Exception e) {
public void set(String key, double value) { try { mBody.put(key,value); } catch(Exception e) { } } }
public JSONArray getJSONArray(String key) { return mBody.optJSONArray(key); } }
public void set(String key, JSONArray value) { try { mBody.put(key,value); } catch(Exception e) { } }
public int getInt(String key) {
return mBody.optInt(key, -1);
}
public int getInt(String key, int defaultValue) {
return mBody.optInt(key, defaultValue);
}
public long getLong(String key) {
return mBody.optLong(key, -1);
}
public long getLong(String key, long defaultValue) {
return mBody.optLong(key, defaultValue);
}
public void set(String key, int value) {
try {
mBody.put(key, value);
} catch (Exception e) {
}
}
public boolean getBoolean(String key) {
return mBody.optBoolean(key, false);
}
public boolean getBoolean(String key, boolean defaultValue) {
return mBody.optBoolean(key, defaultValue);
}
public void set(String key, boolean value) {
try {
mBody.put(key, value);
} catch (Exception e) {
}
}
public double getDouble(String key) {
return mBody.optDouble(key, Double.NaN);
}
public double getDouble(String key, double defaultValue) {
return mBody.optDouble(key, defaultValue);
}
public void set(String key, double value) {
try {
mBody.put(key, value);
} catch (Exception e) {
}
}
public JSONArray getJSONArray(String key) {
return mBody.optJSONArray(key);
}
public void set(String key, JSONArray value) {
try {
mBody.put(key, value);
} catch (Exception e) {
}
}
public Set<String> getStringSet(String key) { public Set<String> getStringSet(String key) {
JSONArray jsonArray = mBody.optJSONArray(key); JSONArray jsonArray = mBody.optJSONArray(key);
@@ -105,22 +168,26 @@ public class NetworkPackage {
try { try {
String str = jsonArray.getString(i); String str = jsonArray.getString(i);
list.add(str); list.add(str);
} catch(Exception e) { } } catch (Exception e) {
}
} }
return list; return list;
} }
public Set<String> getStringSet(String key, Set<String> defaultValue) { public Set<String> getStringSet(String key, Set<String> defaultValue) {
if (mBody.has(key)) return getStringSet(key); if (mBody.has(key)) return getStringSet(key);
else return defaultValue; else return defaultValue;
} }
public void set(String key, Set<String> value) { public void set(String key, Set<String> value) {
try { try {
JSONArray jsonArray = new JSONArray(); JSONArray jsonArray = new JSONArray();
for(String str : value) { for (String str : value) {
jsonArray.put(str); jsonArray.put(str);
} }
mBody.put(key,jsonArray); mBody.put(key, jsonArray);
} catch(Exception e) { } } catch (Exception e) {
}
} }
public List<String> getStringList(String key) { public List<String> getStringList(String key) {
@@ -132,24 +199,31 @@ public class NetworkPackage {
try { try {
String str = jsonArray.getString(i); String str = jsonArray.getString(i);
list.add(str); list.add(str);
} catch(Exception e) { } } catch (Exception e) {
}
} }
return list; return list;
} }
public List<String> getStringList(String key, List<String> defaultValue) { public List<String> getStringList(String key, List<String> defaultValue) {
if (mBody.has(key)) return getStringList(key); if (mBody.has(key)) return getStringList(key);
else return defaultValue; else return defaultValue;
} }
public void set(String key, List<String> value) { public void set(String key, List<String> value) {
try { try {
JSONArray jsonArray = new JSONArray(); JSONArray jsonArray = new JSONArray();
for(String str : value) { for (String str : value) {
jsonArray.put(str); jsonArray.put(str);
} }
mBody.put(key,jsonArray); mBody.put(key, jsonArray);
} catch(Exception e) { } } catch (Exception e) {
}
}
public boolean has(String key) {
return mBody.has(key);
} }
public boolean has(String key) { return mBody.has(key); }
public String serialize() throws JSONException { public String serialize() throws JSONException {
JSONObject jo = new JSONObject(); JSONObject jo = new JSONObject();
@@ -190,12 +264,12 @@ public class NetworkPackage {
np.mBody.put("deviceId", deviceId); np.mBody.put("deviceId", deviceId);
np.mBody.put("deviceName", DeviceHelper.getDeviceName(context)); np.mBody.put("deviceName", DeviceHelper.getDeviceName(context));
np.mBody.put("protocolVersion", NetworkPackage.ProtocolVersion); np.mBody.put("protocolVersion", NetworkPackage.ProtocolVersion);
np.mBody.put("deviceType", DeviceHelper.isTablet()? "tablet" : "phone"); np.mBody.put("deviceType", DeviceHelper.isTablet() ? "tablet" : "phone");
np.mBody.put("incomingCapabilities", new JSONArray(PluginFactory.getIncomingCapabilities(context))); np.mBody.put("incomingCapabilities", new JSONArray(PluginFactory.getIncomingCapabilities(context)));
np.mBody.put("outgoingCapabilities", new JSONArray(PluginFactory.getOutgoingCapabilities(context))); np.mBody.put("outgoingCapabilities", new JSONArray(PluginFactory.getOutgoingCapabilities(context)));
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
Log.e("NetworkPacakge","Exception on createIdentityPackage"); Log.e("NetworkPacakge", "Exception on createIdentityPackage");
} }
return np; return np;

View File

@@ -37,7 +37,7 @@ public class BatteryPlugin extends Plugin {
public final static String PACKAGE_TYPE_BATTERY_REQUEST = "kdeconnect.battery.request"; public final static String PACKAGE_TYPE_BATTERY_REQUEST = "kdeconnect.battery.request";
// keep these fields in sync with kdeconnect-kded:BatteryPlugin.h:ThresholdBatteryEvent // keep these fields in sync with kdeconnect-kded:BatteryPlugin.h:ThresholdBatteryEvent
private static final int THRESHOLD_EVENT_NONE= 0; private static final int THRESHOLD_EVENT_NONE = 0;
private static final int THRESHOLD_EVENT_BATTERY_LOW = 1; private static final int THRESHOLD_EVENT_BATTERY_LOW = 1;
private NetworkPackage batteryInfo = new NetworkPackage(PACKAGE_TYPE_BATTERY); private NetworkPackage batteryInfo = new NetworkPackage(PACKAGE_TYPE_BATTERY);
@@ -60,15 +60,15 @@ public class BatteryPlugin extends Plugin {
int scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, 1); int scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, 1);
int plugged = batteryIntent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); int plugged = batteryIntent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
int currentCharge = (level == -1)? batteryInfo.getInt("currentCharge") : level*100 / scale; int currentCharge = (level == -1) ? batteryInfo.getInt("currentCharge") : level * 100 / scale;
boolean isCharging = (plugged == -1)? batteryInfo.getBoolean("isCharging") : (0 != plugged); boolean isCharging = (plugged == -1) ? batteryInfo.getBoolean("isCharging") : (0 != plugged);
boolean lowBattery = Intent.ACTION_BATTERY_LOW.equals(batteryIntent.getAction()); boolean lowBattery = Intent.ACTION_BATTERY_LOW.equals(batteryIntent.getAction());
int thresholdEvent = lowBattery? THRESHOLD_EVENT_BATTERY_LOW : THRESHOLD_EVENT_NONE; int thresholdEvent = lowBattery ? THRESHOLD_EVENT_BATTERY_LOW : THRESHOLD_EVENT_NONE;
if (isCharging == batteryInfo.getBoolean("isCharging") if (isCharging == batteryInfo.getBoolean("isCharging")
&& currentCharge == batteryInfo.getInt("currentCharge") && currentCharge == batteryInfo.getInt("currentCharge")
&& thresholdEvent == batteryInfo.getInt("thresholdEvent") && thresholdEvent == batteryInfo.getInt("thresholdEvent")
) { ) {
//Do not send again if nothing has changed //Do not send again if nothing has changed

View File

@@ -36,6 +36,7 @@ public class ClipboardListener {
public interface ClipboardObserver { public interface ClipboardObserver {
void clipboardChanged(String content); void clipboardChanged(String content);
} }
private HashSet<ClipboardObserver> observers = new HashSet<>(); private HashSet<ClipboardObserver> observers = new HashSet<>();
private final Context context; private final Context context;
@@ -45,6 +46,7 @@ public class ClipboardListener {
private ClipboardManager.OnPrimaryClipChangedListener listener; private ClipboardManager.OnPrimaryClipChangedListener listener;
private static ClipboardListener _instance = null; private static ClipboardListener _instance = null;
public static ClipboardListener instance(Context context) { public static ClipboardListener instance(Context context) {
if (_instance == null) { if (_instance == null) {
_instance = new ClipboardListener(context); _instance = new ClipboardListener(context);
@@ -63,7 +65,7 @@ public class ClipboardListener {
ClipboardListener(final Context ctx) { ClipboardListener(final Context ctx) {
context = ctx; context = ctx;
if(android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
return; return;
} }
@@ -102,12 +104,10 @@ public class ClipboardListener {
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public void setText(String text) { public void setText(String text) {
currentContent = text; currentContent = text;
if(android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
android.text.ClipboardManager clipboard = (android.text.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); android.text.ClipboardManager clipboard = (android.text.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
clipboard.setText(text); clipboard.setText(text);
} } else {
else
{
cm.setText(text); cm.setText(text);
} }
} }

View File

@@ -10,7 +10,8 @@ public class KeyInputConnection extends BaseInputConnection {
view = targetView; view = targetView;
} }
@Override public boolean commitText(CharSequence text, int newCursorPosition) { @Override
public boolean commitText(CharSequence text, int newCursorPosition) {
view.sendChars(text); view.sendChars(text);
return true; return true;
} }

View File

@@ -33,16 +33,18 @@ import org.kde.kdeconnect.BackgroundService;
import org.kde.kdeconnect.Device; import org.kde.kdeconnect.Device;
import org.kde.kdeconnect.NetworkPackage; import org.kde.kdeconnect.NetworkPackage;
public class KeyListenerView extends View { public class KeyListenerView extends View {
private String deviceId; private String deviceId;
private static SparseIntArray SpecialKeysMap = new SparseIntArray(); private static SparseIntArray SpecialKeysMap = new SparseIntArray();
static { static {
int i = 0; int i = 0;
SpecialKeysMap.put(KeyEvent.KEYCODE_DEL, ++i); // 1 SpecialKeysMap.put(KeyEvent.KEYCODE_DEL, ++i); // 1
SpecialKeysMap.put(KeyEvent.KEYCODE_TAB, ++i); // 2 SpecialKeysMap.put(KeyEvent.KEYCODE_TAB, ++i); // 2
SpecialKeysMap.put(KeyEvent.KEYCODE_ENTER, 12); ++i; // 3 is not used, return is 12 instead SpecialKeysMap.put(KeyEvent.KEYCODE_ENTER, 12);
++i; // 3 is not used, return is 12 instead
SpecialKeysMap.put(KeyEvent.KEYCODE_DPAD_LEFT, ++i); // 4 SpecialKeysMap.put(KeyEvent.KEYCODE_DPAD_LEFT, ++i); // 4
SpecialKeysMap.put(KeyEvent.KEYCODE_DPAD_UP, ++i); // 5 SpecialKeysMap.put(KeyEvent.KEYCODE_DPAD_UP, ++i); // 5
SpecialKeysMap.put(KeyEvent.KEYCODE_DPAD_RIGHT, ++i); // 6 SpecialKeysMap.put(KeyEvent.KEYCODE_DPAD_RIGHT, ++i); // 6
@@ -165,7 +167,7 @@ public class KeyListenerView extends View {
np.set("key", new String(new char[]{keyCharacter}).toLowerCase()); np.set("key", new String(new char[]{keyCharacter}).toLowerCase());
} else { } else {
//A normal key, but still not handled by the KeyInputConnection (happens with numbers) //A normal key, but still not handled by the KeyInputConnection (happens with numbers)
np.set("key", new String(new char[]{(char)event.getUnicodeChar()})); np.set("key", new String(new char[]{(char) event.getUnicodeChar()}));
} }
sendKeyPressPackage(np); sendKeyPressPackage(np);

View File

@@ -62,11 +62,15 @@ public class MousePadActivity extends AppCompatActivity implements GestureDetect
enum ClickType { enum ClickType {
RIGHT, MIDDLE, NONE; RIGHT, MIDDLE, NONE;
static ClickType fromString(String s) { static ClickType fromString(String s) {
switch(s) { switch (s) {
case "right": return RIGHT; case "right":
case "middle": return MIDDLE; return RIGHT;
default: return NONE; case "middle":
return MIDDLE;
default:
return NONE;
} }
} }
} }
@@ -87,11 +91,11 @@ public class MousePadActivity extends AppCompatActivity implements GestureDetect
mMousePadGestureDetector = new MousePadGestureDetector(this, this); mMousePadGestureDetector = new MousePadGestureDetector(this, this);
mDetector.setOnDoubleTapListener(this); mDetector.setOnDoubleTapListener(this);
keyListenerView = (KeyListenerView)findViewById(R.id.keyListener); keyListenerView = (KeyListenerView) findViewById(R.id.keyListener);
keyListenerView.setDeviceId(deviceId); keyListenerView.setDeviceId(deviceId);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
if (prefs.getBoolean(getString(R.string.mousepad_scroll_direction),false)) { if (prefs.getBoolean(getString(R.string.mousepad_scroll_direction), false)) {
scrollDirection = -1; scrollDirection = -1;
} else { } else {
scrollDirection = 1; scrollDirection = 1;
@@ -106,7 +110,7 @@ public class MousePadActivity extends AppCompatActivity implements GestureDetect
doubleTapAction = ClickType.fromString(doubleTapSetting); doubleTapAction = ClickType.fromString(doubleTapSetting);
tripleTapAction = ClickType.fromString(tripleTapSetting); tripleTapAction = ClickType.fromString(tripleTapSetting);
switch (sensitivitySetting){ switch (sensitivitySetting) {
case "slowest": case "slowest":
mCurrentSensitivity = 0.2f; mCurrentSensitivity = 0.2f;
break; break;
@@ -185,7 +189,7 @@ public class MousePadActivity extends AppCompatActivity implements GestureDetect
if (mMousePadGestureDetector.onTouchEvent(event)) { if (mMousePadGestureDetector.onTouchEvent(event)) {
return true; return true;
} }
if ( mDetector.onTouchEvent(event) ) { if (mDetector.onTouchEvent(event)) {
return true; return true;
} }
@@ -240,8 +244,7 @@ public class MousePadActivity extends AppCompatActivity implements GestureDetect
} }
@Override @Override
public boolean onGenericMotionEvent(MotionEvent e) public boolean onGenericMotionEvent(MotionEvent e) {
{
if (android.os.Build.VERSION.SDK_INT >= 12) { // MotionEvent.getAxisValue is >= 12 if (android.os.Build.VERSION.SDK_INT >= 12) { // MotionEvent.getAxisValue is >= 12
if (e.getAction() == MotionEvent.ACTION_SCROLL) { if (e.getAction() == MotionEvent.ACTION_SCROLL) {
final float distanceY = e.getAxisValue(MotionEvent.AXIS_VSCROLL); final float distanceY = e.getAxisValue(MotionEvent.AXIS_VSCROLL);
@@ -268,8 +271,7 @@ public class MousePadActivity extends AppCompatActivity implements GestureDetect
isScrolling = true; isScrolling = true;
accumulatedDistanceY += distanceY; accumulatedDistanceY += distanceY;
if (accumulatedDistanceY > MinDistanceToSendScroll || accumulatedDistanceY < -MinDistanceToSendScroll) if (accumulatedDistanceY > MinDistanceToSendScroll || accumulatedDistanceY < -MinDistanceToSendScroll) {
{
sendScroll(scrollDirection * accumulatedDistanceY); sendScroll(scrollDirection * accumulatedDistanceY);
accumulatedDistanceY = 0; accumulatedDistanceY = 0;
@@ -334,7 +336,7 @@ public class MousePadActivity extends AppCompatActivity implements GestureDetect
@Override @Override
public boolean onTripleFingerTap(MotionEvent ev) { public boolean onTripleFingerTap(MotionEvent ev) {
switch(tripleTapAction){ switch (tripleTapAction) {
case RIGHT: case RIGHT:
sendRightClick(); sendRightClick();
break; break;
@@ -348,7 +350,7 @@ public class MousePadActivity extends AppCompatActivity implements GestureDetect
@Override @Override
public boolean onDoubleFingerTap(MotionEvent ev) { public boolean onDoubleFingerTap(MotionEvent ev) {
switch(doubleTapAction){ switch (doubleTapAction) {
case RIGHT: case RIGHT:
sendRightClick(); sendRightClick();
break; break;

View File

@@ -88,8 +88,8 @@ public class MousePadPlugin extends Plugin {
sensitivity = 1.0f; sensitivity = 1.0f;
} }
np.set("dx", dx*sensitivity); np.set("dx", dx * sensitivity);
np.set("dy", dy*sensitivity); np.set("dy", dy * sensitivity);
device.sendPackage(np); device.sendPackage(np);
} }
@@ -118,7 +118,7 @@ public class MousePadPlugin extends Plugin {
device.sendPackage(np); device.sendPackage(np);
} }
public void sendSingleHold(){ public void sendSingleHold() {
NetworkPackage np = new NetworkPackage(PACKAGE_TYPE_MOUSEPAD_REQUEST); NetworkPackage np = new NetworkPackage(PACKAGE_TYPE_MOUSEPAD_REQUEST);
np.set("singlehold", true); np.set("singlehold", true);
device.sendPackage(np); device.sendPackage(np);

View File

@@ -78,6 +78,7 @@ public final class AlbumArtCache {
/** /**
* Initializes the disk cache. Needs to be called at least once before trying to use the cache * Initializes the disk cache. Needs to be called at least once before trying to use the cache
*
* @param context The context * @param context The context
*/ */
public static void initializeDiskCache(Context context) { public static void initializeDiskCache(Context context) {
@@ -99,6 +100,7 @@ public final class AlbumArtCache {
/** /**
* Registers a mpris plugin, such that it gets notified of fetched album art * Registers a mpris plugin, such that it gets notified of fetched album art
*
* @param mpris The mpris plugin * @param mpris The mpris plugin
*/ */
public static void registerPlugin(MprisPlugin mpris) { public static void registerPlugin(MprisPlugin mpris) {
@@ -107,6 +109,7 @@ public final class AlbumArtCache {
/** /**
* Deregister a mpris plugin * Deregister a mpris plugin
*
* @param mpris The mpris plugin * @param mpris The mpris plugin
*/ */
public static void deregisterPlugin(MprisPlugin mpris) { public static void deregisterPlugin(MprisPlugin mpris) {
@@ -192,6 +195,7 @@ public final class AlbumArtCache {
/** /**
* Fetches an album art url and puts it in the cache * Fetches an album art url and puts it in the cache
*
* @param url The url * @param url The url
*/ */
private static void fetchUrl(URL url) { private static void fetchUrl(URL url) {
@@ -219,9 +223,9 @@ public final class AlbumArtCache {
/** /**
* Initialize an url fetch * Initialize an url fetch
* *
* @param url The url being fetched * @param url The url being fetched
* @param payloadInput A payload input stream (if from the connected device). null if fetched from http(s) * @param payloadInput A payload input stream (if from the connected device). null if fetched from http(s)
* @param cacheItem The disk cache item to edit * @param cacheItem The disk cache item to edit
* @throws IOException * @throws IOException
*/ */
FetchURLTask(URL url, InputStream payloadInput, DiskLruCache.Editor cacheItem) throws IOException { FetchURLTask(URL url, InputStream payloadInput, DiskLruCache.Editor cacheItem) throws IOException {
@@ -233,6 +237,7 @@ public final class AlbumArtCache {
/** /**
* Opens the http(s) connection * Opens the http(s) connection
*
* @return True if succeeded * @return True if succeeded
* @throws IOException * @throws IOException
*/ */
@@ -240,7 +245,7 @@ public final class AlbumArtCache {
//Default android behaviour does not follow https -> http urls, so do this manually //Default android behaviour does not follow https -> http urls, so do this manually
URL currentUrl = url; URL currentUrl = url;
HttpURLConnection connection; HttpURLConnection connection;
for (int i = 0; i<5; ++i) { for (int i = 0; i < 5; ++i) {
connection = (HttpURLConnection) currentUrl.openConnection(); connection = (HttpURLConnection) currentUrl.openConnection();
connection.setConnectTimeout(10000); connection.setConnectTimeout(10000);
connection.setReadTimeout(10000); connection.setReadTimeout(10000);
@@ -324,7 +329,9 @@ public final class AlbumArtCache {
--numFetching; --numFetching;
initiateFetch(); initiateFetch();
} }
}; }
;
/** /**
* Does the actual fetching and makes sure only not too many fetches are running at the same time * Does the actual fetching and makes sure only not too many fetches are running at the same time
@@ -357,6 +364,7 @@ public final class AlbumArtCache {
/** /**
* The disk cache requires mostly alphanumeric characters, and at most 64 characters. * The disk cache requires mostly alphanumeric characters, and at most 64 characters.
* So hash the url to get a valid key * So hash the url to get a valid key
*
* @param url The url * @param url The url
* @return A valid disk cache key * @return A valid disk cache key
*/ */
@@ -378,8 +386,9 @@ public final class AlbumArtCache {
/** /**
* Transfer an asked-for album art payload to the disk cache. * Transfer an asked-for album art payload to the disk cache.
*
* @param albumUrl The url of the album art (should be a file:// url) * @param albumUrl The url of the album art (should be a file:// url)
* @param payload The payload input stream * @param payload The payload input stream
*/ */
public static void payloadToDiskCache(String albumUrl, InputStream payload) { public static void payloadToDiskCache(String albumUrl, InputStream payload) {
//We need the disk cache for this //We need the disk cache for this

View File

@@ -58,7 +58,7 @@ public class MprisActivity extends AppCompatActivity {
private MprisPlugin.MprisPlayer targetPlayer = null; private MprisPlugin.MprisPlayer targetPlayer = null;
private static String milisToProgress(long milis) { private static String milisToProgress(long milis) {
int length = (int)(milis / 1000); //From milis to seconds int length = (int) (milis / 1000); //From milis to seconds
StringBuilder text = new StringBuilder(); StringBuilder text = new StringBuilder();
int minutes = length / 60; int minutes = length / 60;
if (minutes > 60) { if (minutes > 60) {
@@ -69,10 +69,12 @@ public class MprisActivity extends AppCompatActivity {
} }
text.append(minutes).append(':'); text.append(minutes).append(':');
int seconds = (length % 60); int seconds = (length % 60);
if(seconds < 10) text.append('0'); // needed to show length properly (eg 4:05 instead of 4:5) if (seconds < 10)
text.append('0'); // needed to show length properly (eg 4:05 instead of 4:5)
text.append(seconds); text.append(seconds);
return text.toString(); return text.toString();
} }
protected void connectToPlugin(final String targetPlayerName) { protected void connectToPlugin(final String targetPlayerName) {
BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() { BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() {
@@ -221,9 +223,9 @@ public class MprisActivity extends AppCompatActivity {
if (playerStatus.isSeekAllowed()) { if (playerStatus.isSeekAllowed()) {
((TextView) findViewById(R.id.time_textview)).setText(milisToProgress(playerStatus.getLength())); ((TextView) findViewById(R.id.time_textview)).setText(milisToProgress(playerStatus.getLength()));
SeekBar positionSeek = (SeekBar)findViewById(R.id.positionSeek); SeekBar positionSeek = (SeekBar) findViewById(R.id.positionSeek);
positionSeek.setMax((int)(playerStatus.getLength())); positionSeek.setMax((int) (playerStatus.getLength()));
positionSeek.setProgress((int)(playerStatus.getPosition())); positionSeek.setProgress((int) (playerStatus.getPosition()));
findViewById(R.id.progress_slider).setVisibility(View.VISIBLE); findViewById(R.id.progress_slider).setVisibility(View.VISIBLE);
} else { } else {
findViewById(R.id.progress_slider).setVisibility(View.GONE); findViewById(R.id.progress_slider).setVisibility(View.GONE);
@@ -251,7 +253,7 @@ public class MprisActivity extends AppCompatActivity {
/** /**
* Change current volume with provided step. * Change current volume with provided step.
* *
* @param step step size volume change * @param step step size volume change
*/ */
private void updateVolume(int step) { private void updateVolume(int step) {
if (targetPlayer == null) { if (targetPlayer == null) {
@@ -259,11 +261,11 @@ public class MprisActivity extends AppCompatActivity {
} }
final int currentVolume = targetPlayer.getVolume(); final int currentVolume = targetPlayer.getVolume();
if(currentVolume < 100 || currentVolume > 0) { if (currentVolume < 100 || currentVolume > 0) {
int newVolume = currentVolume + step; int newVolume = currentVolume + step;
if(newVolume > 100) { if (newVolume > 100) {
newVolume = 100; newVolume = 100;
} else if (newVolume <0 ) { } else if (newVolume < 0) {
newVolume = 0; newVolume = 0;
} }
targetPlayer.setVolume(newVolume); targetPlayer.setVolume(newVolume);
@@ -383,7 +385,7 @@ public class MprisActivity extends AppCompatActivity {
} }
}); });
((SeekBar)findViewById(R.id.volume_seek)).setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { ((SeekBar) findViewById(R.id.volume_seek)).setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override @Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) { public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
} }
@@ -408,7 +410,7 @@ public class MprisActivity extends AppCompatActivity {
positionSeekUpdateRunnable = new Runnable() { positionSeekUpdateRunnable = new Runnable() {
@Override @Override
public void run() { public void run() {
final SeekBar positionSeek = (SeekBar)findViewById(R.id.positionSeek); final SeekBar positionSeek = (SeekBar) findViewById(R.id.positionSeek);
BackgroundService.RunCommand(MprisActivity.this, new BackgroundService.InstanceCallback() { BackgroundService.RunCommand(MprisActivity.this, new BackgroundService.InstanceCallback() {
@Override @Override
public void onServiceStart(BackgroundService service) { public void onServiceStart(BackgroundService service) {
@@ -424,10 +426,10 @@ public class MprisActivity extends AppCompatActivity {
}; };
positionSeekUpdateHandler.postDelayed(positionSeekUpdateRunnable, 200); positionSeekUpdateHandler.postDelayed(positionSeekUpdateRunnable, 200);
((SeekBar)findViewById(R.id.positionSeek)).setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { ((SeekBar) findViewById(R.id.positionSeek)).setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override @Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean byUser) { public void onProgressChanged(SeekBar seekBar, int progress, boolean byUser) {
((TextView)findViewById(R.id.progress_textview)).setText(milisToProgress(progress)); ((TextView) findViewById(R.id.progress_textview)).setText(milisToProgress(progress));
} }
@Override @Override

View File

@@ -42,20 +42,22 @@ import java.util.HashSet;
/** /**
* Controls the mpris media control notification * Controls the mpris media control notification
* * <p>
* There are two parts to this: * There are two parts to this:
* - The notification (with buttons etc.) * - The notification (with buttons etc.)
* - The media session (via MediaSessionCompat; for lock screen control on * - The media session (via MediaSessionCompat; for lock screen control on
* older Android version. And in the future for lock screen album covers) * older Android version. And in the future for lock screen album covers)
*/ */
public class MprisMediaSession implements SharedPreferences.OnSharedPreferenceChangeListener { public class MprisMediaSession implements SharedPreferences.OnSharedPreferenceChangeListener {
public final static int MPRIS_MEDIA_NOTIFICATION_ID = 0x91b70463; // echo MprisNotification | md5sum | head -c 8 public final static int MPRIS_MEDIA_NOTIFICATION_ID = 0x91b70463; // echo MprisNotification | md5sum | head -c 8
public final static String MPRIS_MEDIA_SESSION_TAG = "org.kde.kdeconnect_tp.media_session"; public final static String MPRIS_MEDIA_SESSION_TAG = "org.kde.kdeconnect_tp.media_session";
private static MprisMediaSession instance = new MprisMediaSession(); private static MprisMediaSession instance = new MprisMediaSession();
public static MprisMediaSession getInstance() { public static MprisMediaSession getInstance() {
return instance; return instance;
} }
public static MediaSessionCompat getMediaSession() { public static MediaSessionCompat getMediaSession() {
return instance.mediaSession; return instance.mediaSession;
} }
@@ -106,11 +108,12 @@ public class MprisMediaSession implements SharedPreferences.OnSharedPreferenceCh
/** /**
* Called by the mpris plugin when it wants media control notifications for its device * Called by the mpris plugin when it wants media control notifications for its device
* * <p>
* Can be called multiple times, once for each device * Can be called multiple times, once for each device
*
* @param _context The context * @param _context The context
* @param mpris The mpris plugin * @param mpris The mpris plugin
* @param device The device id * @param device The device id
*/ */
public void onCreate(Context _context, MprisPlugin mpris, String device) { public void onCreate(Context _context, MprisPlugin mpris, String device) {
if (mprisDevices.isEmpty()) { if (mprisDevices.isEmpty()) {
@@ -128,9 +131,10 @@ public class MprisMediaSession implements SharedPreferences.OnSharedPreferenceCh
/** /**
* Called when a device disconnects/does not want notifications anymore * Called when a device disconnects/does not want notifications anymore
* * <p>
* Can be called multiple times, once for each device * Can be called multiple times, once for each device
* @param mpris The mpris plugin *
* @param mpris The mpris plugin
* @param device The device id * @param device The device id
*/ */
public void onDestroy(MprisPlugin mpris, String device) { public void onDestroy(MprisPlugin mpris, String device) {
@@ -147,9 +151,10 @@ public class MprisMediaSession implements SharedPreferences.OnSharedPreferenceCh
/** /**
* Updates which device+player we're going to use in the notification * Updates which device+player we're going to use in the notification
* * <p>
* Prefers playing devices/mpris players, but tries to keep displaying the same * Prefers playing devices/mpris players, but tries to keep displaying the same
* player and device, while possible. * player and device, while possible.
*
* @param service The background service * @param service The background service
*/ */
private void updateCurrentPlayer(BackgroundService service) { private void updateCurrentPlayer(BackgroundService service) {
@@ -208,176 +213,176 @@ public class MprisMediaSession implements SharedPreferences.OnSharedPreferenceCh
BackgroundService.RunCommand(context, new BackgroundService.InstanceCallback() { BackgroundService.RunCommand(context, new BackgroundService.InstanceCallback() {
@Override @Override
public void onServiceStart(BackgroundService service) { public void onServiceStart(BackgroundService service) {
//If the user disabled the media notification, do not show it //If the user disabled the media notification, do not show it
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
if (!prefs.getBoolean(context.getString(R.string.mpris_notification_key), true)) { if (!prefs.getBoolean(context.getString(R.string.mpris_notification_key), true)) {
closeMediaNotification(); closeMediaNotification();
return; return;
} }
//Make sure our information is up-to-date //Make sure our information is up-to-date
updateCurrentPlayer(service); updateCurrentPlayer(service);
//If the player disappeared (and no other playing one found), just remove the notification //If the player disappeared (and no other playing one found), just remove the notification
if (notificationPlayer == null) { if (notificationPlayer == null) {
closeMediaNotification(); closeMediaNotification();
return; return;
} }
//Update the metadata and playback status //Update the metadata and playback status
if (mediaSession == null) { if (mediaSession == null) {
mediaSession = new MediaSessionCompat(context, MPRIS_MEDIA_SESSION_TAG); mediaSession = new MediaSessionCompat(context, MPRIS_MEDIA_SESSION_TAG);
mediaSession.setCallback(mediaSessionCallback); mediaSession.setCallback(mediaSessionCallback);
mediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS); mediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
} }
MediaMetadataCompat.Builder metadata = new MediaMetadataCompat.Builder(); MediaMetadataCompat.Builder metadata = new MediaMetadataCompat.Builder();
//Fallback because older KDE connect versions do not support getTitle() //Fallback because older KDE connect versions do not support getTitle()
if (!notificationPlayer.getTitle().isEmpty()) { if (!notificationPlayer.getTitle().isEmpty()) {
metadata.putString(MediaMetadataCompat.METADATA_KEY_TITLE, notificationPlayer.getTitle()); metadata.putString(MediaMetadataCompat.METADATA_KEY_TITLE, notificationPlayer.getTitle());
} else { } else {
metadata.putString(MediaMetadataCompat.METADATA_KEY_TITLE, notificationPlayer.getCurrentSong()); metadata.putString(MediaMetadataCompat.METADATA_KEY_TITLE, notificationPlayer.getCurrentSong());
} }
if (!notificationPlayer.getArtist().isEmpty()) { if (!notificationPlayer.getArtist().isEmpty()) {
metadata.putString(MediaMetadataCompat.METADATA_KEY_AUTHOR, notificationPlayer.getArtist()); metadata.putString(MediaMetadataCompat.METADATA_KEY_AUTHOR, notificationPlayer.getArtist());
} }
if (!notificationPlayer.getAlbum().isEmpty()) { if (!notificationPlayer.getAlbum().isEmpty()) {
metadata.putString(MediaMetadataCompat.METADATA_KEY_ALBUM, notificationPlayer.getAlbum()); metadata.putString(MediaMetadataCompat.METADATA_KEY_ALBUM, notificationPlayer.getAlbum());
} }
if (notificationPlayer.getLength() > 0) { if (notificationPlayer.getLength() > 0) {
metadata.putLong(MediaMetadataCompat.METADATA_KEY_DURATION, notificationPlayer.getLength()); metadata.putLong(MediaMetadataCompat.METADATA_KEY_DURATION, notificationPlayer.getLength());
} }
mediaSession.setMetadata(metadata.build()); mediaSession.setMetadata(metadata.build());
PlaybackStateCompat.Builder playbackState = new PlaybackStateCompat.Builder(); PlaybackStateCompat.Builder playbackState = new PlaybackStateCompat.Builder();
if (notificationPlayer.isPlaying()) { if (notificationPlayer.isPlaying()) {
playbackState.setState(PlaybackStateCompat.STATE_PLAYING, notificationPlayer.getPosition(), 1.0f); playbackState.setState(PlaybackStateCompat.STATE_PLAYING, notificationPlayer.getPosition(), 1.0f);
} else { } else {
playbackState.setState(PlaybackStateCompat.STATE_PAUSED, notificationPlayer.getPosition(), 0.0f); playbackState.setState(PlaybackStateCompat.STATE_PAUSED, notificationPlayer.getPosition(), 0.0f);
} }
//Create all actions (previous/play/pause/next) //Create all actions (previous/play/pause/next)
Intent iPlay = new Intent(service, MprisMediaNotificationReceiver.class); Intent iPlay = new Intent(service, MprisMediaNotificationReceiver.class);
iPlay.setAction(MprisMediaNotificationReceiver.ACTION_PLAY); iPlay.setAction(MprisMediaNotificationReceiver.ACTION_PLAY);
iPlay.putExtra(MprisMediaNotificationReceiver.EXTRA_DEVICE_ID, notificationDevice); iPlay.putExtra(MprisMediaNotificationReceiver.EXTRA_DEVICE_ID, notificationDevice);
iPlay.putExtra(MprisMediaNotificationReceiver.EXTRA_MPRIS_PLAYER, notificationPlayer.getPlayer()); iPlay.putExtra(MprisMediaNotificationReceiver.EXTRA_MPRIS_PLAYER, notificationPlayer.getPlayer());
PendingIntent piPlay = PendingIntent.getBroadcast(service, 0, iPlay, PendingIntent.FLAG_UPDATE_CURRENT); PendingIntent piPlay = PendingIntent.getBroadcast(service, 0, iPlay, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Action.Builder aPlay = new NotificationCompat.Action.Builder( NotificationCompat.Action.Builder aPlay = new NotificationCompat.Action.Builder(
R.drawable.ic_play_white, service.getString(R.string.mpris_play), piPlay); R.drawable.ic_play_white, service.getString(R.string.mpris_play), piPlay);
Intent iPause = new Intent(service, MprisMediaNotificationReceiver.class); Intent iPause = new Intent(service, MprisMediaNotificationReceiver.class);
iPause.setAction(MprisMediaNotificationReceiver.ACTION_PAUSE); iPause.setAction(MprisMediaNotificationReceiver.ACTION_PAUSE);
iPause.putExtra(MprisMediaNotificationReceiver.EXTRA_DEVICE_ID, notificationDevice); iPause.putExtra(MprisMediaNotificationReceiver.EXTRA_DEVICE_ID, notificationDevice);
iPause.putExtra(MprisMediaNotificationReceiver.EXTRA_MPRIS_PLAYER, notificationPlayer.getPlayer()); iPause.putExtra(MprisMediaNotificationReceiver.EXTRA_MPRIS_PLAYER, notificationPlayer.getPlayer());
PendingIntent piPause = PendingIntent.getBroadcast(service, 0, iPause, PendingIntent.FLAG_UPDATE_CURRENT); PendingIntent piPause = PendingIntent.getBroadcast(service, 0, iPause, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Action.Builder aPause = new NotificationCompat.Action.Builder( NotificationCompat.Action.Builder aPause = new NotificationCompat.Action.Builder(
R.drawable.ic_pause_white, service.getString(R.string.mpris_pause), piPause); R.drawable.ic_pause_white, service.getString(R.string.mpris_pause), piPause);
Intent iPrevious = new Intent(service, MprisMediaNotificationReceiver.class); Intent iPrevious = new Intent(service, MprisMediaNotificationReceiver.class);
iPrevious.setAction(MprisMediaNotificationReceiver.ACTION_PREVIOUS); iPrevious.setAction(MprisMediaNotificationReceiver.ACTION_PREVIOUS);
iPrevious.putExtra(MprisMediaNotificationReceiver.EXTRA_DEVICE_ID, notificationDevice); iPrevious.putExtra(MprisMediaNotificationReceiver.EXTRA_DEVICE_ID, notificationDevice);
iPrevious.putExtra(MprisMediaNotificationReceiver.EXTRA_MPRIS_PLAYER, notificationPlayer.getPlayer()); iPrevious.putExtra(MprisMediaNotificationReceiver.EXTRA_MPRIS_PLAYER, notificationPlayer.getPlayer());
PendingIntent piPrevious = PendingIntent.getBroadcast(service, 0, iPrevious, PendingIntent.FLAG_UPDATE_CURRENT); PendingIntent piPrevious = PendingIntent.getBroadcast(service, 0, iPrevious, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Action.Builder aPrevious = new NotificationCompat.Action.Builder( NotificationCompat.Action.Builder aPrevious = new NotificationCompat.Action.Builder(
R.drawable.ic_previous_white, service.getString(R.string.mpris_previous), piPrevious); R.drawable.ic_previous_white, service.getString(R.string.mpris_previous), piPrevious);
Intent iNext = new Intent(service, MprisMediaNotificationReceiver.class); Intent iNext = new Intent(service, MprisMediaNotificationReceiver.class);
iNext.setAction(MprisMediaNotificationReceiver.ACTION_NEXT); iNext.setAction(MprisMediaNotificationReceiver.ACTION_NEXT);
iNext.putExtra(MprisMediaNotificationReceiver.EXTRA_DEVICE_ID, notificationDevice); iNext.putExtra(MprisMediaNotificationReceiver.EXTRA_DEVICE_ID, notificationDevice);
iNext.putExtra(MprisMediaNotificationReceiver.EXTRA_MPRIS_PLAYER, notificationPlayer.getPlayer()); iNext.putExtra(MprisMediaNotificationReceiver.EXTRA_MPRIS_PLAYER, notificationPlayer.getPlayer());
PendingIntent piNext = PendingIntent.getBroadcast(service, 0, iNext, PendingIntent.FLAG_UPDATE_CURRENT); PendingIntent piNext = PendingIntent.getBroadcast(service, 0, iNext, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Action.Builder aNext = new NotificationCompat.Action.Builder( NotificationCompat.Action.Builder aNext = new NotificationCompat.Action.Builder(
R.drawable.ic_next_white, service.getString(R.string.mpris_next), piNext); R.drawable.ic_next_white, service.getString(R.string.mpris_next), piNext);
Intent iOpenActivity = new Intent(service, MprisActivity.class); Intent iOpenActivity = new Intent(service, MprisActivity.class);
iOpenActivity.putExtra("deviceId", notificationDevice); iOpenActivity.putExtra("deviceId", notificationDevice);
iOpenActivity.putExtra("player", notificationPlayer.getPlayer()); iOpenActivity.putExtra("player", notificationPlayer.getPlayer());
PendingIntent piOpenActivity = PendingIntent.getActivity(service, 0, iOpenActivity, PendingIntent.FLAG_UPDATE_CURRENT); PendingIntent piOpenActivity = PendingIntent.getActivity(service, 0, iOpenActivity, PendingIntent.FLAG_UPDATE_CURRENT);
//Create the notification //Create the notification
final NotificationCompat.Builder notification = new NotificationCompat.Builder(service); final NotificationCompat.Builder notification = new NotificationCompat.Builder(service);
notification notification
.setAutoCancel(false) .setAutoCancel(false)
.setContentIntent(piOpenActivity) .setContentIntent(piOpenActivity)
.setSmallIcon(R.drawable.ic_play_white) .setSmallIcon(R.drawable.ic_play_white)
.setShowWhen(false) .setShowWhen(false)
.setColor(service.getResources().getColor(R.color.primary)); .setColor(service.getResources().getColor(R.color.primary));
if (!notificationPlayer.getTitle().isEmpty()) { if (!notificationPlayer.getTitle().isEmpty()) {
notification.setContentTitle(notificationPlayer.getTitle()); notification.setContentTitle(notificationPlayer.getTitle());
} else { } else {
notification.setContentTitle(notificationPlayer.getCurrentSong()); notification.setContentTitle(notificationPlayer.getCurrentSong());
} }
//Only set the notification body text if we have an author and/or album //Only set the notification body text if we have an author and/or album
if (!notificationPlayer.getArtist().isEmpty() && !notificationPlayer.getAlbum().isEmpty()) { if (!notificationPlayer.getArtist().isEmpty() && !notificationPlayer.getAlbum().isEmpty()) {
notification.setContentText(notificationPlayer.getArtist() + " - " + notificationPlayer.getAlbum() + " (" + notificationPlayer.getPlayer() + ")"); notification.setContentText(notificationPlayer.getArtist() + " - " + notificationPlayer.getAlbum() + " (" + notificationPlayer.getPlayer() + ")");
} else if (!notificationPlayer.getArtist().isEmpty()) { } else if (!notificationPlayer.getArtist().isEmpty()) {
notification.setContentText(notificationPlayer.getArtist() + " (" + notificationPlayer.getPlayer() + ")"); notification.setContentText(notificationPlayer.getArtist() + " (" + notificationPlayer.getPlayer() + ")");
} else if (!notificationPlayer.getAlbum().isEmpty()) { } else if (!notificationPlayer.getAlbum().isEmpty()) {
notification.setContentText(notificationPlayer.getAlbum() + " (" + notificationPlayer.getPlayer() + ")"); notification.setContentText(notificationPlayer.getAlbum() + " (" + notificationPlayer.getPlayer() + ")");
} else { } else {
notification.setContentText(notificationPlayer.getPlayer()); notification.setContentText(notificationPlayer.getPlayer());
} }
if (!notificationPlayer.isPlaying()) { if (!notificationPlayer.isPlaying()) {
Intent iCloseNotification = new Intent(service, MprisMediaNotificationReceiver.class); Intent iCloseNotification = new Intent(service, MprisMediaNotificationReceiver.class);
iCloseNotification.setAction(MprisMediaNotificationReceiver.ACTION_CLOSE_NOTIFICATION); iCloseNotification.setAction(MprisMediaNotificationReceiver.ACTION_CLOSE_NOTIFICATION);
iCloseNotification.putExtra(MprisMediaNotificationReceiver.EXTRA_DEVICE_ID, notificationDevice); iCloseNotification.putExtra(MprisMediaNotificationReceiver.EXTRA_DEVICE_ID, notificationDevice);
iCloseNotification.putExtra(MprisMediaNotificationReceiver.EXTRA_MPRIS_PLAYER, notificationPlayer.getPlayer()); iCloseNotification.putExtra(MprisMediaNotificationReceiver.EXTRA_MPRIS_PLAYER, notificationPlayer.getPlayer());
PendingIntent piCloseNotification = PendingIntent.getActivity(service, 0, iCloseNotification, PendingIntent.FLAG_UPDATE_CURRENT); PendingIntent piCloseNotification = PendingIntent.getActivity(service, 0, iCloseNotification, PendingIntent.FLAG_UPDATE_CURRENT);
notification.setDeleteIntent(piCloseNotification); notification.setDeleteIntent(piCloseNotification);
} }
//Add media control actions //Add media control actions
int numActions = 0; int numActions = 0;
long playbackActions = 0; long playbackActions = 0;
if (notificationPlayer.isGoPreviousAllowed()) { if (notificationPlayer.isGoPreviousAllowed()) {
notification.addAction(aPrevious.build()); notification.addAction(aPrevious.build());
playbackActions |= PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS; playbackActions |= PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS;
++numActions; ++numActions;
} }
if (notificationPlayer.isPlaying() && notificationPlayer.isPauseAllowed()) { if (notificationPlayer.isPlaying() && notificationPlayer.isPauseAllowed()) {
notification.addAction(aPause.build()); notification.addAction(aPause.build());
playbackActions |= PlaybackStateCompat.ACTION_PAUSE; playbackActions |= PlaybackStateCompat.ACTION_PAUSE;
++numActions; ++numActions;
} }
if (!notificationPlayer.isPlaying() && notificationPlayer.isPlayAllowed()) { if (!notificationPlayer.isPlaying() && notificationPlayer.isPlayAllowed()) {
notification.addAction(aPlay.build()); notification.addAction(aPlay.build());
playbackActions |= PlaybackStateCompat.ACTION_PLAY; playbackActions |= PlaybackStateCompat.ACTION_PLAY;
++numActions; ++numActions;
} }
if (notificationPlayer.isGoNextAllowed()) { if (notificationPlayer.isGoNextAllowed()) {
notification.addAction(aNext.build()); notification.addAction(aNext.build());
playbackActions |= PlaybackStateCompat.ACTION_SKIP_TO_NEXT; playbackActions |= PlaybackStateCompat.ACTION_SKIP_TO_NEXT;
++numActions; ++numActions;
} }
playbackState.setActions(playbackActions); playbackState.setActions(playbackActions);
mediaSession.setPlaybackState(playbackState.build()); mediaSession.setPlaybackState(playbackState.build());
//Only allow deletion if no music is notificationPlayer //Only allow deletion if no music is notificationPlayer
if (notificationPlayer.isPlaying()) { if (notificationPlayer.isPlaying()) {
notification.setOngoing(true); notification.setOngoing(true);
} else { } else {
notification.setOngoing(false); notification.setOngoing(false);
} }
//Use the MediaStyle notification, so it feels like other media players. That also allows adding actions //Use the MediaStyle notification, so it feels like other media players. That also allows adding actions
NotificationCompat.MediaStyle mediaStyle = new NotificationCompat.MediaStyle(); NotificationCompat.MediaStyle mediaStyle = new NotificationCompat.MediaStyle();
if (numActions == 1) { if (numActions == 1) {
mediaStyle.setShowActionsInCompactView(0); mediaStyle.setShowActionsInCompactView(0);
} else if (numActions == 2) { } else if (numActions == 2) {
mediaStyle.setShowActionsInCompactView(0, 1); mediaStyle.setShowActionsInCompactView(0, 1);
} else if (numActions >= 3) { } else if (numActions >= 3) {
mediaStyle.setShowActionsInCompactView(0, 1, 2); mediaStyle.setShowActionsInCompactView(0, 1, 2);
} }
mediaStyle.setMediaSession(mediaSession.getSessionToken()); mediaStyle.setMediaSession(mediaSession.getSessionToken());
notification.setStyle(mediaStyle); notification.setStyle(mediaStyle);
//Display the notification //Display the notification
mediaSession.setActive(true); mediaSession.setActive(true);
final NotificationManager nm = (NotificationManager) service.getSystemService(Context.NOTIFICATION_SERVICE); final NotificationManager nm = (NotificationManager) service.getSystemService(Context.NOTIFICATION_SERVICE);
nm.notify(MPRIS_MEDIA_NOTIFICATION_ID, notification.build()); nm.notify(MPRIS_MEDIA_NOTIFICATION_ID, notification.build());
} }
}); });
} }

View File

@@ -92,7 +92,9 @@ public class MprisPlugin extends Plugin {
return volume; return volume;
} }
public long getLength(){ return length; } public long getLength() {
return length;
}
public boolean isPlaying() { public boolean isPlaying() {
return playing; return playing;
@@ -124,6 +126,7 @@ public class MprisPlugin extends Plugin {
/** /**
* Returns the album art (if available). Note that this can return null even if hasAlbumArt() returns true. * Returns the album art (if available). Note that this can return null even if hasAlbumArt() returns true.
*
* @return The album art, or null if not available * @return The album art, or null if not available
*/ */
public Bitmap getAlbumArt() { public Bitmap getAlbumArt() {
@@ -134,8 +137,8 @@ public class MprisPlugin extends Plugin {
return !isSpotify(); return !isSpotify();
} }
public long getPosition(){ public long getPosition() {
if(playing) { if (playing) {
return lastPosition + (System.currentTimeMillis() - lastPositionTime); return lastPosition + (System.currentTimeMillis() - lastPositionTime);
} else { } else {
return lastPosition; return lastPosition;
@@ -202,9 +205,9 @@ public class MprisPlugin extends Plugin {
public final static String PACKAGE_TYPE_MPRIS_REQUEST = "kdeconnect.mpris.request"; public final static String PACKAGE_TYPE_MPRIS_REQUEST = "kdeconnect.mpris.request";
private HashMap<String, MprisPlayer> players = new HashMap<>(); private HashMap<String, MprisPlayer> players = new HashMap<>();
private HashMap<String,Handler> playerStatusUpdated = new HashMap<>(); private HashMap<String, Handler> playerStatusUpdated = new HashMap<>();
private HashMap<String,Handler> playerListUpdated = new HashMap<>(); private HashMap<String, Handler> playerListUpdated = new HashMap<>();
@Override @Override
public String getDisplayName() { public String getDisplayName() {
@@ -273,7 +276,7 @@ public class MprisPlugin extends Plugin {
playerStatus.album = np.getString("album", playerStatus.album); playerStatus.album = np.getString("album", playerStatus.album);
playerStatus.volume = np.getInt("volume", playerStatus.volume); playerStatus.volume = np.getInt("volume", playerStatus.volume);
playerStatus.length = np.getLong("length", playerStatus.length); playerStatus.length = np.getLong("length", playerStatus.length);
if(np.has("pos")){ if (np.has("pos")) {
playerStatus.lastPosition = np.getLong("pos", playerStatus.lastPosition); playerStatus.lastPosition = np.getLong("pos", playerStatus.lastPosition);
playerStatus.lastPositionTime = System.currentTimeMillis(); playerStatus.lastPositionTime = System.currentTimeMillis();
} }
@@ -288,13 +291,15 @@ public class MprisPlugin extends Plugin {
//Turn the url into canonical form (and check its validity) //Turn the url into canonical form (and check its validity)
URL newAlbumArtUrl = new URL(newAlbumArtUrlstring); URL newAlbumArtUrl = new URL(newAlbumArtUrlstring);
playerStatus.albumArtUrl = newAlbumArtUrl.toString(); playerStatus.albumArtUrl = newAlbumArtUrl.toString();
} catch (MalformedURLException ignored) {} } catch (MalformedURLException ignored) {
}
for (String key : playerStatusUpdated.keySet()) { for (String key : playerStatusUpdated.keySet()) {
try { try {
playerStatusUpdated.get(key).dispatchMessage(new Message()); playerStatusUpdated.get(key).dispatchMessage(new Message());
} catch(Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
Log.e("MprisControl","Exception"); Log.e("MprisControl", "Exception");
playerStatusUpdated.remove(key); playerStatusUpdated.remove(key);
} }
} }
@@ -337,9 +342,9 @@ public class MprisPlugin extends Plugin {
for (String key : playerListUpdated.keySet()) { for (String key : playerListUpdated.keySet()) {
try { try {
playerListUpdated.get(key).dispatchMessage(new Message()); playerListUpdated.get(key).dispatchMessage(new Message());
} catch(Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
Log.e("MprisControl","Exception"); Log.e("MprisControl", "Exception");
playerListUpdated.remove(key); playerListUpdated.remove(key);
} }
} }
@@ -351,12 +356,12 @@ public class MprisPlugin extends Plugin {
@Override @Override
public String[] getSupportedPackageTypes() { public String[] getSupportedPackageTypes() {
return new String[] {PACKAGE_TYPE_MPRIS}; return new String[]{PACKAGE_TYPE_MPRIS};
} }
@Override @Override
public String[] getOutgoingPackageTypes() { public String[] getOutgoingPackageTypes() {
return new String[] {PACKAGE_TYPE_MPRIS_REQUEST}; return new String[]{PACKAGE_TYPE_MPRIS_REQUEST};
} }
public void setPlayerStatusUpdatedHandler(String id, Handler h) { public void setPlayerStatusUpdatedHandler(String id, Handler h) {
@@ -370,7 +375,7 @@ public class MprisPlugin extends Plugin {
} }
public void setPlayerListUpdatedHandler(String id, Handler h) { public void setPlayerListUpdatedHandler(String id, Handler h) {
playerListUpdated.put(id,h); playerListUpdated.put(id, h);
h.dispatchMessage(new Message()); h.dispatchMessage(new Message());
} }
@@ -395,6 +400,7 @@ public class MprisPlugin extends Plugin {
/** /**
* Returns a playing mpris player, if any exist * Returns a playing mpris player, if any exist
*
* @return null if no players are playing, a playing player otherwise * @return null if no players are playing, a playing player otherwise
*/ */
public MprisPlayer getPlayingPlayer() { public MprisPlayer getPlayingPlayer() {
@@ -408,15 +414,15 @@ public class MprisPlugin extends Plugin {
private void requestPlayerList() { private void requestPlayerList() {
NetworkPackage np = new NetworkPackage(PACKAGE_TYPE_MPRIS_REQUEST); NetworkPackage np = new NetworkPackage(PACKAGE_TYPE_MPRIS_REQUEST);
np.set("requestPlayerList",true); np.set("requestPlayerList", true);
device.sendPackage(np); device.sendPackage(np);
} }
private void requestPlayerStatus(String player) { private void requestPlayerStatus(String player) {
NetworkPackage np = new NetworkPackage(PACKAGE_TYPE_MPRIS_REQUEST); NetworkPackage np = new NetworkPackage(PACKAGE_TYPE_MPRIS_REQUEST);
np.set("player", player); np.set("player", player);
np.set("requestNowPlaying",true); np.set("requestNowPlaying", true);
np.set("requestVolume",true); np.set("requestVolume", true);
device.sendPackage(np); device.sendPackage(np);
} }
@@ -449,9 +455,9 @@ public class MprisPlugin extends Plugin {
for (String key : playerStatusUpdated.keySet()) { for (String key : playerStatusUpdated.keySet()) {
try { try {
playerStatusUpdated.get(key).dispatchMessage(new Message()); playerStatusUpdated.get(key).dispatchMessage(new Message());
} catch(Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
Log.e("MprisControl","Exception"); Log.e("MprisControl", "Exception");
playerStatusUpdated.remove(key); playerStatusUpdated.remove(key);
} }
} }

View File

@@ -65,15 +65,15 @@ public class PingPlugin extends Plugin {
stackBuilder.addParentStack(MaterialActivity.class); stackBuilder.addParentStack(MaterialActivity.class);
stackBuilder.addNextIntent(new Intent(context, MaterialActivity.class)); stackBuilder.addNextIntent(new Intent(context, MaterialActivity.class));
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent( PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(
0, 0,
PendingIntent.FLAG_UPDATE_CURRENT PendingIntent.FLAG_UPDATE_CURRENT
); );
int id; int id;
String message; String message;
if (np.has("message")) { if (np.has("message")) {
message = np.getString("message"); message = np.getString("message");
id = (int)System.currentTimeMillis(); id = (int) System.currentTimeMillis();
} else { } else {
message = "Ping!"; message = "Ping!";
id = 42; //A unique id to create only one notification id = 42; //A unique id to create only one notification

View File

@@ -75,6 +75,7 @@ public abstract class Plugin {
public String getPluginKey() { public String getPluginKey() {
return getPluginKey(this.getClass()); return getPluginKey(this.getClass());
} }
public static String getPluginKey(Class<? extends Plugin> p) { public static String getPluginKey(Class<? extends Plugin> p) {
return p.getSimpleName(); return p.getSimpleName();
} }
@@ -146,7 +147,8 @@ public abstract class Plugin {
/** /**
* Implement here what your plugin should do when clicked * Implement here what your plugin should do when clicked
*/ */
public void startMainActivity(Activity parentActivity) { } public void startMainActivity(Activity parentActivity) {
}
/** /**
* Return true if the entry for this app should appear in the context menu instead of the main view * Return true if the entry for this app should appear in the context menu instead of the main view
@@ -167,14 +169,17 @@ public abstract class Plugin {
* Finish any ongoing operations, remove listeners... so * Finish any ongoing operations, remove listeners... so
* this object could be garbage collected. * this object could be garbage collected.
*/ */
public void onDestroy() { } public void onDestroy() {
}
/** /**
* Called when a plugin receives a package. By convention we return true * Called when a plugin receives a package. By convention we return true
* when we have done something in response to the package or false * when we have done something in response to the package or false
* otherwise, even though that value is unused as of now. * otherwise, even though that value is unused as of now.
*/ */
public boolean onPackageReceived(NetworkPackage np) { return false; } public boolean onPackageReceived(NetworkPackage np) {
return false;
}
/** /**
* Should return the list of NetworkPackage types that this plugin can handle * Should return the list of NetworkPackage types that this plugin can handle
@@ -221,8 +226,8 @@ public abstract class Plugin {
} }
protected boolean arePermissionsGranted(String[] permissions) { protected boolean arePermissionsGranted(String[] permissions) {
for(String permission: permissions){ for (String permission : permissions) {
if(!isPermissionGranted(permission)){ if (!isPermissionGranted(permission)) {
return false; return false;
} }
} }
@@ -233,7 +238,7 @@ public abstract class Plugin {
return requestPermissionDialog(activity, new String[]{permissions}, reason); return requestPermissionDialog(activity, new String[]{permissions}, reason);
} }
protected AlertDialog requestPermissionDialog(final Activity activity, final String[] permissions, @StringRes int reason){ protected AlertDialog requestPermissionDialog(final Activity activity, final String[] permissions, @StringRes int reason) {
return new AlertDialog.Builder(activity) return new AlertDialog.Builder(activity)
.setTitle(getDisplayName()) .setTitle(getDisplayName())
.setMessage(reason) .setMessage(reason)
@@ -243,7 +248,7 @@ public abstract class Plugin {
ActivityCompat.requestPermissions(activity, permissions, 0); ActivityCompat.requestPermissions(activity, permissions, 0);
} }
}) })
.setNegativeButton(R.string.cancel,new DialogInterface.OnClickListener() { .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
@Override @Override
public void onClick(DialogInterface dialogInterface, int i) { public void onClick(DialogInterface dialogInterface, int i) {
//Do nothing //Do nothing
@@ -262,19 +267,19 @@ public abstract class Plugin {
} }
public AlertDialog getPermissionExplanationDialog(Activity deviceActivity) { public AlertDialog getPermissionExplanationDialog(Activity deviceActivity) {
return requestPermissionDialog(deviceActivity,getRequiredPermissions(), permissionExplanation); return requestPermissionDialog(deviceActivity, getRequiredPermissions(), permissionExplanation);
} }
public AlertDialog getOptionalPermissionExplanationDialog(Activity deviceActivity) { public AlertDialog getOptionalPermissionExplanationDialog(Activity deviceActivity) {
return requestPermissionDialog(deviceActivity,getOptionalPermissions(), optionalPermissionExplanation); return requestPermissionDialog(deviceActivity, getOptionalPermissions(), optionalPermissionExplanation);
} }
public boolean checkRequiredPermissions(){ public boolean checkRequiredPermissions() {
return arePermissionsGranted(getRequiredPermissions()); return arePermissionsGranted(getRequiredPermissions());
} }
public boolean checkOptionalPermissions(){ public boolean checkOptionalPermissions() {
return arePermissionsGranted(getOptionalPermissions()); return arePermissionsGranted(getOptionalPermissions());
} }
public int getMinSdk() { public int getMinSdk() {

View File

@@ -79,7 +79,9 @@ public class PluginFactory {
return icon; return icon;
} }
public boolean hasSettings() { return hasSettings; } public boolean hasSettings() {
return hasSettings;
}
public boolean isEnabledByDefault() { public boolean isEnabledByDefault() {
return enabledByDefault; return enabledByDefault;
@@ -136,15 +138,15 @@ public class PluginFactory {
} }
try { try {
Plugin p = ((Plugin)availablePlugins.get(pluginKey).newInstance()); Plugin p = ((Plugin) availablePlugins.get(pluginKey).newInstance());
p.setContext(context, null); p.setContext(context, null);
info = new PluginInfo(p.getDisplayName(), p.getDescription(), p.getIcon(), info = new PluginInfo(p.getDisplayName(), p.getDescription(), p.getIcon(),
p.isEnabledByDefault(), p.hasSettings(), p.listensToUnpairedDevices(), p.isEnabledByDefault(), p.hasSettings(), p.listensToUnpairedDevices(),
p.getSupportedPackageTypes(), p.getOutgoingPackageTypes()); p.getSupportedPackageTypes(), p.getOutgoingPackageTypes());
pluginInfoCache.put(pluginKey, info); //Cache it pluginInfoCache.put(pluginKey, info); //Cache it
return info; return info;
} catch(Exception e) { } catch (Exception e) {
Log.e("PluginFactory","getPluginInfo exception"); Log.e("PluginFactory", "getPluginInfo exception");
e.printStackTrace(); e.printStackTrace();
throw new RuntimeException(e); throw new RuntimeException(e);
} }
@@ -158,16 +160,16 @@ public class PluginFactory {
public static Plugin instantiatePluginForDevice(Context context, String pluginKey, Device device) { public static Plugin instantiatePluginForDevice(Context context, String pluginKey, Device device) {
Class c = availablePlugins.get(pluginKey); Class c = availablePlugins.get(pluginKey);
if (c == null) { if (c == null) {
Log.e("PluginFactory", "Plugin not found: "+pluginKey); Log.e("PluginFactory", "Plugin not found: " + pluginKey);
return null; return null;
} }
try { try {
Plugin plugin = (Plugin)c.newInstance(); Plugin plugin = (Plugin) c.newInstance();
plugin.setContext(context, device); plugin.setContext(context, device);
return plugin; return plugin;
} catch(Exception e) { } catch (Exception e) {
Log.e("PluginFactory", "Could not instantiate plugin: "+pluginKey); Log.e("PluginFactory", "Could not instantiate plugin: " + pluginKey);
e.printStackTrace(); e.printStackTrace();
return null; return null;
} }
@@ -178,8 +180,8 @@ public class PluginFactory {
try { try {
String pluginKey = Plugin.getPluginKey(pluginClass); String pluginKey = Plugin.getPluginKey(pluginClass);
availablePlugins.put(pluginKey, pluginClass); availablePlugins.put(pluginKey, pluginClass);
} catch(Exception e) { } catch (Exception e) {
Log.e("PluginFactory","addPlugin exception"); Log.e("PluginFactory", "addPlugin exception");
e.printStackTrace(); e.printStackTrace();
} }
} }
@@ -210,7 +212,7 @@ public class PluginFactory {
PluginInfo plugin = getPluginInfo(context, pluginId); PluginInfo plugin = getPluginInfo(context, pluginId);
//Check incoming against outgoing //Check incoming against outgoing
if (Collections.disjoint(outgoing, plugin.getSupportedPackageTypes()) if (Collections.disjoint(outgoing, plugin.getSupportedPackageTypes())
&& Collections.disjoint(incoming, plugin.getOutgoingPackageTypes())) { && Collections.disjoint(incoming, plugin.getOutgoingPackageTypes())) {
Log.i("PluginFactory", "Won't load " + pluginId + " because of unmatched capabilities"); Log.i("PluginFactory", "Won't load " + pluginId + " because of unmatched capabilities");
continue; //No capabilities in common, do not load this plugin continue; //No capabilities in common, do not load this plugin
} }

View File

@@ -93,7 +93,10 @@ public class ReceiveNotificationsPlugin extends Plugin {
} }
final InputStream input = np.getPayload(); final InputStream input = np.getPayload();
largeIcon = BitmapFactory.decodeStream(np.getPayload()); largeIcon = BitmapFactory.decodeStream(np.getPayload());
try { input.close(); } catch (Exception e) { } try {
input.close();
} catch (Exception e) {
}
if (largeIcon != null) { if (largeIcon != null) {
//Log.i("NotificationsPlugin", "hasPayload: size=" + largeIcon.getWidth() + "/" + largeIcon.getHeight() + " opti=" + width + "/" + height); //Log.i("NotificationsPlugin", "hasPayload: size=" + largeIcon.getWidth() + "/" + largeIcon.getHeight() + " opti=" + width + "/" + height);
if (largeIcon.getWidth() > width || largeIcon.getHeight() > height) { if (largeIcon.getWidth() > width || largeIcon.getHeight() > height) {

View File

@@ -52,17 +52,21 @@ public class RemoteKeyboardPlugin extends Plugin {
*/ */
private static ArrayList<RemoteKeyboardPlugin> instances = new ArrayList<RemoteKeyboardPlugin>(); private static ArrayList<RemoteKeyboardPlugin> instances = new ArrayList<RemoteKeyboardPlugin>();
private static ReentrantLock instancesLock = new ReentrantLock(true); private static ReentrantLock instancesLock = new ReentrantLock(true);
public static ArrayList<RemoteKeyboardPlugin> getInstances() { public static ArrayList<RemoteKeyboardPlugin> getInstances() {
return instances; return instances;
} }
public static ArrayList<RemoteKeyboardPlugin> acquireInstances() { public static ArrayList<RemoteKeyboardPlugin> acquireInstances() {
instancesLock.lock(); instancesLock.lock();
return getInstances(); return getInstances();
} }
public static ArrayList<RemoteKeyboardPlugin> releaseInstances() { public static ArrayList<RemoteKeyboardPlugin> releaseInstances() {
instancesLock.unlock(); instancesLock.unlock();
return getInstances(); return getInstances();
} }
public static boolean isConnected() { public static boolean isConnected() {
return instances.size() > 0; return instances.size() > 0;
} }
@@ -210,7 +214,7 @@ public class RemoteKeyboardPlugin extends Plugin {
return -1; return -1;
} }
private Pair<Integer,Integer> currentSelection(ExtractedText extractedText) { private Pair<Integer, Integer> currentSelection(ExtractedText extractedText) {
if (extractedText != null) if (extractedText != null)
return new Pair<>(extractedText.selectionStart, extractedText.selectionEnd); return new Pair<>(extractedText.selectionStart, extractedText.selectionEnd);
return new Pair<>(-1, -1); return new Pair<>(-1, -1);
@@ -235,12 +239,12 @@ public class RemoteKeyboardPlugin extends Plugin {
int startPos = pos; int startPos = pos;
int endPos = pos; int endPos = pos;
if (shift) { // Shift -> select word (otherwise jump) if (shift) { // Shift -> select word (otherwise jump)
Pair<Integer,Integer> sel = currentSelection(extractedText); Pair<Integer, Integer> sel = currentSelection(extractedText);
int cursor = currentCursorPos(extractedText); int cursor = currentCursorPos(extractedText);
// Log.d("RemoteKeyboardPlugin", "Selection (to right): " + sel.first + " / " + sel.second + " cursor: " + cursor); // Log.d("RemoteKeyboardPlugin", "Selection (to right): " + sel.first + " / " + sel.second + " cursor: " + cursor);
startPos = cursor; startPos = cursor;
if (sel.first < cursor || // active selection from left to right -> grow if (sel.first < cursor || // active selection from left to right -> grow
sel.first > sel.second) // active selection from right to left -> shrink sel.first > sel.second) // active selection from right to left -> shrink
startPos = sel.first; startPos = sel.first;
} }
inputConn.setSelection(startPos, endPos); inputConn.setSelection(startPos, endPos);
@@ -255,12 +259,12 @@ public class RemoteKeyboardPlugin extends Plugin {
int startPos = pos; int startPos = pos;
int endPos = pos; int endPos = pos;
if (shift) { if (shift) {
Pair<Integer,Integer> sel = currentSelection(extractedText); Pair<Integer, Integer> sel = currentSelection(extractedText);
int cursor = currentCursorPos(extractedText); int cursor = currentCursorPos(extractedText);
// Log.d("RemoteKeyboardPlugin", "Selection (to left): " + sel.first + " / " + sel.second + " cursor: " + cursor); // Log.d("RemoteKeyboardPlugin", "Selection (to left): " + sel.first + " / " + sel.second + " cursor: " + cursor);
startPos = cursor; startPos = cursor;
if (cursor < sel.first || // active selection from right to left -> grow if (cursor < sel.first || // active selection from right to left -> grow
sel.first < sel.second) // active selection from right to left -> shrink sel.first < sel.second) // active selection from right to left -> shrink
startPos = sel.first; startPos = sel.first;
} }
inputConn.setSelection(startPos, endPos); inputConn.setSelection(startPos, endPos);
@@ -284,9 +288,9 @@ public class RemoteKeyboardPlugin extends Plugin {
// Log.d("RemoteKeyboardPlugin", "Enter: " + editorInfo.imeOptions); // Log.d("RemoteKeyboardPlugin", "Enter: " + editorInfo.imeOptions);
if (editorInfo != null if (editorInfo != null
&& (((editorInfo.imeOptions & EditorInfo.IME_FLAG_NO_ENTER_ACTION) == 0) && (((editorInfo.imeOptions & EditorInfo.IME_FLAG_NO_ENTER_ACTION) == 0)
|| ctrl)) { // Ctrl+Return overrides IME_FLAG_NO_ENTER_ACTION (FIXME: make configurable?) || ctrl)) { // Ctrl+Return overrides IME_FLAG_NO_ENTER_ACTION (FIXME: make configurable?)
// check for special DONE/GO/etc actions first: // check for special DONE/GO/etc actions first:
int[] actions = { EditorInfo.IME_ACTION_GO, EditorInfo.IME_ACTION_NEXT, int[] actions = {EditorInfo.IME_ACTION_GO, EditorInfo.IME_ACTION_NEXT,
EditorInfo.IME_ACTION_SEND, EditorInfo.IME_ACTION_SEARCH, EditorInfo.IME_ACTION_SEND, EditorInfo.IME_ACTION_SEARCH,
EditorInfo.IME_ACTION_DONE}; // note: DONE should be last or we might hide the ime instead of "go" EditorInfo.IME_ACTION_DONE}; // note: DONE should be last or we might hide the ime instead of "go"
for (int i = 0; i < actions.length; i++) { for (int i = 0; i < actions.length; i++) {

View File

@@ -119,7 +119,7 @@ public class RemoteKeyboardService
visible = true; visible = true;
ArrayList<RemoteKeyboardPlugin> instances = RemoteKeyboardPlugin.acquireInstances(); ArrayList<RemoteKeyboardPlugin> instances = RemoteKeyboardPlugin.acquireInstances();
try { try {
for (RemoteKeyboardPlugin i: instances) for (RemoteKeyboardPlugin i : instances)
i.notifyKeyboardState(true); i.notifyKeyboardState(true);
} finally { } finally {
RemoteKeyboardPlugin.releaseInstances(); RemoteKeyboardPlugin.releaseInstances();
@@ -133,7 +133,7 @@ public class RemoteKeyboardService
visible = false; visible = false;
ArrayList<RemoteKeyboardPlugin> instances = RemoteKeyboardPlugin.acquireInstances(); ArrayList<RemoteKeyboardPlugin> instances = RemoteKeyboardPlugin.acquireInstances();
try { try {
for (RemoteKeyboardPlugin i: instances) for (RemoteKeyboardPlugin i : instances)
i.notifyKeyboardState(false); i.notifyKeyboardState(false);
} finally { } finally {
RemoteKeyboardPlugin.releaseInstances(); RemoteKeyboardPlugin.releaseInstances();

View File

@@ -53,7 +53,7 @@ public class RunCommandPlugin extends Plugin {
interface CommandsChangedCallback { interface CommandsChangedCallback {
void update(); void update();
}; }
public ArrayList<JSONObject> getCommandList() { public ArrayList<JSONObject> getCommandList() {
return commandList; return commandList;
@@ -88,7 +88,7 @@ public class RunCommandPlugin extends Plugin {
try { try {
JSONObject obj = new JSONObject(np.getString("commandList")); JSONObject obj = new JSONObject(np.getString("commandList"));
Iterator<String> keys = obj.keys(); Iterator<String> keys = obj.keys();
while(keys.hasNext()){ while (keys.hasNext()) {
String s = keys.next(); String s = keys.next();
JSONObject o = obj.getJSONObject(s); JSONObject o = obj.getJSONObject(s);
o.put("key", s); o.put("key", s);

View File

@@ -78,6 +78,7 @@ class SimpleSftpServer {
Security.insertProviderAt(SslHelper.BC, 1); Security.insertProviderAt(SslHelper.BC, 1);
SecurityUtils.setRegisterBouncyCastle(false); SecurityUtils.setRegisterBouncyCastle(false);
} }
private final SshServer sshd = SshServer.setUpDefaultServer(); private final SshServer sshd = SshServer.setUpDefaultServer();
public void init(Context context, Device device) { public void init(Context context, Device device) {
@@ -90,7 +91,7 @@ class SimpleSftpServer {
sshd.setFileSystemFactory(new AndroidFileSystemFactory(context)); sshd.setFileSystemFactory(new AndroidFileSystemFactory(context));
sshd.setCommandFactory(new ScpCommandFactory()); sshd.setCommandFactory(new ScpCommandFactory());
sshd.setSubsystemFactories(Collections.singletonList((NamedFactory<Command>)new SftpSubsystem.Factory())); sshd.setSubsystemFactories(Collections.singletonList((NamedFactory<Command>) new SftpSubsystem.Factory()));
if (device.publicKey != null) { if (device.publicKey != null) {
keyAuth.deviceKey = device.publicKey; keyAuth.deviceKey = device.publicKey;
@@ -105,12 +106,12 @@ class SimpleSftpServer {
passwordAuth.password = RandomHelper.randomString(28); passwordAuth.password = RandomHelper.randomString(28);
port = STARTPORT; port = STARTPORT;
while(!started) { while (!started) {
try { try {
sshd.setPort(port); sshd.setPort(port);
sshd.start(); sshd.start();
started = true; started = true;
} catch(Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
port++; port++;
if (port >= ENDPORT) { if (port >= ENDPORT) {
@@ -145,7 +146,7 @@ class SimpleSftpServer {
public String getLocalIpAddress() { public String getLocalIpAddress() {
String ip6 = null; String ip6 = null;
try { try {
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {
NetworkInterface intf = en.nextElement(); NetworkInterface intf = en.nextElement();
// Anything with rmnet is related to cellular connections or USB // Anything with rmnet is related to cellular connections or USB
@@ -156,13 +157,13 @@ class SimpleSftpServer {
// If we run across an interface that has this, we can safely // If we run across an interface that has this, we can safely
// ignore it. In fact, it's much safer to do. If we don't, we // ignore it. In fact, it's much safer to do. If we don't, we
// might get invalid IP adddresses out of it. // might get invalid IP adddresses out of it.
if(intf.getDisplayName().contains("rmnet")) continue; if (intf.getDisplayName().contains("rmnet")) continue;
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) { for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
InetAddress inetAddress = enumIpAddr.nextElement(); InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress()) { if (!inetAddress.isLoopbackAddress()) {
String address = inetAddress.getHostAddress(); String address = inetAddress.getHostAddress();
if(inetAddress instanceof Inet4Address) { //Prefer IPv4 over IPv6, because sshfs doesn't seem to like IPv6 if (inetAddress instanceof Inet4Address) { //Prefer IPv4 over IPv6, because sshfs doesn't seem to like IPv6
return address; return address;
} else { } else {
ip6 = address; ip6 = address;

View File

@@ -39,7 +39,7 @@ class NotificationUpdateCallback extends Device.SendPackageStatusCallback {
} else { } else {
title = res.getString(R.string.outgoing_file_title, device.getName()); title = res.getString(R.string.outgoing_file_title, device.getName());
} }
notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE); notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
builder = new NotificationCompat.Builder(context) builder = new NotificationCompat.Builder(context)
.setSmallIcon(android.R.drawable.stat_sys_upload) .setSmallIcon(android.R.drawable.stat_sys_upload)
.setAutoCancel(true) .setAutoCancel(true)
@@ -47,7 +47,7 @@ class NotificationUpdateCallback extends Device.SendPackageStatusCallback {
.setContentTitle(title) .setContentTitle(title)
.setTicker(title); .setTicker(title);
notificationId = (int)System.currentTimeMillis(); notificationId = (int) System.currentTimeMillis();
numFiles = toSend.size(); numFiles = toSend.size();

View File

@@ -80,7 +80,10 @@ public class ShareActivity extends AppCompatActivity {
new Thread(new Runnable() { new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
try { Thread.sleep(1500); } catch (InterruptedException ignored) { } try {
Thread.sleep(1500);
} catch (InterruptedException ignored) {
}
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
@@ -167,13 +170,13 @@ public class ShareActivity extends AppCompatActivity {
final Intent intent = getIntent(); final Intent intent = getIntent();
final String deviceId = intent.getStringExtra("deviceId"); final String deviceId = intent.getStringExtra("deviceId");
if (deviceId!=null) { if (deviceId != null) {
BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback(){ BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() {
@Override @Override
public void onServiceStart(BackgroundService service) { public void onServiceStart(BackgroundService service) {
Log.d("DirectShare", "sharing to "+service.getDevice(deviceId).getName()); Log.d("DirectShare", "sharing to " + service.getDevice(deviceId).getName());
Device device = service.getDevice(deviceId); Device device = service.getDevice(deviceId);
if (device.isReachable() && device.isPaired()) { if (device.isReachable() && device.isPaired()) {
SharePlugin.share(intent, device); SharePlugin.share(intent, device);

View File

@@ -42,8 +42,8 @@ public class ShareChooserTargetService extends ChooserTargetService {
public List<ChooserTarget> onGetChooserTargets(ComponentName targetActivityName, IntentFilter matchedFilter) { public List<ChooserTarget> onGetChooserTargets(ComponentName targetActivityName, IntentFilter matchedFilter) {
Log.d("DirectShare", "invoked"); Log.d("DirectShare", "invoked");
final List<ChooserTarget> targets = new ArrayList<>(); final List<ChooserTarget> targets = new ArrayList<>();
for(Device d: BackgroundService.getInstance().getDevices().values()){ for (Device d : BackgroundService.getInstance().getDevices().values()) {
if(d.isReachable() && d.isPaired()) { if (d.isReachable() && d.isPaired()) {
Log.d("DirectShare", d.getName()); Log.d("DirectShare", d.getName());
final String targetName = d.getName(); final String targetName = d.getName();
final Icon targetIcon = Icon.createWithResource(this, R.drawable.icon); final Icon targetIcon = Icon.createWithResource(this, R.drawable.icon);

View File

@@ -72,7 +72,7 @@ public class ShareNotification {
public void setProgress(int progress) { public void setProgress(int progress) {
builder.setProgress(100, progress, false) builder.setProgress(100, progress, false)
.setContentTitle(device.getContext().getResources().getString(R.string.incoming_file_title, device.getName())+" ("+progress+"%)"); .setContentTitle(device.getContext().getResources().getString(R.string.incoming_file_title, device.getName()) + " (" + progress + "%)");
} }
public void setFinished(boolean success) { public void setFinished(boolean success) {

View File

@@ -118,7 +118,7 @@ public class SharePlugin extends Plugin {
if (np.hasPayload()) { if (np.hasPayload()) {
Log.i("SharePlugin", "hasPayload"); Log.i("SharePlugin", "hasPayload");
if (isPermissionGranted(Manifest.permission.WRITE_EXTERNAL_STORAGE)) { if (isPermissionGranted(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
receiveFile(np); receiveFile(np);
} else { } else {
@@ -401,7 +401,7 @@ public class SharePlugin extends Plugin {
} }
} }
public static void share(Intent intent, Device device){ public static void share(Intent intent, Device device) {
Bundle extras = intent.getExtras(); Bundle extras = intent.getExtras();
if (extras != null) { if (extras != null) {
if (extras.containsKey(Intent.EXTRA_STREAM)) { if (extras.containsKey(Intent.EXTRA_STREAM)) {

View File

@@ -95,7 +95,7 @@ public class ShareSettingsActivity extends PluginSettingsActivity {
} }
try { try {
getDefaultDestinationDirectory().mkdirs(); getDefaultDestinationDirectory().mkdirs();
} catch(Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
return DocumentFile.fromFile(getDefaultDestinationDirectory()); return DocumentFile.fromFile(getDefaultDestinationDirectory());
@@ -112,7 +112,7 @@ public class ShareSettingsActivity extends PluginSettingsActivity {
Uri uri = resultData.getData(); Uri uri = resultData.getData();
getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION | getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION |
Intent.FLAG_GRANT_WRITE_URI_PERMISSION); Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
Preference filePicker = findPreference("share_destination_folder_preference"); Preference filePicker = findPreference("share_destination_folder_preference");
filePicker.setSummary(uri.getPath()); filePicker.setSummary(uri.getPath());

View File

@@ -75,7 +75,7 @@ public class TelepathyPlugin extends Plugin {
int permissionCheck = ContextCompat.checkSelfPermission(context, int permissionCheck = ContextCompat.checkSelfPermission(context,
Manifest.permission.SEND_SMS); Manifest.permission.SEND_SMS);
if(permissionCheck == PackageManager.PERMISSION_GRANTED) { if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
SmsManager smsManager = SmsManager.getDefault(); SmsManager smsManager = SmsManager.getDefault();
ArrayList<String> parts = smsManager.divideMessage(sms); ArrayList<String> parts = smsManager.divideMessage(sms);
@@ -83,7 +83,7 @@ public class TelepathyPlugin extends Plugin {
// If this message turns out to fit in a single SMS, sendMultpartTextMessage // If this message turns out to fit in a single SMS, sendMultpartTextMessage
// properly handles that case // properly handles that case
smsManager.sendMultipartTextMessage(phoneNo, null, parts, null, null); smsManager.sendMultipartTextMessage(phoneNo, null, parts, null, null);
} else if(permissionCheck == PackageManager.PERMISSION_DENIED){ } else if (permissionCheck == PackageManager.PERMISSION_DENIED) {
// TODO Request Permission SEND_SMS // TODO Request Permission SEND_SMS
} }
//TODO: Notify other end //TODO: Notify other end

View File

@@ -303,7 +303,7 @@ public class TelephonyPlugin extends Plugin {
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context);
String[] blockedNumbers = sharedPref.getString(KEY_PREF_BLOCKED_NUMBERS, "").split("\n"); String[] blockedNumbers = sharedPref.getString(KEY_PREF_BLOCKED_NUMBERS, "").split("\n");
for (String s: blockedNumbers) { for (String s : blockedNumbers) {
if (PhoneNumberUtils.compare(number, s)) if (PhoneNumberUtils.compare(number, s))
return true; return true;
} }

View File

@@ -33,7 +33,7 @@ import org.kde.kdeconnect.BackgroundService;
/** /**
* A {@link android.preference.PreferenceActivity} which implements and proxies the necessary calls * A {@link android.preference.PreferenceActivity} which implements and proxies the necessary calls
* to be used with AppCompat. * to be used with AppCompat.
* * <p>
* This technique can be used with an {@link android.app.Activity} class, not just * This technique can be used with an {@link android.app.Activity} class, not just
* {@link android.preference.PreferenceActivity}. * {@link android.preference.PreferenceActivity}.
*/ */

View File

@@ -45,7 +45,7 @@ import java.util.ArrayList;
public class CustomDevicesActivity extends AppCompatActivity { public class CustomDevicesActivity extends AppCompatActivity {
private static final String LOG_ID = "CustomDevicesActivity"; private static final String LOG_ID = "CustomDevicesActivity";
public static final String KEY_CUSTOM_DEVLIST_PREFERENCE = "device_list_preference"; public static final String KEY_CUSTOM_DEVLIST_PREFERENCE = "device_list_preference";
private static final String IP_DELIM = ","; private static final String IP_DELIM = ",";
private ListView list; private ListView list;
@@ -58,7 +58,7 @@ public class CustomDevicesActivity extends AppCompatActivity {
initializeDeviceList(this); initializeDeviceList(this);
setContentView(R.layout.custom_ip_list); setContentView(R.layout.custom_ip_list);
list = (ListView)findViewById(android.R.id.list); list = (ListView) findViewById(android.R.id.list);
list.setOnItemClickListener(onClickListener); list.setOnItemClickListener(onClickListener);
list.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, ipAddressList)); list.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, ipAddressList));
@@ -70,7 +70,7 @@ public class CustomDevicesActivity extends AppCompatActivity {
} }
}); });
EditText ipEntryBox = (EditText)findViewById(R.id.ip_edittext); EditText ipEntryBox = (EditText) findViewById(R.id.ip_edittext);
ipEntryBox.setOnEditorActionListener(new TextView.OnEditorActionListener() { ipEntryBox.setOnEditorActionListener(new TextView.OnEditorActionListener() {
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_SEND) { if (actionId == EditorInfo.IME_ACTION_SEND) {
@@ -126,7 +126,7 @@ public class CustomDevicesActivity extends AppCompatActivity {
}; };
private void addNewDevice() { private void addNewDevice() {
EditText ipEntryBox = (EditText)findViewById(R.id.ip_edittext); EditText ipEntryBox = (EditText) findViewById(R.id.ip_edittext);
String enteredText = ipEntryBox.getText().toString().trim(); String enteredText = ipEntryBox.getText().toString().trim();
if (!enteredText.isEmpty()) { if (!enteredText.isEmpty()) {
// don't add empty string (after trimming) // don't add empty string (after trimming)
@@ -154,14 +154,14 @@ public class CustomDevicesActivity extends AppCompatActivity {
} }
PreferenceManager.getDefaultSharedPreferences(CustomDevicesActivity.this).edit().putString( PreferenceManager.getDefaultSharedPreferences(CustomDevicesActivity.this).edit().putString(
KEY_CUSTOM_DEVLIST_PREFERENCE, serialized).commit(); KEY_CUSTOM_DEVLIST_PREFERENCE, serialized).commit();
((ArrayAdapter)list.getAdapter()).notifyDataSetChanged(); ((ArrayAdapter) list.getAdapter()).notifyDataSetChanged();
} }
public static String serializeIpList(ArrayList<String> ipList) { public static String serializeIpList(ArrayList<String> ipList) {
String serialized = ""; String serialized = "";
for (String ipAddress : ipList) { for (String ipAddress : ipList) {
serialized += IP_DELIM+ipAddress; serialized += IP_DELIM + ipAddress;
} }
// remove first delimiter // remove first delimiter
serialized = serialized.substring(IP_DELIM.length()); serialized = serialized.substring(IP_DELIM.length());
@@ -176,10 +176,10 @@ public class CustomDevicesActivity extends AppCompatActivity {
return ipList; return ipList;
} }
private void initializeDeviceList(Context context){ private void initializeDeviceList(Context context) {
String deviceListPrefs = PreferenceManager.getDefaultSharedPreferences(context).getString( String deviceListPrefs = PreferenceManager.getDefaultSharedPreferences(context).getString(
KEY_CUSTOM_DEVLIST_PREFERENCE, ""); KEY_CUSTOM_DEVLIST_PREFERENCE, "");
if(deviceListPrefs.isEmpty()){ if (deviceListPrefs.isEmpty()) {
PreferenceManager.getDefaultSharedPreferences(context).edit().putString( PreferenceManager.getDefaultSharedPreferences(context).edit().putString(
KEY_CUSTOM_DEVLIST_PREFERENCE, KEY_CUSTOM_DEVLIST_PREFERENCE,
deviceListPrefs).commit(); deviceListPrefs).commit();

View File

@@ -442,7 +442,7 @@ public class DeviceFragment extends Fragment {
public void onServiceStart(BackgroundService service) { public void onServiceStart(BackgroundService service) {
Device dev = service.getDevice(devId); Device dev = service.getDevice(devId);
if (dev == null) { if (dev == null) {
Log.w("rejectPairing", "Device no longer exists: "+devId); Log.w("rejectPairing", "Device no longer exists: " + devId);
return; return;
} }
activity.getSupportActionBar().setTitle(dev.getName()); activity.getSupportActionBar().setTitle(dev.getName());
@@ -465,7 +465,7 @@ public class DeviceFragment extends Fragment {
public void onServiceStart(BackgroundService service) { public void onServiceStart(BackgroundService service) {
Device dev = service.getDevice(devId); Device dev = service.getDevice(devId);
if (dev == null) { if (dev == null) {
Log.w("rejectPairing", "Device no longer exists: "+devId); Log.w("rejectPairing", "Device no longer exists: " + devId);
return; return;
} }
activity.getSupportActionBar().setTitle(dev.getName()); activity.getSupportActionBar().setTitle(dev.getName());
@@ -527,7 +527,7 @@ public class DeviceFragment extends Fragment {
} }
@Override @Override
public PluginClickListener clone(){ public PluginClickListener clone() {
try { try {
return (PluginClickListener) super.clone(); return (PluginClickListener) super.clone();
} catch (CloneNotSupportedException e) { } catch (CloneNotSupportedException e) {

View File

@@ -25,11 +25,11 @@ import android.view.View;
public class CustomItem implements ListAdapter.Item { public class CustomItem implements ListAdapter.Item {
private final View view; private final View view;
public CustomItem(View v) { public CustomItem(View v) {
this.view = v; this.view = v;
} }
@Override @Override
public View inflateView(LayoutInflater layoutInflater) { public View inflateView(LayoutInflater layoutInflater) {

View File

@@ -28,8 +28,8 @@ import org.kde.kdeconnect_tp.R;
public class EntryItem implements ListAdapter.Item { public class EntryItem implements ListAdapter.Item {
protected final String title; protected final String title;
protected final String subtitle; protected final String subtitle;
public EntryItem(String title) { public EntryItem(String title) {
this.title = title; this.title = title;
@@ -37,15 +37,15 @@ public class EntryItem implements ListAdapter.Item {
} }
public EntryItem(String title, String subtitle) { public EntryItem(String title, String subtitle) {
this.title = title; this.title = title;
this.subtitle = subtitle; this.subtitle = subtitle;
} }
@Override @Override
public View inflateView(LayoutInflater layoutInflater) { public View inflateView(LayoutInflater layoutInflater) {
View v = layoutInflater.inflate(R.layout.list_item_entry, null); View v = layoutInflater.inflate(R.layout.list_item_entry, null);
TextView titleView = (TextView)v.findViewById(R.id.list_item_entry_title); TextView titleView = (TextView) v.findViewById(R.id.list_item_entry_title);
if (titleView != null) titleView.setText(title); if (titleView != null) titleView.setText(title);
if (subtitle != null) { if (subtitle != null) {

View File

@@ -34,19 +34,19 @@ public class ListAdapter extends ArrayAdapter<ListAdapter.Item> {
View inflateView(LayoutInflater layoutInflater); View inflateView(LayoutInflater layoutInflater);
} }
private final ArrayList<Item> items; private final ArrayList<Item> items;
private final LayoutInflater layoutInflater; private final LayoutInflater layoutInflater;
public ListAdapter(Context context, ArrayList<Item> items) { public ListAdapter(Context context, ArrayList<Item> items) {
super(context, 0, items); super(context, 0, items);
this.items = items; this.items = items;
layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
} }
@Override @Override
public View getView(int position, View convertView, ViewGroup parent) { public View getView(int position, View convertView, ViewGroup parent) {
final Item i = items.get(position); final Item i = items.get(position);
return i.inflateView(layoutInflater); return i.inflateView(layoutInflater);
} }

View File

@@ -57,7 +57,7 @@ public class PairingDeviceItem implements ListAdapter.Item {
titleView.setText(device.getName()); titleView.setText(device.getName());
if (device.compareProtocolVersion() != 0) { if (device.compareProtocolVersion() != 0) {
TextView summaryView = (TextView)v.findViewById(R.id.list_item_entry_summary); TextView summaryView = (TextView) v.findViewById(R.id.list_item_entry_summary);
if (device.compareProtocolVersion() > 0) { if (device.compareProtocolVersion() > 0) {
summaryView.setText(R.string.protocol_version_newer); summaryView.setText(R.string.protocol_version_newer);

View File

@@ -30,23 +30,23 @@ import org.kde.kdeconnect_tp.R;
public class PluginItem implements ListAdapter.Item { public class PluginItem implements ListAdapter.Item {
private final Plugin plugin; private final Plugin plugin;
private final View.OnClickListener clickListener; private final View.OnClickListener clickListener;
public PluginItem(Plugin p, View.OnClickListener clickListener) { public PluginItem(Plugin p, View.OnClickListener clickListener) {
this.plugin = p; this.plugin = p;
this.clickListener = clickListener; this.clickListener = clickListener;
} }
@Override @Override
public View inflateView(final LayoutInflater layoutInflater) { public View inflateView(final LayoutInflater layoutInflater) {
View v = layoutInflater.inflate(R.layout.list_item_with_icon_entry, null); View v = layoutInflater.inflate(R.layout.list_item_with_icon_entry, null);
TextView titleView = (TextView)v.findViewById(R.id.list_item_entry_title); TextView titleView = (TextView) v.findViewById(R.id.list_item_entry_title);
titleView.setText(plugin.getActionName()); titleView.setText(plugin.getActionName());
ImageView imageView = (ImageView)v.findViewById(R.id.list_item_entry_icon); ImageView imageView = (ImageView) v.findViewById(R.id.list_item_entry_icon);
imageView.setImageDrawable(plugin.getIcon()); imageView.setImageDrawable(plugin.getIcon());
v.setOnClickListener(clickListener); v.setOnClickListener(clickListener);

View File

@@ -28,13 +28,13 @@ import org.kde.kdeconnect_tp.R;
public class SectionItem implements ListAdapter.Item { public class SectionItem implements ListAdapter.Item {
private final String title; private final String title;
public boolean isSectionEmpty; public boolean isSectionEmpty;
public SectionItem(String title) { public SectionItem(String title) {
this.title = title; this.title = title;
this.isSectionEmpty = false; this.isSectionEmpty = false;
} }
@Override @Override
public View inflateView(LayoutInflater layoutInflater) { public View inflateView(LayoutInflater layoutInflater) {

View File

@@ -29,13 +29,13 @@ import org.kde.kdeconnect_tp.R;
public class SmallEntryItem implements ListAdapter.Item { public class SmallEntryItem implements ListAdapter.Item {
private final String title; private final String title;
private final View.OnClickListener clickListener; private final View.OnClickListener clickListener;
public SmallEntryItem(String title) { public SmallEntryItem(String title) {
this.title = title; this.title = title;
this.clickListener = null; this.clickListener = null;
} }
public SmallEntryItem(String title, View.OnClickListener clickListener) { public SmallEntryItem(String title, View.OnClickListener clickListener) {
this.title = title; this.title = title;
@@ -46,7 +46,7 @@ public class SmallEntryItem implements ListAdapter.Item {
public View inflateView(LayoutInflater layoutInflater) { public View inflateView(LayoutInflater layoutInflater) {
View v = layoutInflater.inflate(android.R.layout.simple_list_item_1, null); View v = layoutInflater.inflate(android.R.layout.simple_list_item_1, null);
TextView titleView = (TextView)v.findViewById(android.R.id.text1); TextView titleView = (TextView) v.findViewById(android.R.id.text1);
if (titleView != null) { if (titleView != null) {
titleView.setText(title); titleView.setText(title);
if (clickListener != null) { if (clickListener != null) {

View File

@@ -114,7 +114,7 @@ public class MaterialActivity extends AppCompatActivity {
} else if (getIntent().hasExtra("deviceId")) { } else if (getIntent().hasExtra("deviceId")) {
Log.i("MaterialActivity", "Loading selected device from parameter"); Log.i("MaterialActivity", "Loading selected device from parameter");
savedDevice = getIntent().getStringExtra("deviceId"); savedDevice = getIntent().getStringExtra("deviceId");
if(getIntent().hasExtra(PAIR_REQUEST_STATUS)){ if (getIntent().hasExtra(PAIR_REQUEST_STATUS)) {
pairStatus = getIntent().getStringExtra(PAIR_REQUEST_STATUS); pairStatus = getIntent().getStringExtra(PAIR_REQUEST_STATUS);
} }
} else if (savedInstanceState != null) { } else if (savedInstanceState != null) {
@@ -126,7 +126,7 @@ public class MaterialActivity extends AppCompatActivity {
} }
//if pairStatus is not empty, then the decision has been made... //if pairStatus is not empty, then the decision has been made...
if (!pairStatus.equals("")) { if (!pairStatus.equals("")) {
Log.i("MaterialActivity", "pair status is "+pairStatus); Log.i("MaterialActivity", "pair status is " + pairStatus);
onNewDeviceSelected(savedDevice, pairStatus); onNewDeviceSelected(savedDevice, pairStatus);
} }
onDeviceSelected(savedDevice); onDeviceSelected(savedDevice);
@@ -134,7 +134,7 @@ public class MaterialActivity extends AppCompatActivity {
//like onNewDeviceSelected but assumes that the new device is simply requesting to be paired //like onNewDeviceSelected but assumes that the new device is simply requesting to be paired
//and can't be null //and can't be null
private void onNewDeviceSelected(String deviceId, String pairStatus){ private void onNewDeviceSelected(String deviceId, String pairStatus) {
mCurrentDevice = deviceId; mCurrentDevice = deviceId;
preferences.edit().putString(STATE_SELECTED_DEVICE, mCurrentDevice).apply(); preferences.edit().putString(STATE_SELECTED_DEVICE, mCurrentDevice).apply();

View File

@@ -73,7 +73,6 @@ public class PairingFragment extends Fragment implements PairingDeviceItem.Callb
mActivity.getSupportActionBar().setTitle(R.string.pairing_title); mActivity.getSupportActionBar().setTitle(R.string.pairing_title);
setHasOptionsMenu(true); setHasOptionsMenu(true);
rootView = inflater.inflate(R.layout.activity_refresh_list, container, false); rootView = inflater.inflate(R.layout.activity_refresh_list, container, false);
@@ -113,7 +112,10 @@ public class PairingFragment extends Fragment implements PairingDeviceItem.Callb
new Thread(new Runnable() { new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
try { Thread.sleep(1500); } catch (InterruptedException ignored) { } try {
Thread.sleep(1500);
} catch (InterruptedException ignored) {
}
mActivity.runOnUiThread(new Runnable() { mActivity.runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {

View File

@@ -68,7 +68,7 @@ public class DeviceTest extends AndroidTestCase {
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(2048); keyGen.initialize(2048);
keyPair = keyGen.genKeyPair(); keyPair = keyGen.genKeyPair();
} catch(Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
Log.e("KDE/initializeRsaKeys", "Exception"); Log.e("KDE/initializeRsaKeys", "Exception");
return; return;
@@ -84,7 +84,7 @@ public class DeviceTest extends AndroidTestCase {
editor.apply(); editor.apply();
SharedPreferences preferences = context.getSharedPreferences("trusted_devices", Context.MODE_PRIVATE); SharedPreferences preferences = context.getSharedPreferences("trusted_devices", Context.MODE_PRIVATE);
preferences.edit().putBoolean(deviceId,true).apply(); preferences.edit().putBoolean(deviceId, true).apply();
} }
@@ -110,7 +110,7 @@ public class DeviceTest extends AndroidTestCase {
} }
// Basic paired device testing // Basic paired device testing
public void testDevice(){ public void testDevice() {
Device device = new Device(getContext(), "testDevice"); Device device = new Device(getContext(), "testDevice");
@@ -123,7 +123,7 @@ public class DeviceTest extends AndroidTestCase {
// Testing pairing done using reflection since it is private // Testing pairing done using reflection since it is private
// Created an unpaired device inside this test // Created an unpaired device inside this test
public void testPairingDone(){ public void testPairingDone() {
NetworkPackage fakeNetworkPackage = new NetworkPackage(NetworkPackage.PACKAGE_TYPE_IDENTITY); NetworkPackage fakeNetworkPackage = new NetworkPackage(NetworkPackage.PACKAGE_TYPE_IDENTITY);
fakeNetworkPackage.set("deviceId", "unpairedTestDevice"); fakeNetworkPackage.set("deviceId", "unpairedTestDevice");
@@ -143,7 +143,7 @@ public class DeviceTest extends AndroidTestCase {
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(2048); keyGen.initialize(2048);
keyPair = keyGen.genKeyPair(); keyPair = keyGen.genKeyPair();
} catch(Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
Log.e("KDE/initializeRsaKeys", "Exception"); Log.e("KDE/initializeRsaKeys", "Exception");
return; return;
@@ -162,7 +162,7 @@ public class DeviceTest extends AndroidTestCase {
method = Device.class.getDeclaredMethod("pairingDone"); method = Device.class.getDeclaredMethod("pairingDone");
method.setAccessible(true); method.setAccessible(true);
method.invoke(device); method.invoke(device);
}catch (Exception e){ } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
@@ -171,7 +171,7 @@ public class DeviceTest extends AndroidTestCase {
SharedPreferences preferences = getContext().getSharedPreferences("trusted_devices", Context.MODE_PRIVATE); SharedPreferences preferences = getContext().getSharedPreferences("trusted_devices", Context.MODE_PRIVATE);
assertEquals(preferences.getBoolean(device.getDeviceId(), false), true); assertEquals(preferences.getBoolean(device.getDeviceId(), false), true);
SharedPreferences settings = getContext().getSharedPreferences(device.getDeviceId(),Context.MODE_PRIVATE); SharedPreferences settings = getContext().getSharedPreferences(device.getDeviceId(), Context.MODE_PRIVATE);
assertEquals(settings.getString("deviceName", "Unknown device"), "Unpaired Test Device"); assertEquals(settings.getString("deviceName", "Unknown device"), "Unpaired Test Device");
assertEquals(settings.getString("deviceType", "tablet"), "phone"); assertEquals(settings.getString("deviceType", "tablet"), "phone");
@@ -181,13 +181,13 @@ public class DeviceTest extends AndroidTestCase {
} }
public void testPairingDoneWithCertificate() throws Exception{ public void testPairingDoneWithCertificate() throws Exception {
KeyPair keyPair = null; KeyPair keyPair = null;
try { try {
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(2048); keyGen.initialize(2048);
keyPair = keyGen.genKeyPair(); keyPair = keyGen.genKeyPair();
} catch(Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
Log.e("KDE/initializeRsaKeys", "Exception"); Log.e("KDE/initializeRsaKeys", "Exception");
} }
@@ -214,7 +214,7 @@ public class DeviceTest extends AndroidTestCase {
ContentSigner contentSigner = new JcaContentSignerBuilder("SHA256WithRSAEncryption").setProvider(BC).build(keyPair.getPrivate()); ContentSigner contentSigner = new JcaContentSignerBuilder("SHA256WithRSAEncryption").setProvider(BC).build(keyPair.getPrivate());
certificate = new JcaX509CertificateConverter().setProvider(BC).getCertificate(certificateBuilder.build(contentSigner)); certificate = new JcaX509CertificateConverter().setProvider(BC).getCertificate(certificateBuilder.build(contentSigner));
} catch(Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
Log.e("KDE/initialiseCert", "Exception"); Log.e("KDE/initialiseCert", "Exception");
} }
@@ -246,7 +246,7 @@ public class DeviceTest extends AndroidTestCase {
method = Device.class.getDeclaredMethod("pairingDone"); method = Device.class.getDeclaredMethod("pairingDone");
method.setAccessible(true); method.setAccessible(true);
method.invoke(device); method.invoke(device);
}catch (Exception e){ } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
@@ -255,7 +255,7 @@ public class DeviceTest extends AndroidTestCase {
SharedPreferences preferences = getContext().getSharedPreferences("trusted_devices", Context.MODE_PRIVATE); SharedPreferences preferences = getContext().getSharedPreferences("trusted_devices", Context.MODE_PRIVATE);
assertEquals(preferences.getBoolean(device.getDeviceId(), false), true); assertEquals(preferences.getBoolean(device.getDeviceId(), false), true);
SharedPreferences settings = getContext().getSharedPreferences(device.getDeviceId(),Context.MODE_PRIVATE); SharedPreferences settings = getContext().getSharedPreferences(device.getDeviceId(), Context.MODE_PRIVATE);
assertEquals(settings.getString("deviceName", "Unknown device"), "Unpaired Test Device"); assertEquals(settings.getString("deviceName", "Unknown device"), "Unpaired Test Device");
assertEquals(settings.getString("deviceType", "tablet"), "phone"); assertEquals(settings.getString("deviceType", "tablet"), "phone");
@@ -264,7 +264,7 @@ public class DeviceTest extends AndroidTestCase {
settings.edit().clear().apply(); settings.edit().clear().apply();
} }
public void testUnpair(){ public void testUnpair() {
Device device = new Device(getContext(), "testDevice"); Device device = new Device(getContext(), "testDevice");

View File

@@ -50,7 +50,7 @@ public class LanLinkProviderTest extends AndroidTestCase {
} }
public void testIdentityPackageReceived() throws Exception{ public void testIdentityPackageReceived() throws Exception {
NetworkPackage networkPackage = Mockito.mock(NetworkPackage.class); NetworkPackage networkPackage = Mockito.mock(NetworkPackage.class);
Mockito.when(networkPackage.getType()).thenReturn("kdeconnect.identity"); Mockito.when(networkPackage.getType()).thenReturn("kdeconnect.identity");
@@ -67,7 +67,7 @@ public class LanLinkProviderTest extends AndroidTestCase {
Method method = LanLinkProvider.class.getDeclaredMethod("identityPackageReceived", NetworkPackage.class, Socket.class, LanLink.ConnectionStarted.class); Method method = LanLinkProvider.class.getDeclaredMethod("identityPackageReceived", NetworkPackage.class, Socket.class, LanLink.ConnectionStarted.class);
method.setAccessible(true); method.setAccessible(true);
method.invoke(linkProvider, networkPackage, channel, LanLink.ConnectionStarted.Locally); method.invoke(linkProvider, networkPackage, channel, LanLink.ConnectionStarted.Locally);
}catch (Exception e){ } catch (Exception e) {
throw e; throw e;
} }
@@ -75,8 +75,8 @@ public class LanLinkProviderTest extends AndroidTestCase {
try { try {
Field field = LanLinkProvider.class.getDeclaredField("visibleComputers"); Field field = LanLinkProvider.class.getDeclaredField("visibleComputers");
field.setAccessible(true); field.setAccessible(true);
visibleComputers = (HashMap<String, LanLink>)field.get(linkProvider); visibleComputers = (HashMap<String, LanLink>) field.get(linkProvider);
}catch (Exception e){ } catch (Exception e) {
throw e; throw e;
} }
assertNotNull(visibleComputers.get("testDevice")); assertNotNull(visibleComputers.get("testDevice"));

View File

@@ -110,23 +110,23 @@ public class LanLinkTest extends AndroidTestCase {
} }
public void testSendPayload() throws Exception{ public void testSendPayload() throws Exception {
class Downloader extends Thread { class Downloader extends Thread {
NetworkPackage np; NetworkPackage np;
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
public void setNetworkPackage(NetworkPackage networkPackage){ public void setNetworkPackage(NetworkPackage networkPackage) {
this.np = networkPackage; this.np = networkPackage;
} }
public ByteArrayOutputStream getOutputStream(){ public ByteArrayOutputStream getOutputStream() {
return outputStream; return outputStream;
} }
@Override @Override
public void run(){ public void run() {
try { try {
Socket socket = null; Socket socket = null;
@@ -137,7 +137,11 @@ public class LanLinkTest extends AndroidTestCase {
socket.connect(new InetSocketAddress(address.getAddress(), tcpPort)); socket.connect(new InetSocketAddress(address.getAddress(), tcpPort));
np.setPayload(socket.getInputStream(), np.getPayloadSize()); np.setPayload(socket.getInputStream(), np.getPayloadSize());
} catch (Exception e) { } catch (Exception e) {
try { socket.close(); } catch(Exception ignored) { throw ignored; } try {
socket.close();
} catch (Exception ignored) {
throw ignored;
}
e.printStackTrace(); e.printStackTrace();
Log.e("KDE/LanLinkTest", "Exception connecting to remote socket"); Log.e("KDE/LanLinkTest", "Exception connecting to remote socket");
throw e; throw e;
@@ -164,7 +168,7 @@ public class LanLinkTest extends AndroidTestCase {
outputStream.close(); outputStream.close();
input.close(); input.close();
} catch(Exception e) { } catch (Exception e) {
Log.e("Downloader Test", "Exception"); Log.e("Downloader Test", "Exception");
e.printStackTrace(); e.printStackTrace();
} }
@@ -175,15 +179,15 @@ public class LanLinkTest extends AndroidTestCase {
final Downloader downloader = new Downloader(); final Downloader downloader = new Downloader();
// Using byte array for payload, try to use input stream as used in real device // Using byte array for payload, try to use input stream as used in real device
String dataString = "Lorem ipsum dolor sit amet, consectetur adipiscing elit."+ String dataString = "Lorem ipsum dolor sit amet, consectetur adipiscing elit." +
" Cras vel erat et ante fringilla tristique. Sed consequat ligula at interdum "+ " Cras vel erat et ante fringilla tristique. Sed consequat ligula at interdum " +
"rhoncus. Integer semper enim felis, id sodales tellus aliquet eget."+ "rhoncus. Integer semper enim felis, id sodales tellus aliquet eget." +
" Sed fringilla ac metus eget dictum. Aliquam euismod non sem sit"+ " Sed fringilla ac metus eget dictum. Aliquam euismod non sem sit" +
" amet dapibus. Interdum et malesuada fames ac ante ipsum primis "+ " amet dapibus. Interdum et malesuada fames ac ante ipsum primis " +
"in faucibus. Nam et ligula placerat, varius justo eu, convallis "+ "in faucibus. Nam et ligula placerat, varius justo eu, convallis " +
"lorem. Nam consequat consequat tortor et gravida. Praesent "+ "lorem. Nam consequat consequat tortor et gravida. Praesent " +
"ultricies tortor eget ex elementum gravida. Suspendisse aliquet "+ "ultricies tortor eget ex elementum gravida. Suspendisse aliquet " +
"erat a orci feugiat dignissim."; "erat a orci feugiat dignissim.";
// reallyLongString contains dataString 16 times // reallyLongString contains dataString 16 times
String reallyLongString = dataString + dataString; String reallyLongString = dataString + dataString;
@@ -217,7 +221,7 @@ public class LanLinkTest extends AndroidTestCase {
Mockito.doAnswer(new Answer() { Mockito.doAnswer(new Answer() {
@Override @Override
public Object answer(InvocationOnMock invocationOnMock) throws Throwable { public Object answer(InvocationOnMock invocationOnMock) throws Throwable {
JSONObject object = (JSONObject)invocationOnMock.getArguments()[0]; JSONObject object = (JSONObject) invocationOnMock.getArguments()[0];
sharePackageJson.put("payloadTransferInfo", object); sharePackageJson.put("payloadTransferInfo", object);
return null; return null;
@@ -228,8 +232,8 @@ public class LanLinkTest extends AndroidTestCase {
@Override @Override
public Object answer(InvocationOnMock invocationOnMock) throws Throwable { public Object answer(InvocationOnMock invocationOnMock) throws Throwable {
Log.e("LanLinkTest","Write to stream"); Log.e("LanLinkTest", "Write to stream");
String stringNetworkPackage = new String((byte[])invocationOnMock.getArguments()[0]); String stringNetworkPackage = new String((byte[]) invocationOnMock.getArguments()[0]);
final NetworkPackage np = NetworkPackage.unserialize(stringNetworkPackage); final NetworkPackage np = NetworkPackage.unserialize(stringNetworkPackage);
downloader.setNetworkPackage(np); downloader.setNetworkPackage(np);
@@ -243,8 +247,8 @@ public class LanLinkTest extends AndroidTestCase {
try { try {
// Wait 1 secs for downloader to finish (if some error, it will continue and assert will fail) // Wait 1 secs for downloader to finish (if some error, it will continue and assert will fail)
downloader.join(1*1000); downloader.join(1 * 1000);
}catch (Exception e){ } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
throw e; throw e;
} }

View File

@@ -32,7 +32,7 @@ import java.security.KeyPairGenerator;
import java.security.PrivateKey; import java.security.PrivateKey;
import java.security.PublicKey; import java.security.PublicKey;
public class NetworkPackageTest extends AndroidTestCase{ public class NetworkPackageTest extends AndroidTestCase {
@Override @Override
protected void setUp() throws Exception { protected void setUp() throws Exception {
@@ -67,14 +67,14 @@ public class NetworkPackageTest extends AndroidTestCase{
String json = "{\"id\":123,\"type\":\"test\",\"body\":{\"testing\":true}}"; String json = "{\"id\":123,\"type\":\"test\",\"body\":{\"testing\":true}}";
np2 = NetworkPackage.unserialize(json); np2 = NetworkPackage.unserialize(json);
assertEquals(np2.getId(),123); assertEquals(np2.getId(), 123);
assertEquals(np2.getBoolean("testing"), true); assertEquals(np2.getBoolean("testing"), true);
assertEquals(np2.getBoolean("not_testing"), false); assertEquals(np2.getBoolean("not_testing"), false);
assertEquals(np2.getBoolean("not_testing", true), true); assertEquals(np2.getBoolean("not_testing", true), true);
} }
public void testIdentity(){ public void testIdentity() {
NetworkPackage np = NetworkPackage.createIdentityPackage(getContext()); NetworkPackage np = NetworkPackage.createIdentityPackage(getContext());
@@ -95,7 +95,7 @@ public class NetworkPackageTest extends AndroidTestCase{
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(2048); keyGen.initialize(2048);
keyPair = keyGen.genKeyPair(); keyPair = keyGen.genKeyPair();
} catch(Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
Log.e("KDE/initializeRsaKeys", "Exception"); Log.e("KDE/initializeRsaKeys", "Exception");
return; return;
@@ -110,13 +110,13 @@ public class NetworkPackageTest extends AndroidTestCase{
// Encrypt and decrypt np // Encrypt and decrypt np
assertEquals(original.getType(), "com.test"); assertEquals(original.getType(), "com.test");
try { try {
NetworkPackage encrypted = RsaHelper.encrypt(original,publicKey); NetworkPackage encrypted = RsaHelper.encrypt(original, publicKey);
assertEquals(encrypted.getType(), NetworkPackage.PACKAGE_TYPE_ENCRYPTED); assertEquals(encrypted.getType(), NetworkPackage.PACKAGE_TYPE_ENCRYPTED);
decrypted = RsaHelper.decrypt(encrypted, privateKey); decrypted = RsaHelper.decrypt(encrypted, privateKey);
assertEquals(decrypted.getType(), "com.test"); assertEquals(decrypted.getType(), "com.test");
}catch (Exception e){ } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
@@ -132,7 +132,7 @@ public class NetworkPackageTest extends AndroidTestCase{
decrypted = RsaHelper.decrypt(encrypted, privateKey); decrypted = RsaHelper.decrypt(encrypted, privateKey);
String decryptedJson = decrypted.serialize(); String decryptedJson = decrypted.serialize();
JSONAssert.assertEquals(json, decryptedJson, true); JSONAssert.assertEquals(json, decryptedJson, true);
}catch (Exception e){ } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
} }