Refactoring
10
README.md
|
@ -1,8 +1,8 @@
|
|||
NoWOL
|
||||
### NoWOL
|
||||
|
||||
![License](https://img.shields.io/badge/License-GPLv3-blue.svg)
|
||||
|
||||
Android application to rule PC power management. A part of NoWOL project.
|
||||
[https://developersu.blogspot.com/2018/04/nowol-2.html](https://developersu.blogspot.com/2018/04/nowol-2.html)
|
||||
|
||||
License: GNU GPL v.3.
|
||||
|
||||
Dmitry Isaenko
|
||||
2017, Russia
|
||||
2017-2020, Russia
|
||||
|
|
|
@ -4,11 +4,11 @@ android {
|
|||
compileSdkVersion 29
|
||||
buildToolsVersion "29.0.2"
|
||||
defaultConfig {
|
||||
applicationId "com.blogspot.developersu.nowol.nowol"
|
||||
applicationId "com.blogspot.developersu.nowol"
|
||||
minSdkVersion 14
|
||||
targetSdkVersion 29
|
||||
versionCode 4
|
||||
versionName "4.0"
|
||||
versionCode 5
|
||||
versionName "5.0"
|
||||
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
||||
vectorDrawables.useSupportLibrary = true
|
||||
}
|
||||
|
@ -18,6 +18,10 @@ android {
|
|||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||
}
|
||||
}
|
||||
compileOptions {
|
||||
sourceCompatibility JavaVersion.VERSION_1_8
|
||||
targetCompatibility JavaVersion.VERSION_1_8
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.blogspot.developersu.nowol.nowol">
|
||||
package="com.blogspot.developersu.nowol">
|
||||
|
||||
<!--
|
||||
<permission android:name="com.blogspot.developersu.nowol.nowol"
|
||||
|
@ -12,12 +12,11 @@
|
|||
android:allowBackup="true"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:label="@string/app_name"
|
||||
android:supportsRtl="true"
|
||||
android:resizeableActivity="true"
|
||||
android:supportsPictureInPicture="true"
|
||||
android:usesCleartextTraffic="true"
|
||||
android:theme="@style/AppTheme">
|
||||
|
||||
android:supportsRtl="true"
|
||||
android:theme="@style/AppTheme"
|
||||
android:usesCleartextTraffic="true">
|
||||
|
||||
<activity android:name=".MainActivity">
|
||||
<intent-filter>
|
||||
|
@ -26,8 +25,8 @@
|
|||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<!---->
|
||||
<receiver android:name=".com.blogspot.developersu.nowol.nowol.widget.NoWolWidget">
|
||||
|
||||
<receiver android:name=".widget.NoWolWidget">
|
||||
<intent-filter>
|
||||
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
|
||||
</intent-filter>
|
||||
|
@ -41,7 +40,7 @@
|
|||
android:name=".SendRequestService"
|
||||
android:exported="false" />
|
||||
|
||||
<activity android:name=".com.blogspot.developersu.nowol.nowol.widget.WidgetConfigurator">
|
||||
<activity android:name=".widget.WidgetConfigurator">
|
||||
<intent-filter>
|
||||
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
|
||||
</intent-filter>
|
||||
|
|
BIN
app/src/main/ic_launcher-web.png
Normal file
After Width: | Height: | Size: 4.9 KiB |
|
@ -0,0 +1,218 @@
|
|||
/*
|
||||
Copyright 2017-2020 Dmitry Isaenko
|
||||
|
||||
This file is part of NoWOL.
|
||||
|
||||
NoWOL is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
NoWOL is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with NoWOL. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.blogspot.developersu.nowol;
|
||||
|
||||
import android.app.Dialog;
|
||||
import android.appwidget.AppWidgetManager;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Handler;
|
||||
import android.os.ResultReceiver;
|
||||
import android.os.Bundle;
|
||||
import android.text.Editable;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
import android.widget.TextView;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import com.blogspot.developersu.nowol.widget.NoWolWidget;
|
||||
import com.google.android.material.snackbar.Snackbar;
|
||||
|
||||
import static com.blogspot.developersu.nowol.ServerReplies.*;
|
||||
|
||||
public class MainActivity extends AppCompatActivity {
|
||||
private TextView hostAddress,
|
||||
statusLbl;
|
||||
|
||||
private Intent SendRequestIntent;
|
||||
|
||||
private int status = -2;
|
||||
|
||||
private SharedPreferences settings;
|
||||
|
||||
private class MyResultReciever extends ResultReceiver{
|
||||
|
||||
MyResultReciever(Handler handler) {
|
||||
super(handler);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onReceiveResult(int resultCode, Bundle resultData) {
|
||||
super.onReceiveResult(resultCode, resultData);
|
||||
status = resultCode;
|
||||
updateServerStatusText(resultCode);
|
||||
showSnackBarNotice(resultCode);
|
||||
}
|
||||
}
|
||||
|
||||
private void doRequest(String url) {
|
||||
SendRequestIntent.putExtra("url", url);
|
||||
startService(SendRequestIntent);
|
||||
}
|
||||
|
||||
private void inform(String textToShow){
|
||||
Snackbar.make(findViewById(android.R.id.content), textToShow, Snackbar.LENGTH_SHORT).show();
|
||||
}
|
||||
|
||||
// provide toolbar options
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu){
|
||||
MenuInflater infMenu = getMenuInflater();
|
||||
infMenu.inflate(R.menu.toolbar_main, menu);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onSaveInstanceState(Bundle outState) {
|
||||
super.onSaveInstanceState(outState);
|
||||
outState.putInt("STATE", status);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onCreate(final Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_main);
|
||||
|
||||
MyResultReciever myReciever = new MyResultReciever(null);
|
||||
SendRequestIntent = new Intent(this, SendRequestService.class);
|
||||
SendRequestIntent.putExtra("receiver", myReciever);
|
||||
|
||||
// toolbar setup start
|
||||
Toolbar toolBar = findViewById(R.id.toolbar);
|
||||
setSupportActionBar(toolBar);
|
||||
getSupportActionBar();
|
||||
// toolbar setup end
|
||||
|
||||
hostAddress = findViewById(R.id.hostNameStaticMain);
|
||||
statusLbl = findViewById(R.id.statusTxtMainAct);
|
||||
|
||||
if (savedInstanceState != null){
|
||||
status = savedInstanceState.getInt("STATE");
|
||||
updateServerStatusText(status);
|
||||
}
|
||||
|
||||
Button powerBtn = findViewById(R.id.pwrBntMainAct);
|
||||
Button power5Btn = findViewById(R.id.pwr5BntMainAct);
|
||||
Button resetBtn = findViewById(R.id.resBntMainAct);
|
||||
// Set request queue for Volley
|
||||
|
||||
settings = getSharedPreferences("NoWolPreferences", MODE_PRIVATE);
|
||||
hostAddress.setText(settings.getString("Host", getResources().getString(R.string.hostNameDefault)));
|
||||
|
||||
final Button.OnClickListener ActionButtonsListener = event -> {
|
||||
switch (event.getId()) {
|
||||
case R.id.pwrBntMainAct:
|
||||
doRequest(hostAddress.getText().toString() + "/?POWER0=on");
|
||||
break;
|
||||
case R.id.pwr5BntMainAct:
|
||||
doRequest(hostAddress.getText().toString() + "/?POWER1=on");
|
||||
break;
|
||||
case R.id.resBntMainAct:
|
||||
doRequest(hostAddress.getText().toString() + "/?RESET=on");
|
||||
}
|
||||
};
|
||||
// RequestQueue
|
||||
powerBtn.setOnClickListener(ActionButtonsListener);
|
||||
power5Btn.setOnClickListener(ActionButtonsListener);
|
||||
resetBtn.setOnClickListener(ActionButtonsListener);
|
||||
}
|
||||
|
||||
private void updateServerStatusText(int status){
|
||||
switch (status) {
|
||||
case STATE_ON:
|
||||
statusLbl.setText(getResources().getString(R.string.statusOnline));
|
||||
statusLbl.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimaryDark));
|
||||
break;
|
||||
case STATE_OFF:
|
||||
statusLbl.setText(getResources().getString(R.string.statusOffline));
|
||||
statusLbl.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.colorRed));
|
||||
break;
|
||||
case STATE_UNKNOWN:
|
||||
statusLbl.setText(getResources().getString(R.string.noResponse));
|
||||
statusLbl.setTextColor(hostAddress.getTextColors());
|
||||
break;
|
||||
}
|
||||
}
|
||||
private void showSnackBarNotice(int status) {
|
||||
switch (status) {
|
||||
case STATE_ON:
|
||||
inform(getResources().getString(R.string.statusOnline));
|
||||
break;
|
||||
case STATE_OFF:
|
||||
inform(getResources().getString(R.string.statusOffline));
|
||||
break;
|
||||
case STATE_UNKNOWN:
|
||||
inform(getResources().getString(R.string.noResponse) + hostAddress.getText().toString());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item){
|
||||
switch (item.getItemId()){
|
||||
case R.id.refreshMenu: /* Button requests status */
|
||||
doRequest(hostAddress.getText().toString());
|
||||
break;
|
||||
case R.id.changeHostMenu: /* Button requests pop-up window */
|
||||
showSettingsDialog();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private void showSettingsDialog(){
|
||||
final Dialog dialog = new Dialog(this);
|
||||
dialog.setContentView(R.layout.settings_popup);
|
||||
dialog.setTitle(getString(R.string.popupTitle));
|
||||
EditText input = (EditText) dialog.findViewById(R.id.input);
|
||||
input.setText(hostAddress.getText());
|
||||
Button confirmButton = (Button) dialog.findViewById(R.id.confirm);
|
||||
confirmButton.setOnClickListener(event -> {
|
||||
updateAllUsingNewIp(input.getText());
|
||||
dialog.dismiss();
|
||||
});
|
||||
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
|
||||
dialog.show();
|
||||
}
|
||||
private void updateAllUsingNewIp(Editable newIpAddress){
|
||||
hostAddress.setText(newIpAddress);
|
||||
// TODO:fix
|
||||
inform(getResources().getString(R.string.hostLblMain) + newIpAddress);
|
||||
settings.edit().putString("Host", newIpAddress.toString()).apply();
|
||||
|
||||
/* Update widgets by sending broadcast intent */
|
||||
Intent updateWidgetIntent = new Intent(this, NoWolWidget.class);
|
||||
updateWidgetIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
|
||||
|
||||
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this);
|
||||
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(this, NoWolWidget.class));
|
||||
updateWidgetIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
|
||||
sendBroadcast(updateWidgetIntent);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
stopService(SendRequestIntent); // just in case
|
||||
}
|
||||
}
|
|
@ -0,0 +1,98 @@
|
|||
/*
|
||||
Copyright 2017-2020 Dmitry Isaenko
|
||||
|
||||
This file is part of NoWOL.
|
||||
|
||||
NoWOL is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
NoWOL is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with NoWOL. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.blogspot.developersu.nowol;
|
||||
|
||||
import android.app.IntentService;
|
||||
import android.appwidget.AppWidgetManager;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.os.ResultReceiver;
|
||||
import android.widget.RemoteViews;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import com.android.volley.Request;
|
||||
import com.android.volley.RequestQueue;
|
||||
import com.android.volley.toolbox.StringRequest;
|
||||
import com.android.volley.toolbox.Volley;
|
||||
|
||||
import static com.blogspot.developersu.nowol.ServerReplies.*;
|
||||
|
||||
public class SendRequestService extends IntentService {
|
||||
|
||||
private ResultReceiver resReceiver;
|
||||
|
||||
public SendRequestService() {
|
||||
super("MyIntentService");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onHandleIntent(Intent intent) {
|
||||
Bundle bundle = intent.getExtras();
|
||||
|
||||
if (bundle == null)
|
||||
return;
|
||||
|
||||
String url = bundle.getString("url");
|
||||
resReceiver = bundle.getParcelable("receiver");
|
||||
final int appWidgetId = bundle.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID);
|
||||
|
||||
RequestQueue queueStd = Volley.newRequestQueue(this);
|
||||
|
||||
StringRequest strRequest = new StringRequest(Request.Method.GET, url, //will be 4 requests
|
||||
response -> {
|
||||
if (response.contains("00c600"))
|
||||
sendData(STATE_ON, appWidgetId);
|
||||
else
|
||||
sendData(STATE_OFF, appWidgetId);
|
||||
}, error -> sendData(STATE_UNKNOWN, appWidgetId));
|
||||
|
||||
queueStd.add(strRequest);
|
||||
}
|
||||
|
||||
private void sendData(int state, int widgetId){
|
||||
final int greenColor = ContextCompat.getColor(this, R.color.colorPrimary);
|
||||
final int redColor = ContextCompat.getColor(this, R.color.colorRed);
|
||||
final int orangeColor = ContextCompat.getColor(this, R.color.colorOrange);
|
||||
|
||||
// MainActivity requested
|
||||
if (widgetId == 0){
|
||||
resReceiver.send(state, null);
|
||||
}
|
||||
|
||||
switch (state){
|
||||
case STATE_ON:
|
||||
setWidgetTextColorIndication(widgetId, getResources().getString(R.string.statusOnline), greenColor);
|
||||
break;
|
||||
case STATE_OFF:
|
||||
setWidgetTextColorIndication(widgetId, getResources().getString(R.string.statusOffline), redColor);
|
||||
break;
|
||||
case STATE_UNKNOWN:
|
||||
setWidgetTextColorIndication(widgetId, getResources().getString(R.string.noResponse), orangeColor);
|
||||
break;
|
||||
}
|
||||
}
|
||||
private void setWidgetTextColorIndication(int widgetId, String text, int color){
|
||||
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this);
|
||||
RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.no_wol_widget);
|
||||
|
||||
remoteViews.setTextViewText(R.id.widgetStatusText, text);
|
||||
remoteViews.setInt(R.id.widgetHeaderLayout, "setBackgroundColor", color);
|
||||
|
||||
appWidgetManager.updateAppWidget(widgetId, remoteViews);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
/*
|
||||
Copyright 2017-2020 Dmitry Isaenko
|
||||
|
||||
This file is part of NoWOL.
|
||||
|
||||
NoWOL is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
NoWOL is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with NoWOL. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.blogspot.developersu.nowol;
|
||||
|
||||
public class ServerReplies {
|
||||
public static final int STATE_ON = 1;
|
||||
public static final int STATE_OFF = 0;
|
||||
public static final int STATE_UNKNOWN = -1;
|
||||
}
|
|
@ -1,205 +0,0 @@
|
|||
package com.blogspot.developersu.nowol.nowol;
|
||||
|
||||
import android.appwidget.AppWidgetManager;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Handler;
|
||||
import android.os.ResultReceiver;
|
||||
import android.os.Bundle;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.TextView;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import com.blogspot.developersu.nowol.nowol.com.blogspot.developersu.nowol.nowol.widget.NoWolWidget;
|
||||
import com.google.android.material.snackbar.Snackbar;
|
||||
|
||||
public class MainActivity extends AppCompatActivity implements popUp.pupUpRetuningValueListener {
|
||||
private TextView hostAddress;
|
||||
private TextView statusLbl;
|
||||
|
||||
Intent SendRequestIntent;
|
||||
|
||||
private int status = -2;
|
||||
|
||||
SharedPreferences.Editor settingsEditor;
|
||||
// define reciever for the data we got from service
|
||||
private class MyResultReciever extends ResultReceiver{
|
||||
|
||||
MyResultReciever(Handler handler) {
|
||||
super(handler);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onReceiveResult(int resultCode, Bundle resultData) {
|
||||
super.onReceiveResult(resultCode, resultData);
|
||||
switch (resultCode) {
|
||||
case 1:
|
||||
inform(getResources().getString(R.string.statusOnline));
|
||||
statusLbl.setText(getResources().getString(R.string.statusOnline));
|
||||
statusLbl.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimaryDark));
|
||||
break;
|
||||
case 0:
|
||||
inform(getResources().getString(R.string.statusOffline));
|
||||
statusLbl.setText(getResources().getString(R.string.statusOffline));
|
||||
statusLbl.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.colorRed));
|
||||
break;
|
||||
case -1:
|
||||
inform(getResources().getString(R.string.noResponse) + hostAddress.getText().toString());
|
||||
statusLbl.setText(getResources().getString(R.string.noResponse));
|
||||
statusLbl.setTextColor(hostAddress.getTextColors());
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
status = resultCode;
|
||||
}
|
||||
}
|
||||
//reciever end
|
||||
private void doRequest(String url) {
|
||||
SendRequestIntent.putExtra("url", url);
|
||||
startService(SendRequestIntent);
|
||||
}
|
||||
|
||||
private void inform(String textToShow){
|
||||
//Toast.makeText(this, textToShow, Toast.LENGTH_SHORT).show();
|
||||
// .setGravity(Gravity.TOP|Gravity.BOTTOM,0,0)
|
||||
Snackbar.make(findViewById(android.R.id.content), textToShow, Snackbar.LENGTH_SHORT).show();
|
||||
// SOME GOODS APPEARS SUDDENLY android.R.id.content gives you the root element of a view, without having to know its actual name/type/ID.
|
||||
}
|
||||
|
||||
// provide toolbar options
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu){
|
||||
MenuInflater infMenu = getMenuInflater();
|
||||
infMenu.inflate(R.menu.toolbar_main, menu);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onSaveInstanceState(Bundle outState) {
|
||||
super.onSaveInstanceState(outState);
|
||||
outState.putInt("STATE", status);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onCreate(final Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_main);
|
||||
|
||||
MyResultReciever myReciever = new MyResultReciever(null);
|
||||
SendRequestIntent = new Intent(this, SendRequestService.class);
|
||||
SendRequestIntent.putExtra("reciever", myReciever);
|
||||
|
||||
// toolbar setup start
|
||||
Toolbar toolBar = findViewById(R.id.toolbar);
|
||||
setSupportActionBar(toolBar);
|
||||
getSupportActionBar();
|
||||
// toolbar setup end
|
||||
|
||||
hostAddress = findViewById(R.id.hostNameStaticMain);
|
||||
statusLbl = findViewById(R.id.statusTxtMainAct);
|
||||
|
||||
if (savedInstanceState != null){
|
||||
status = savedInstanceState.getInt("STATE");
|
||||
switch (status) {
|
||||
case 1:
|
||||
inform(getResources().getString(R.string.statusOnline));
|
||||
statusLbl.setText(getResources().getString(R.string.statusOnline));
|
||||
statusLbl.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimaryDark));
|
||||
break;
|
||||
case 0:
|
||||
inform(getResources().getString(R.string.statusOffline));
|
||||
statusLbl.setText(getResources().getString(R.string.statusOffline));
|
||||
statusLbl.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.colorRed));
|
||||
break;
|
||||
case -1:
|
||||
inform(getResources().getString(R.string.noResponse) + hostAddress.getText().toString());
|
||||
statusLbl.setText(getResources().getString(R.string.noResponse));
|
||||
statusLbl.setTextColor(hostAddress.getTextColors());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Button powerBtn = findViewById(R.id.pwrBntMainAct);
|
||||
Button power5Btn = findViewById(R.id.pwr5BntMainAct);
|
||||
Button resetBtn = findViewById(R.id.resBntMainAct);
|
||||
// Set request queue for Volley
|
||||
|
||||
|
||||
SharedPreferences settings = getSharedPreferences("NoWolPreferences", MODE_PRIVATE);
|
||||
hostAddress.setText(settings.getString("Host", getResources().getString(R.string.hostNameDefault)));
|
||||
settingsEditor = settings.edit();
|
||||
|
||||
final Button.OnClickListener ActionButtonsListener = new Button.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
switch (v.getId()) {
|
||||
case R.id.pwrBntMainAct:
|
||||
doRequest(hostAddress.getText().toString() + "/?POWER0=on");
|
||||
break;
|
||||
case R.id.pwr5BntMainAct:
|
||||
doRequest(hostAddress.getText().toString() + "/?POWER1=on");
|
||||
break;
|
||||
case R.id.resBntMainAct:
|
||||
doRequest(hostAddress.getText().toString() + "/?RESET=on");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
// RequestQueue
|
||||
powerBtn.setOnClickListener(ActionButtonsListener);
|
||||
power5Btn.setOnClickListener(ActionButtonsListener);
|
||||
resetBtn.setOnClickListener(ActionButtonsListener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFinishEdit (String hostNameReSet){
|
||||
hostAddress.setText(hostNameReSet);
|
||||
inform(getResources().getString(R.string.hostLblMain) + hostNameReSet);
|
||||
settingsEditor.putString("Host", hostNameReSet);
|
||||
settingsEditor.commit();
|
||||
/*
|
||||
Update widgets by sending broadcast intent
|
||||
*/
|
||||
Intent updateWidgetIntent = new Intent(this, NoWolWidget.class);
|
||||
updateWidgetIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
|
||||
|
||||
AppWidgetManager awm = AppWidgetManager.getInstance(this);
|
||||
int[] IDs = awm.getAppWidgetIds(new ComponentName(this, NoWolWidget.class));
|
||||
updateWidgetIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, IDs);
|
||||
getApplicationContext().sendBroadcast(updateWidgetIntent);
|
||||
/*
|
||||
broadcast end
|
||||
*/
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item){
|
||||
switch (item.getItemId()){
|
||||
case R.id.refreshMenu: /* Button requests status */
|
||||
doRequest(hostAddress.getText().toString());
|
||||
break;
|
||||
case R.id.changeHostMenu: /* Button requests pop-up window */
|
||||
popUp N = popUp.newInstance(hostAddress.getText());
|
||||
N.show(this.getSupportFragmentManager(), "tst");
|
||||
break;
|
||||
default:
|
||||
//onOptionsItemSelected(item);
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
stopService(SendRequestIntent); // just in case
|
||||
}
|
||||
}
|
|
@ -1,92 +0,0 @@
|
|||
package com.blogspot.developersu.nowol.nowol;
|
||||
|
||||
import android.app.IntentService;
|
||||
import android.appwidget.AppWidgetManager;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.os.ResultReceiver;
|
||||
import android.widget.RemoteViews;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import com.android.volley.Request;
|
||||
import com.android.volley.RequestQueue;
|
||||
import com.android.volley.Response;
|
||||
import com.android.volley.VolleyError;
|
||||
import com.android.volley.toolbox.StringRequest;
|
||||
import com.android.volley.toolbox.Volley;
|
||||
|
||||
|
||||
public class SendRequestService extends IntentService {
|
||||
|
||||
private static final int STATE_ON = 1;
|
||||
private static final int STATE_OFF = 0;
|
||||
private static final int STATE_UNKNOWN = -1;
|
||||
|
||||
private ResultReceiver resReceiver;
|
||||
|
||||
public SendRequestService() {
|
||||
super("MyIntentService");
|
||||
}
|
||||
|
||||
private void sendData(int state, int awID){
|
||||
// MainActivity requested
|
||||
if (awID == 0) {
|
||||
// Log.d("qwerty1212", "MainActivity case. Status = " + Integer.toString(state) + " awID = " + Integer.toString(awID));
|
||||
resReceiver.send(state, null);
|
||||
}
|
||||
|
||||
RemoteViews rv = new RemoteViews(getPackageName(), R.layout.no_wol_widget);
|
||||
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this);
|
||||
|
||||
switch (state){
|
||||
case STATE_ON:
|
||||
rv.setTextViewText(R.id.widgetStatusText, getResources().getString(R.string.statusOnline));
|
||||
rv.setInt(R.id.widgetHeaderLayout, "setBackgroundColor", ContextCompat.getColor(this, R.color.colorPrimary));
|
||||
// Log.d("qwerty1212", "case 1 widget");
|
||||
break;
|
||||
case STATE_OFF:
|
||||
rv.setTextViewText(R.id.widgetStatusText, getResources().getString(R.string.statusOffline));
|
||||
rv.setInt(R.id.widgetHeaderLayout, "setBackgroundColor", ContextCompat.getColor(this, R.color.colorRed));
|
||||
// Log.d("qwerty1212", "case 0 widget");
|
||||
break;
|
||||
case STATE_UNKNOWN:
|
||||
rv.setTextViewText(R.id.widgetStatusText, getResources().getString(R.string.noResponse));
|
||||
rv.setInt(R.id.widgetHeaderLayout, "setBackgroundColor", ContextCompat.getColor(this, R.color.colorOrange));
|
||||
// Log.d("qwerty1212", "case -1 widget");
|
||||
break;
|
||||
}
|
||||
appWidgetManager.updateAppWidget(awID, rv);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onHandleIntent(Intent intent) {
|
||||
if (intent == null)
|
||||
return;
|
||||
|
||||
// Log.d("service", "Got intent");
|
||||
Bundle bndle = intent.getExtras();
|
||||
String url = bndle.getString("url");
|
||||
resReceiver = bndle.getParcelable("reciever");
|
||||
final int awID = bndle.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID);
|
||||
|
||||
// Log.d("qwerty1212", "got from " + Integer.toString(awID) +" "+ url);
|
||||
|
||||
RequestQueue queueStd = Volley.newRequestQueue(this);
|
||||
StringRequest strRequest = new StringRequest(Request.Method.GET, url, //will be 4 requests
|
||||
new Response.Listener<String>() {
|
||||
@Override
|
||||
public void onResponse(String response) {
|
||||
if (response.contains("00c600")){
|
||||
sendData(STATE_ON, awID);
|
||||
} else {
|
||||
sendData(STATE_OFF, awID);
|
||||
}
|
||||
}
|
||||
}, new Response.ErrorListener() {
|
||||
@Override
|
||||
public void onErrorResponse(VolleyError error) {
|
||||
sendData(STATE_UNKNOWN, awID);
|
||||
}
|
||||
});
|
||||
queueStd.add(strRequest);
|
||||
}
|
||||
}
|
|
@ -1,93 +0,0 @@
|
|||
package com.blogspot.developersu.nowol.nowol.com.blogspot.developersu.nowol.nowol.widget;
|
||||
|
||||
import android.app.PendingIntent;
|
||||
import android.appwidget.AppWidgetManager;
|
||||
import android.appwidget.AppWidgetProvider;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.graphics.Color;
|
||||
import android.widget.RemoteViews;
|
||||
|
||||
import com.blogspot.developersu.nowol.nowol.R;
|
||||
import com.blogspot.developersu.nowol.nowol.SendRequestService;
|
||||
|
||||
|
||||
public class NoWolWidget extends AppWidgetProvider {
|
||||
|
||||
private void setRequests(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIDs){
|
||||
SharedPreferences sharedSettings = context.getSharedPreferences("NoWolPreferences", Context.MODE_PRIVATE);
|
||||
String hostIP = sharedSettings.getString("Host", context.getResources().getString(R.string.hostNameDefault));
|
||||
int bgColor = sharedSettings.getInt("WidgetBgColor", Color.BLACK);
|
||||
|
||||
RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.no_wol_widget);
|
||||
|
||||
rv.setInt(R.id.widgetBasicLayout, "setBackgroundColor", bgColor);
|
||||
|
||||
for (int appWidgetId : appWidgetIDs) {
|
||||
//refresh
|
||||
Intent refreshIntent = new Intent(context, SendRequestService.class);
|
||||
refreshIntent.putExtra("url", hostIP);
|
||||
refreshIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
|
||||
PendingIntent refreshPendingIntent = PendingIntent.getService(context, appWidgetId+1, refreshIntent, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
rv.setOnClickPendingIntent(R.id.widgetBntRefresh, refreshPendingIntent);
|
||||
//reset
|
||||
Intent resetIntent = new Intent(context, SendRequestService.class);
|
||||
resetIntent.putExtra("url", hostIP + "/?RESET=on");
|
||||
resetIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
|
||||
PendingIntent resetPendingIntent = PendingIntent.getService(context, appWidgetId+2, resetIntent, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
rv.setOnClickPendingIntent(R.id.widgetBtnReset, resetPendingIntent);
|
||||
//power
|
||||
Intent powerIntent = new Intent(context, SendRequestService.class);
|
||||
powerIntent.putExtra("url", hostIP + "/?POWER0=on");
|
||||
powerIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
|
||||
PendingIntent powerPendingIntent = PendingIntent.getService(context, appWidgetId+3, powerIntent, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
rv.setOnClickPendingIntent(R.id.widgetBtnPwr, powerPendingIntent);
|
||||
//power5
|
||||
Intent power5Intent = new Intent(context, SendRequestService.class);
|
||||
power5Intent.putExtra("url", hostIP + "/?POWER1=on");
|
||||
power5Intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
|
||||
PendingIntent power5PendingIntent = PendingIntent.getService(context, appWidgetId+4, power5Intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
rv.setOnClickPendingIntent(R.id.widgetBtnPwr5, power5PendingIntent);
|
||||
|
||||
appWidgetManager.updateAppWidget(appWidgetId, rv);
|
||||
|
||||
context.startService(refreshIntent);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
|
||||
super.onUpdate(context, appWidgetManager, appWidgetIds);
|
||||
|
||||
setRequests(context, appWidgetManager, appWidgetIds);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEnabled(Context context) {
|
||||
super.onEnabled(context);
|
||||
|
||||
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
|
||||
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, NoWolWidget.class));
|
||||
|
||||
setRequests(context, appWidgetManager, appWidgetIds);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
super.onReceive(context, intent);
|
||||
|
||||
onEnabled(context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDeleted(Context context, int[] appWidgetIds) {
|
||||
super.onDeleted(context, appWidgetIds);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisabled(Context context) {
|
||||
super.onDisabled(context);
|
||||
}
|
||||
}
|
|
@ -1,131 +0,0 @@
|
|||
package com.blogspot.developersu.nowol.nowol.com.blogspot.developersu.nowol.nowol.widget;
|
||||
|
||||
import android.app.PendingIntent;
|
||||
import android.appwidget.AppWidgetManager;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.graphics.Color;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.RemoteViews;
|
||||
import android.widget.SeekBar;
|
||||
import android.widget.TextView;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import com.blogspot.developersu.nowol.nowol.R;
|
||||
import com.blogspot.developersu.nowol.nowol.SendRequestService;
|
||||
import com.google.android.material.switchmaterial.SwitchMaterial;
|
||||
|
||||
public class WidgetConfigurator extends AppCompatActivity {
|
||||
|
||||
private SeekBar opacityBar;
|
||||
private SwitchMaterial bkgoundSwitch;
|
||||
|
||||
private void generateWidgetAndDie(int awID, Context context){
|
||||
SharedPreferences.Editor settingsEditor;
|
||||
|
||||
RemoteViews rv = new RemoteViews(this.getPackageName(), R.layout.no_wol_widget);
|
||||
AppWidgetManager awm = AppWidgetManager.getInstance(this);
|
||||
|
||||
// get shared preferences
|
||||
SharedPreferences sharedSettings = context.getSharedPreferences("NoWolPreferences", Context.MODE_PRIVATE);
|
||||
String hostIP = sharedSettings.getString("Host", context.getResources().getString(R.string.hostNameDefault));
|
||||
// set setting editor to store background color set for all our widgets
|
||||
settingsEditor = sharedSettings.edit();
|
||||
|
||||
// @TODO set pending intents linkage to buttons
|
||||
Intent refreshIntent = new Intent(context, SendRequestService.class);
|
||||
refreshIntent.putExtra("url", hostIP);
|
||||
refreshIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, awID);
|
||||
PendingIntent refreshPendingIntent = PendingIntent.getService(context, awID+1, refreshIntent, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
rv.setOnClickPendingIntent(R.id.widgetBntRefresh, refreshPendingIntent);
|
||||
//reset
|
||||
Intent resetIntent = new Intent(context, SendRequestService.class);
|
||||
resetIntent.putExtra("url", hostIP + "/?RESET=on");
|
||||
resetIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, awID);
|
||||
PendingIntent resetPendingIntent = PendingIntent.getService(context, awID+2, resetIntent, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
rv.setOnClickPendingIntent(R.id.widgetBtnReset, resetPendingIntent);
|
||||
//power
|
||||
Intent powerIntent = new Intent(context, SendRequestService.class);
|
||||
powerIntent.putExtra("url", hostIP + "/?POWER0=on");
|
||||
powerIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, awID);
|
||||
PendingIntent powerPendingIntent = PendingIntent.getService(context, awID+3, powerIntent, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
rv.setOnClickPendingIntent(R.id.widgetBtnPwr, powerPendingIntent);
|
||||
//power5
|
||||
Intent power5Intent = new Intent(context, SendRequestService.class);
|
||||
power5Intent.putExtra("url", hostIP + "/?POWER1=on");
|
||||
power5Intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, awID);
|
||||
PendingIntent power5PendingIntent = PendingIntent.getService(context, awID+4, power5Intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
rv.setOnClickPendingIntent(R.id.widgetBtnPwr5, power5PendingIntent);
|
||||
|
||||
if (bkgoundSwitch.isChecked()){
|
||||
rv.setInt(R.id.widgetBasicLayout, "setBackgroundColor", Color.argb(255-opacityBar.getProgress()*255/100, 0xff,0xff,0xff));
|
||||
settingsEditor.putInt("WidgetBgColor", Color.argb(255-opacityBar.getProgress()*255/100, 0xff,0xff,0xff));
|
||||
Log.d("qwerty1212", Integer.toString(Color.argb(255-opacityBar.getProgress()*255/100, 0xff,0xff,0xff)));
|
||||
}
|
||||
else{
|
||||
rv.setInt(R.id.widgetBasicLayout, "setBackgroundColor", Color.argb(255-opacityBar.getProgress()*255/100, 0x00,0x00,0x00));
|
||||
settingsEditor.putInt("WidgetBgColor", Color.argb(255-opacityBar.getProgress()*255/100, 0x00,0x00,0x00));
|
||||
Log.d("qwerty1212", Integer.toString(Color.argb(255-opacityBar.getProgress()*255/100, 0x00,0x00,0x00)));
|
||||
}
|
||||
settingsEditor.apply();
|
||||
|
||||
awm.updateAppWidget(awID,rv);
|
||||
// Send intent to widget
|
||||
Intent resultIntent = new Intent();
|
||||
resultIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, awID);
|
||||
setResult(RESULT_OK, resultIntent);
|
||||
|
||||
//send intent to service to request widget status
|
||||
startService(refreshIntent);
|
||||
|
||||
finish();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_widget_configurator);
|
||||
|
||||
Button submitBtn = findViewById(R.id.configBtnSubmit);
|
||||
opacityBar = findViewById(R.id.configSeekBar);
|
||||
bkgoundSwitch = findViewById(R.id.configSwitch);
|
||||
final TextView opacityLbl = findViewById(R.id.configOpacityLbl);
|
||||
|
||||
// Prepare seekBar element
|
||||
opacityLbl.setText(getString(R.string.confOpacity) + " " + opacityBar.getProgress()+"%");
|
||||
opacityBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
|
||||
@Override
|
||||
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
|
||||
opacityLbl.setText(getString(R.string.confOpacity) + " " + i + "%");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStartTrackingTouch(SeekBar seekBar) {}
|
||||
@Override
|
||||
public void onStopTrackingTouch(SeekBar seekBar) {}
|
||||
});
|
||||
bkgoundSwitch.setText(getString(R.string.confWhite));
|
||||
|
||||
// Cover widget intent
|
||||
Intent initialConfIntent = getIntent();
|
||||
Bundle initialConfIntentBundle = initialConfIntent.getExtras();
|
||||
|
||||
// Set logic
|
||||
if (initialConfIntentBundle != null){
|
||||
final int awID = initialConfIntentBundle.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
|
||||
|
||||
submitBtn.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
//Log.d("qwerty1212", Integer.toString(opacityBar.getProgress()*255/100));
|
||||
generateWidgetAndDie(awID, getApplicationContext());
|
||||
}
|
||||
});
|
||||
|
||||
} else
|
||||
finish();
|
||||
}
|
||||
}
|
|
@ -1,58 +0,0 @@
|
|||
package com.blogspot.developersu.nowol.nowol;
|
||||
|
||||
import android.app.Dialog;
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.Window;
|
||||
import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
|
||||
public class popUp extends DialogFragment {
|
||||
|
||||
private EditText hostName;
|
||||
private Button submit;
|
||||
|
||||
public interface pupUpRetuningValueListener{
|
||||
void onFinishEdit(String hostNameReSet);
|
||||
}
|
||||
|
||||
public static popUp newInstance(CharSequence ipRecieved){
|
||||
popUp f = new popUp();
|
||||
Bundle myBundle = new Bundle();
|
||||
myBundle.putCharSequence("ipRec", ipRecieved);
|
||||
f.setArguments(myBundle);
|
||||
return f;
|
||||
}
|
||||
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
//getDialog().setTitle(R.string.hostChBntMain);
|
||||
|
||||
View v = inflater.inflate(R.layout.popup, container, false);
|
||||
submit = (Button) v.findViewById(R.id.popupHostBtn);
|
||||
hostName = (EditText) v.findViewById(R.id.popUpHostText);
|
||||
|
||||
|
||||
hostName.setText(getArguments().getCharSequence("ipRec"));
|
||||
|
||||
submit.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
pupUpRetuningValueListener retLs = (pupUpRetuningValueListener)getActivity();
|
||||
retLs.onFinishEdit(hostName.getText().toString());
|
||||
dismiss();
|
||||
}
|
||||
});
|
||||
|
||||
return v;
|
||||
}
|
||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||
Dialog dialog = super.onCreateDialog(savedInstanceState);
|
||||
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
|
||||
return dialog;
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,101 @@
|
|||
/*
|
||||
Copyright 2017-2020 Dmitry Isaenko
|
||||
|
||||
This file is part of NoWOL.
|
||||
|
||||
NoWOL is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
NoWOL is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with NoWOL. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.blogspot.developersu.nowol.widget;
|
||||
|
||||
import android.app.PendingIntent;
|
||||
import android.appwidget.AppWidgetManager;
|
||||
import android.appwidget.AppWidgetProvider;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.util.Log;
|
||||
import android.widget.RemoteViews;
|
||||
|
||||
import com.blogspot.developersu.nowol.R;
|
||||
import com.blogspot.developersu.nowol.SendRequestService;
|
||||
|
||||
|
||||
public class NoWolWidget extends AppWidgetProvider {
|
||||
|
||||
@Override
|
||||
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
|
||||
for (int appWidgetId : appWidgetIds) {
|
||||
updateAppWidget(context, appWidgetManager, appWidgetId);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
if (intent.hasExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS)){
|
||||
int[] widgetIDs = intent.getExtras().getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS);
|
||||
for (int widgetID : widgetIDs){
|
||||
updateAppWidget(context, AppWidgetManager.getInstance(context), widgetID);
|
||||
}
|
||||
}
|
||||
else
|
||||
super.onReceive(context, intent);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEnabled(Context context) {
|
||||
super.onEnabled(context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDeleted(Context context, int[] appWidgetIds) {
|
||||
for (int appWidgetId : appWidgetIds) {
|
||||
WidgetConfigurator.deleteBgColorPref(context, appWidgetId);
|
||||
}
|
||||
}
|
||||
|
||||
static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
|
||||
int appWidgetId) {
|
||||
int widgetBgColor = WidgetConfigurator.loadBgColorPref(context, appWidgetId);
|
||||
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.no_wol_widget);
|
||||
|
||||
remoteViews.setInt(R.id.widgetBodyLayout, "setBackgroundColor", widgetBgColor);
|
||||
//
|
||||
SharedPreferences sharedSettings = context.getSharedPreferences("NoWolPreferences", Context.MODE_PRIVATE);
|
||||
String hostIP = sharedSettings.getString("Host", context.getResources().getString(R.string.hostNameDefault));
|
||||
|
||||
remoteViews.setOnClickPendingIntent(R.id.widgetBntRefresh,
|
||||
createPendingIntent(context, appWidgetId, hostIP, appWidgetId+1)); // Refresh
|
||||
remoteViews.setOnClickPendingIntent(R.id.widgetBtnReset,
|
||||
createPendingIntent(context, appWidgetId, hostIP + "/?RESET=on", appWidgetId+2));
|
||||
remoteViews.setOnClickPendingIntent(R.id.widgetBtnPwr,
|
||||
createPendingIntent(context, appWidgetId, hostIP + "/?POWER0=on", appWidgetId+3));
|
||||
remoteViews.setOnClickPendingIntent(R.id.widgetBtnPwr5,
|
||||
createPendingIntent(context, appWidgetId, hostIP + "/?POWER1=on", appWidgetId+4));
|
||||
|
||||
appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
|
||||
// Ping serv TODO: FIX
|
||||
Intent refreshIntent = new Intent(context, SendRequestService.class);
|
||||
refreshIntent.putExtra("url", hostIP);
|
||||
refreshIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
|
||||
context.startService(refreshIntent);
|
||||
// Instruct the widget manager to update the widget
|
||||
appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
|
||||
}
|
||||
private static PendingIntent createPendingIntent(Context context, int widgetId, String linkAddress, int code){
|
||||
Intent intent = new Intent(context, SendRequestService.class);
|
||||
intent.putExtra("url", linkAddress);
|
||||
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
|
||||
return PendingIntent.getService(context, code, intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,140 @@
|
|||
/*
|
||||
Copyright 2017-2020 Dmitry Isaenko
|
||||
|
||||
This file is part of NoWOL.
|
||||
|
||||
NoWOL is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
NoWOL is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with NoWOL. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.blogspot.developersu.nowol.widget;
|
||||
|
||||
import android.app.PendingIntent;
|
||||
import android.appwidget.AppWidgetManager;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.graphics.Color;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.widget.Button;
|
||||
import android.widget.RemoteViews;
|
||||
import android.widget.SeekBar;
|
||||
import android.widget.TextView;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import com.blogspot.developersu.nowol.R;
|
||||
import com.blogspot.developersu.nowol.SendRequestService;
|
||||
import com.google.android.material.switchmaterial.SwitchMaterial;
|
||||
|
||||
public class WidgetConfigurator extends AppCompatActivity {
|
||||
|
||||
private SeekBar opacityBar;
|
||||
private SwitchMaterial bgColorSwitch;
|
||||
private Context context;
|
||||
|
||||
private int appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
setResult(RESULT_CANCELED);
|
||||
|
||||
setContentView(R.layout.activity_widget_configurator);
|
||||
|
||||
Button submitBtn = findViewById(R.id.configBtnSubmit);
|
||||
opacityBar = findViewById(R.id.configSeekBar);
|
||||
bgColorSwitch = findViewById(R.id.configSwitch);
|
||||
final TextView opacityLbl = findViewById(R.id.configOpacityLbl);
|
||||
opacityLbl.setText(getString(R.string.confOpacity, 0));
|
||||
opacityBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
|
||||
@Override
|
||||
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
|
||||
opacityLbl.setText(getString(R.string.confOpacity, i));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStartTrackingTouch(SeekBar seekBar) {}
|
||||
@Override
|
||||
public void onStopTrackingTouch(SeekBar seekBar) {}
|
||||
});
|
||||
|
||||
this.context = getApplicationContext();
|
||||
|
||||
// Cover widget intent
|
||||
Intent initialConfIntent = getIntent();
|
||||
Bundle initialConfBundle = initialConfIntent.getExtras();
|
||||
|
||||
if (initialConfBundle != null) {
|
||||
appWidgetId = initialConfBundle.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,
|
||||
AppWidgetManager.INVALID_APPWIDGET_ID);
|
||||
}
|
||||
if (appWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
|
||||
finish();
|
||||
return;
|
||||
}
|
||||
|
||||
submitBtn.setOnClickListener(view -> createWidget());
|
||||
}
|
||||
|
||||
private void createWidget(){
|
||||
RemoteViews remoteViews = new RemoteViews(this.getPackageName(), R.layout.no_wol_widget);
|
||||
|
||||
SharedPreferences sharedSettings = context.getSharedPreferences("NoWolPreferences", Context.MODE_PRIVATE);
|
||||
String hostIP = sharedSettings.getString("Host", context.getResources().getString(R.string.hostNameDefault));
|
||||
|
||||
SharedPreferences.Editor settingsEditor = sharedSettings.edit();
|
||||
|
||||
remoteViews.setOnClickPendingIntent(R.id.widgetBntRefresh,
|
||||
createPendingIntent(hostIP, appWidgetId+1)); // Refresh
|
||||
remoteViews.setOnClickPendingIntent(R.id.widgetBtnReset,
|
||||
createPendingIntent(hostIP + "/?RESET=on", appWidgetId+2));
|
||||
remoteViews.setOnClickPendingIntent(R.id.widgetBtnPwr,
|
||||
createPendingIntent(hostIP + "/?POWER0=on", appWidgetId+3));
|
||||
remoteViews.setOnClickPendingIntent(R.id.widgetBtnPwr5,
|
||||
createPendingIntent(hostIP + "/?POWER1=on", appWidgetId+4));
|
||||
int bgColor = getBackgoundColor();
|
||||
remoteViews.setInt(R.id.widgetBodyLayout, "setBackgroundColor", bgColor);
|
||||
settingsEditor.putInt("WidgetBgColor" + appWidgetId, bgColor).apply();
|
||||
|
||||
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this);
|
||||
appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
|
||||
// Send intent to widget
|
||||
Intent resultIntent = new Intent();
|
||||
resultIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
|
||||
setResult(RESULT_OK, resultIntent);
|
||||
finish();
|
||||
}
|
||||
private PendingIntent createPendingIntent(String linkAddress, int code){
|
||||
Intent intent = new Intent(context, SendRequestService.class);
|
||||
intent.putExtra("url", linkAddress);
|
||||
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
|
||||
return PendingIntent.getService(context, code, intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
}
|
||||
private int getBackgoundColor(){
|
||||
if (bgColorSwitch.isChecked())
|
||||
return Color.argb(255-opacityBar.getProgress()*255/100, 0xff,0xff,0xff);
|
||||
else
|
||||
return Color.argb(255-opacityBar.getProgress()*255/100, 0x00,0x00,0x00);
|
||||
}
|
||||
|
||||
static int loadBgColorPref(Context context, int appWidgetId) {
|
||||
SharedPreferences prefs = context.getSharedPreferences("NoWolPreferences", Context.MODE_PRIVATE);
|
||||
return prefs.getInt("WidgetBgColor" + appWidgetId, Color.argb(255, 0x00,0x00,0x00));
|
||||
}
|
||||
|
||||
static void deleteBgColorPref(Context context, int appWidgetId) {
|
||||
SharedPreferences.Editor prefs = context.getSharedPreferences("NoWolPreferences", Context.MODE_PRIVATE).edit();
|
||||
prefs.remove("WidgetBgColor" + appWidgetId);
|
||||
prefs.apply();
|
||||
}
|
||||
}
|
Before Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 20 KiB |
BIN
app/src/main/res/drawable-anydpi-v21/ic_launcher.png
Normal file
After Width: | Height: | Size: 4.9 KiB |
5
app/src/main/res/drawable-anydpi-v21/w_power.xml
Normal file
|
@ -0,0 +1,5 @@
|
|||
<vector android:height="48dp" android:tint="#FFFFFF"
|
||||
android:viewportHeight="24" android:viewportWidth="24"
|
||||
android:width="48dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="@android:color/white" android:pathData="M13,3h-2v10h2L13,3zM17.83,5.17l-1.42,1.42C17.99,7.86 19,9.81 19,12c0,3.87 -3.13,7 -7,7s-7,-3.13 -7,-7c0,-2.19 1.01,-4.14 2.58,-5.42L6.17,5.17C4.23,6.82 3,9.26 3,12c0,4.97 4.03,9 9,9s9,-4.03 9,-9c0,-2.74 -1.23,-5.18 -3.17,-6.83z"/>
|
||||
</vector>
|
4
app/src/main/res/drawable-anydpi-v21/w_power5.xml
Normal file
|
@ -0,0 +1,4 @@
|
|||
<vector android:height="48dp" android:viewportHeight="24"
|
||||
android:viewportWidth="24" android:width="48dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="@android:color/white" android:pathData="m11,3v3.5898h2L13,3ZM6.1699,5.1699c-3.79,3.22 -4.2493,8.8995 -1.0293,12.6895 3.22,3.78 8.8995,4.2415 12.6895,1.0215C19.8501,17.1709 21,14.65 21,12 21,9.37 19.8401,6.8699 17.8301,5.1699L16.4102,6.5898C18.0502,7.9098 19,9.9 19,12a7,7 0,0 1,-7 7C8.14,19 5,15.88 5,12 5,9.91 5.9501,7.9101 7.5801,6.5801ZM9.7039,7.4786h4.6758v1.0514h-3.5378v2.2699q0.266,-0.099 0.5319,-0.1423 0.2721,-0.0495 0.5443,-0.0495 1.4349,0 2.276,0.8473 0.8411,0.8473 0.8411,2.2946 0,1.4596 -0.8844,2.3008 -0.8783,0.8411 -2.4059,0.8411 -0.736,0 -1.3483,-0.099 -0.6061,-0.099 -1.0885,-0.2969L9.3081,15.2283q0.569,0.3092 1.1442,0.4639 0.5752,0.1484 1.1751,0.1484 1.0329,0 1.5895,-0.5443 0.5628,-0.5443 0.5628,-1.5462 0,-0.9896 -0.5814,-1.54 -0.5752,-0.5505 -1.6081,-0.5505 -0.501,0 -0.9772,0.1175 -0.4762,0.1113 -0.9092,0.3402z"/>
|
||||
</vector>
|
4
app/src/main/res/drawable-anydpi-v21/w_power5_press.xml
Normal file
|
@ -0,0 +1,4 @@
|
|||
<vector android:height="48dp" android:viewportHeight="24"
|
||||
android:viewportWidth="24" android:width="48dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="@android:color/holo_green_dark" android:pathData="m11,3v3.5898h2L13,3ZM6.1699,5.1699c-3.79,3.22 -4.2493,8.8995 -1.0293,12.6895 3.22,3.78 8.8995,4.2415 12.6895,1.0215C19.8501,17.1709 21,14.65 21,12 21,9.37 19.8401,6.8699 17.8301,5.1699L16.4102,6.5898C18.0502,7.9098 19,9.9 19,12a7,7 0,0 1,-7 7C8.14,19 5,15.88 5,12 5,9.91 5.9501,7.9101 7.5801,6.5801ZM9.7039,7.4786h4.6758v1.0514h-3.5378v2.2699q0.266,-0.099 0.5319,-0.1423 0.2721,-0.0495 0.5443,-0.0495 1.4349,0 2.276,0.8473 0.8411,0.8473 0.8411,2.2946 0,1.4596 -0.8844,2.3008 -0.8783,0.8411 -2.4059,0.8411 -0.736,0 -1.3483,-0.099 -0.6061,-0.099 -1.0885,-0.2969L9.3081,15.2283q0.569,0.3092 1.1442,0.4639 0.5752,0.1484 1.1751,0.1484 1.0329,0 1.5895,-0.5443 0.5628,-0.5443 0.5628,-1.5462 0,-0.9896 -0.5814,-1.54 -0.5752,-0.5505 -1.6081,-0.5505 -0.501,0 -0.9772,0.1175 -0.4762,0.1113 -0.9092,0.3402z"/>
|
||||
</vector>
|
5
app/src/main/res/drawable-anydpi-v21/w_power_press.xml
Normal file
|
@ -0,0 +1,5 @@
|
|||
<vector android:height="48dp"
|
||||
android:viewportHeight="24" android:viewportWidth="24"
|
||||
android:width="48dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="@android:color/holo_green_dark" android:pathData="M13,3h-2v10h2L13,3zM17.83,5.17l-1.42,1.42C17.99,7.86 19,9.81 19,12c0,3.87 -3.13,7 -7,7s-7,-3.13 -7,-7c0,-2.19 1.01,-4.14 2.58,-5.42L6.17,5.17C4.23,6.82 3,9.26 3,12c0,4.97 4.03,9 9,9s9,-4.03 9,-9c0,-2.74 -1.23,-5.18 -3.17,-6.83z"/>
|
||||
</vector>
|
5
app/src/main/res/drawable-anydpi-v21/w_refresh.xml
Normal file
|
@ -0,0 +1,5 @@
|
|||
<vector android:height="14dp" android:viewportHeight="1000"
|
||||
android:viewportWidth="1000" android:width="14dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="@android:color/white" android:pathData="M174,535.4c-23.5,-147 57.2,-295.5 201.4,-351.7c106.8,-41.7 222,-21.7 303.6,37.8L609.6,334l311.3,-1.2L809.6,10l-57,92.3C632.4,24.5 468.6,-1 325.1,54.9C126.4,132.4 12,332.8 34.5,535.4H174L174,535.4z"/>
|
||||
<path android:fillColor="@android:color/white" android:pathData="M826.1,455c23.5,147 -57.2,295.5 -201.4,351.7c-98.3,38.3 -206.6,23.9 -289.9,-27.8c15.9,-25.7 62.7,-101.6 62.7,-101.6L62.8,657.6L204.5,990l59.4,-96.2c120.2,77.8 267.6,97.6 411,41.7C873.6,858 988,657.6 965.5,455L826.1,455L826.1,455z"/>
|
||||
</vector>
|
5
app/src/main/res/drawable-anydpi-v21/w_refresh_press.xml
Normal file
|
@ -0,0 +1,5 @@
|
|||
<vector android:height="14dp" android:viewportHeight="1000"
|
||||
android:viewportWidth="1000" android:width="14dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="@android:color/black" android:pathData="M174,535.4c-23.5,-147 57.2,-295.5 201.4,-351.7c106.8,-41.7 222,-21.7 303.6,37.8L609.6,334l311.3,-1.2L809.6,10l-57,92.3C632.4,24.5 468.6,-1 325.1,54.9C126.4,132.4 12,332.8 34.5,535.4H174L174,535.4z"/>
|
||||
<path android:fillColor="@android:color/black" android:pathData="M826.1,455c23.5,147 -57.2,295.5 -201.4,351.7c-98.3,38.3 -206.6,23.9 -289.9,-27.8c15.9,-25.7 62.7,-101.6 62.7,-101.6L62.8,657.6L204.5,990l59.4,-96.2c120.2,77.8 267.6,97.6 411,41.7C873.6,858 988,657.6 965.5,455L826.1,455L826.1,455z"/>
|
||||
</vector>
|
5
app/src/main/res/drawable-anydpi-v21/w_reset.xml
Normal file
|
@ -0,0 +1,5 @@
|
|||
<vector android:height="48dp" android:tint="#FFFFFF"
|
||||
android:viewportHeight="24" android:viewportWidth="24"
|
||||
android:width="48dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="@android:color/white" android:pathData="M17.65,6.35C16.2,4.9 14.21,4 12,4c-4.42,0 -7.99,3.58 -7.99,8s3.57,8 7.99,8c3.73,0 6.84,-2.55 7.73,-6h-2.08c-0.82,2.33 -3.04,4 -5.65,4 -3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6c1.66,0 3.14,0.69 4.22,1.78L13,11h7V4l-2.35,2.35z"/>
|
||||
</vector>
|
5
app/src/main/res/drawable-anydpi-v21/w_reset_press.xml
Normal file
|
@ -0,0 +1,5 @@
|
|||
<vector android:height="48dp"
|
||||
android:viewportHeight="24" android:viewportWidth="24"
|
||||
android:width="48dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="@android:color/holo_green_dark" android:pathData="M17.65,6.35C16.2,4.9 14.21,4 12,4c-4.42,0 -7.99,3.58 -7.99,8s3.57,8 7.99,8c3.73,0 6.84,-2.55 7.73,-6h-2.08c-0.82,2.33 -3.04,4 -5.65,4 -3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6c1.66,0 3.14,0.69 4.22,1.78L13,11h7V4l-2.35,2.35z"/>
|
||||
</vector>
|
|
@ -1,4 +0,0 @@
|
|||
[Dolphin]
|
||||
PreviewsShown=true
|
||||
Timestamp=2017,8,6,16,39,33
|
||||
Version=3
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 5.6 KiB |
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 4.6 KiB |
Before Width: | Height: | Size: 965 B After Width: | Height: | Size: 965 B |
Before Width: | Height: | Size: 821 B After Width: | Height: | Size: 821 B |
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 4.5 KiB |
|
@ -1,4 +0,0 @@
|
|||
[Dolphin]
|
||||
PreviewsShown=true
|
||||
Timestamp=2017,8,6,16,39,9
|
||||
Version=3
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 657 B After Width: | Height: | Size: 657 B |
Before Width: | Height: | Size: 583 B After Width: | Height: | Size: 583 B |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 34 KiB |
|
@ -1,4 +0,0 @@
|
|||
[Dolphin]
|
||||
PreviewsShown=true
|
||||
Timestamp=2017,8,6,16,37,31
|
||||
Version=3
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 7.2 KiB |
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 5.9 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 940 B After Width: | Height: | Size: 940 B |
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 5.7 KiB |
|
@ -1,4 +0,0 @@
|
|||
[Dolphin]
|
||||
PreviewsShown=true
|
||||
Timestamp=2017,8,6,16,36,41
|
||||
Version=3
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.2 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 9.2 KiB After Width: | Height: | Size: 9.2 KiB |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 8.9 KiB After Width: | Height: | Size: 8.9 KiB |
|
@ -1,4 +0,0 @@
|
|||
[Dolphin]
|
||||
PreviewsShown=true
|
||||
Timestamp=2017,8,6,15,33,9
|
||||
Version=3
|
Before Width: | Height: | Size: 4 KiB After Width: | Height: | Size: 4 KiB |
Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 4.9 KiB |
Before Width: | Height: | Size: 7.9 KiB After Width: | Height: | Size: 7.9 KiB |
Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 6.6 KiB |
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 6.5 KiB |
|
@ -1,7 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:state_pressed="true"
|
||||
android:drawable="@drawable/pwr5_widget_pressed"/> <!-- pressed -->
|
||||
<item android:drawable="@drawable/pwr5_widget_normal" /> <!-- default -->
|
||||
android:drawable="@drawable/w_power5_press"/> <!-- pressed -->
|
||||
<item android:drawable="@drawable/w_power5" /> <!-- default -->
|
||||
|
||||
</selector>
|
|
@ -1,7 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:state_pressed="true"
|
||||
android:drawable="@drawable/pwr_widget_pressed"/> <!-- pressed -->
|
||||
<item android:drawable="@drawable/pwr_widget_normal" /> <!-- default -->
|
||||
android:drawable="@drawable/w_power_press"/> <!-- pressed -->
|
||||
<item android:drawable="@drawable/w_power" /> <!-- default -->
|
||||
|
||||
</selector>
|
|
@ -1,8 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<!-- pressed -->
|
||||
<!-- default -->
|
||||
|
||||
<item android:state_pressed="true" android:drawable="@drawable/refresh_widget_pressed" />
|
||||
<item android:drawable="@drawable/refresh_widget" />
|
||||
<item android:state_pressed="true"
|
||||
android:drawable="@drawable/w_refresh_press" />
|
||||
<item android:drawable="@drawable/w_refresh" />
|
||||
</selector>
|
|
@ -1,7 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:state_pressed="true"
|
||||
android:drawable="@drawable/rst_widget_pressed"/> <!-- pressed -->
|
||||
<item android:drawable="@drawable/rst_widget_normal" /> <!-- default -->
|
||||
android:drawable="@drawable/w_reset_press"/> <!-- pressed -->
|
||||
<item android:drawable="@drawable/w_reset" /> <!-- default -->
|
||||
|
||||
</selector>
|
|
@ -10,6 +10,7 @@
|
|||
>
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/relativeLayout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
|
@ -18,18 +19,18 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/actionBarSize"
|
||||
android:background="?attr/colorPrimary"
|
||||
app:elevation="4dp"
|
||||
android:minHeight="?attr/actionBarSize"
|
||||
android:theme="?attr/actionBarTheme"
|
||||
app:elevation="4dp"
|
||||
app:titleTextColor="@android:color/background_light" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/textView"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignLeft="@+id/hostLblMain"
|
||||
android:layout_alignStart="@+id/hostLblMain"
|
||||
android:layout_below="@+id/hostLblMain"
|
||||
android:layout_alignStart="@+id/hostLblMain"
|
||||
android:layout_alignLeft="@+id/hostLblMain"
|
||||
android:layout_marginTop="13dp"
|
||||
android:text="@string/statusLabelMain"
|
||||
android:textColor="@android:color/black"
|
||||
|
@ -45,44 +46,44 @@
|
|||
android:layout_alignBottom="@+id/pwr5BntMainAct"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_marginEnd="10dp"
|
||||
android:layout_marginRight="10dp"
|
||||
android:layout_toEndOf="@+id/pwr5BntMainAct"
|
||||
android:layout_toRightOf="@+id/pwr5BntMainAct"
|
||||
android:height="110dp"
|
||||
android:text="@string/powerBntMain"
|
||||
android:drawableTop="@drawable/pwr_widget_button"
|
||||
app:drawableTopCompat="@drawable/w_power"
|
||||
tools:layout_editor_absoluteX="16dp"
|
||||
tools:layout_editor_absoluteY="98dp"
|
||||
android:layout_toRightOf="@+id/pwr5BntMainAct"
|
||||
android:layout_toEndOf="@+id/pwr5BntMainAct"
|
||||
android:layout_marginEnd="10dp" />
|
||||
tools:layout_editor_absoluteY="98dp" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/resBntMainAct"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_alignParentStart="true"
|
||||
android:layout_below="@+id/textView"
|
||||
android:layout_marginTop="19dp"
|
||||
android:layout_alignParentStart="true"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_marginStart="10dp"
|
||||
android:layout_marginLeft="10dp"
|
||||
android:layout_toLeftOf="@+id/pwr5BntMainAct"
|
||||
android:layout_marginTop="19dp"
|
||||
android:layout_toStartOf="@+id/pwr5BntMainAct"
|
||||
android:layout_toLeftOf="@+id/pwr5BntMainAct"
|
||||
android:height="110dp"
|
||||
android:text="@string/resetBtnMain"
|
||||
android:drawableTop="@drawable/reset_widget_button"
|
||||
app:drawableTopCompat="@drawable/w_reset"
|
||||
tools:layout_editor_absoluteX="148dp"
|
||||
tools:layout_editor_absoluteY="98dp"
|
||||
android:layout_marginStart="10dp" />
|
||||
tools:layout_editor_absoluteY="98dp" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/pwr5BntMainAct"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignBottom="@+id/resBntMainAct"
|
||||
android:layout_alignTop="@+id/resBntMainAct"
|
||||
android:layout_alignBottom="@+id/resBntMainAct"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:height="110dp"
|
||||
android:text="@string/pwr5BntMain"
|
||||
android:drawableTop="@drawable/pwr5_widget_button"
|
||||
app:drawableTopCompat="@drawable/w_power5"
|
||||
tools:layout_editor_absoluteX="259dp"
|
||||
tools:layout_editor_absoluteY="98dp" />
|
||||
|
||||
|
@ -104,17 +105,17 @@
|
|||
android:id="@+id/hostLblMain"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="15dp"
|
||||
android:layout_below="@+id/toolbar"
|
||||
android:layout_alignParentStart="true"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_marginStart="15dp"
|
||||
android:layout_marginLeft="15dp"
|
||||
android:layout_marginTop="12dp"
|
||||
android:text="@string/hostLblMain"
|
||||
android:textColor="@android:color/black"
|
||||
android:textSize="18sp"
|
||||
tools:layout_editor_absoluteX="16dp"
|
||||
tools:layout_editor_absoluteY="16dp"
|
||||
android:layout_below="@+id/toolbar"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_alignParentStart="true"
|
||||
android:layout_marginTop="12dp" />
|
||||
tools:layout_editor_absoluteY="16dp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/hostNameStaticMain"
|
||||
|
@ -126,6 +127,7 @@
|
|||
android:layout_toRightOf="@+id/hostLblMain"
|
||||
android:textColor="@android:color/black"
|
||||
android:textSize="18sp" />
|
||||
|
||||
</RelativeLayout>
|
||||
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
|
@ -1,11 +1,13 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="10dp"
|
||||
android:orientation="vertical"
|
||||
android:padding="@dimen/widget_margin"
|
||||
tools:context="com.blogspot.developersu.nowol.nowol.com.blogspot.developersu.nowol.nowol.widget.WidgetConfigurator">
|
||||
tools:context="com.blogspot.developersu.nowol.widget.WidgetConfigurator">
|
||||
|
||||
<Space
|
||||
android:layout_width="match_parent"
|
||||
|
|
|
@ -1,16 +1,14 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/widgetBasicLayout"
|
||||
<RelativeLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@android:color/black"
|
||||
android:orientation="vertical">
|
||||
android:padding="@dimen/widget_margin">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/widgetHeaderLayout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@color/colorPrimary"
|
||||
android:background="@color/colorOrange"
|
||||
android:orientation="horizontal"
|
||||
android:paddingLeft="@dimen/widget_margin"
|
||||
android:paddingRight="@dimen/widget_margin"
|
||||
|
@ -20,45 +18,74 @@
|
|||
android:id="@+id/widgetStatusText"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="2dp"
|
||||
android:layout_weight="1"
|
||||
android:shadowColor="@android:color/black"
|
||||
android:shadowDx="2"
|
||||
android:shadowDy="2"
|
||||
android:shadowRadius="2"
|
||||
android:text="@string/statusTxtMain"
|
||||
android:textColor="@android:color/background_light" />
|
||||
android:textColor="@android:color/background_light"
|
||||
android:layout_marginStart="2dp" />
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/widgetBntRefresh"
|
||||
style="@android:style/Widget.Holo.ImageButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="1dp"
|
||||
android:layout_marginTop="1dp"
|
||||
android:layout_marginRight="2dp"
|
||||
android:layout_marginBottom="1dp"
|
||||
android:layout_weight="1"
|
||||
android:background="@android:color/transparent"
|
||||
android:contentDescription="@string/refreshBnt"
|
||||
android:padding="0dp"
|
||||
android:scaleType="fitEnd"
|
||||
android:src="@drawable/refresh_widget_button" />
|
||||
android:src="@drawable/refresh_widget_button"
|
||||
android:layout_marginStart="1dp"
|
||||
android:layout_marginEnd="2dp" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/widgetBodyLayout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="horizontal"
|
||||
android:padding="@dimen/widget_margin">
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@+id/widgetHeaderLayout"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_marginTop="0dp"
|
||||
android:layout_marginBottom="0dp"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/widgetBtnReset"
|
||||
style="@android:style/Widget.Holo.ImageButton"
|
||||
android:src="@drawable/reset_widget_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_weight="1"
|
||||
android:background="@android:color/transparent"
|
||||
android:contentDescription="@string/resetBtnMain"
|
||||
android:padding="0dp"
|
||||
android:src="@drawable/reset_widget_button" />
|
||||
android:background="@android:color/transparent"
|
||||
android:padding="0dp" />
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/widgetBtnPwr5"
|
||||
style="@android:style/Widget.Holo.ImageButton"
|
||||
android:src="@drawable/pwr5_widget_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_weight="1"
|
||||
android:contentDescription="@string/pwr5BntMain"
|
||||
android:padding="0dp"
|
||||
android:background="@android:color/transparent"
|
||||
/>
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/widgetBtnPwr"
|
||||
style="@android:style/Widget.Holo.ImageButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
|
@ -66,20 +93,8 @@
|
|||
android:background="@android:color/transparent"
|
||||
android:contentDescription="@string/pwr5BntMain"
|
||||
android:padding="0dp"
|
||||
android:src="@drawable/pwr5_widget_button" />
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/widgetBtnPwr"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_weight="1"
|
||||
android:background="@android:color/transparent"
|
||||
android:contentDescription="@string/powerBntMain"
|
||||
android:padding="0dp"
|
||||
android:src="@drawable/pwr_widget_button" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
||||
</LinearLayout>
|
||||
</RelativeLayout>
|
|
@ -6,25 +6,18 @@
|
|||
android:orientation="vertical">
|
||||
|
||||
<EditText
|
||||
android:id="@+id/popUpHostText"
|
||||
android:id="@+id/input"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:ems="10"
|
||||
android:hint="http://192.168.X.X"
|
||||
android:inputType="textPersonName" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="end"
|
||||
android:orientation="horizontal"
|
||||
>
|
||||
|
||||
<Button
|
||||
android:id="@+id/popupHostBtn"
|
||||
android:id="@+id/confirm"
|
||||
style="@style/Widget.AppCompat.ButtonBar.AlertDialog"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/pupUpHostBtn" />
|
||||
</LinearLayout>
|
||||
android:text="@android:string/ok" />
|
||||
|
||||
</LinearLayout>
|
|
@ -17,13 +17,13 @@
|
|||
<string name="updateBtnMain">Обновить статус системы</string>
|
||||
<string name="hostNameDefault">http://192.168.1.3</string>
|
||||
<string name="hostChBntMain">Изменить адрес хоста</string>
|
||||
<string name="pupUpHostBtn">Применить</string>
|
||||
<string name="statusOnline">Онлайн</string>
|
||||
<string name="statusOffline">Офлайн</string>
|
||||
<string name="noResponse">"Нет ответа "</string>
|
||||
|
||||
<string name="confCreateWidget">"Создать виджет"</string>
|
||||
<string name="confOpacity">"Прозрачность"</string>
|
||||
<string name="confOpacity" formatted="true">Прозрачность %d</string>
|
||||
<string name="confWhite">"Белый фон"</string>
|
||||
<string name="popupTitle">Новый адрес хоста</string>
|
||||
|
||||
</resources>
|
||||
|
|
|
@ -1,10 +1,8 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<!--
|
||||
Refer to App Widget Documentation for margin information
|
||||
http://developer.android.com/guide/topics/appwidgets/index.html#CreatingLayout
|
||||
-->
|
||||
<dimen name="widget_margin">3dp</dimen>
|
||||
|
||||
<dimen name="widget_margin">0dp</dimen>
|
||||
</resources>
|
|
@ -1,10 +1,8 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<!--
|
||||
Refer to App Widget Documentation for margin information
|
||||
http://developer.android.com/guide/topics/appwidgets/index.html#CreatingLayout
|
||||
-->
|
||||
<dimen name="widget_margin">3dp</dimen>
|
||||
|
||||
<dimen name="widget_margin">8dp</dimen>
|
||||
</resources>
|
|
@ -17,13 +17,13 @@
|
|||
<string name="updateBtnMain">Update system status</string>
|
||||
<string name="hostNameDefault">http://192.168.1.3</string>
|
||||
<string name="hostChBntMain">Change host address</string>
|
||||
<string name="pupUpHostBtn">Submit</string>
|
||||
<string name="statusOnline">Online</string>
|
||||
<string name="statusOffline">Offline</string>
|
||||
<string name="noResponse">"No response "</string>
|
||||
|
||||
<string name="confCreateWidget">"Create widget"</string>
|
||||
<string name="confOpacity">"Opacity"</string>
|
||||
<string name="confOpacity" formatted="true">Opacity %d</string>
|
||||
<string name="confWhite">"White background"</string>
|
||||
<string name="popupTitle">New host address</string>
|
||||
|
||||
</resources>
|
||||
|
|
|
@ -2,9 +2,12 @@
|
|||
<appwidget-provider
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:previewImage="@drawable/widget_preview"
|
||||
android:minWidth="110dp"
|
||||
android:minHeight="40dp"
|
||||
android:minWidth="80dp"
|
||||
android:updatePeriodMillis="6400000"
|
||||
android:resizeMode="none"
|
||||
android:configure="com.blogspot.developersu.nowol.nowol.com.blogspot.developersu.nowol.nowol.widget.WidgetConfigurator"
|
||||
android:configure="com.blogspot.developersu.nowol.widget.WidgetConfigurator"
|
||||
android:initialLayout="@layout/no_wol_widget"
|
||||
android:initialKeyguardLayout="@layout/no_wol_widget"
|
||||
android:widgetCategory="home_screen"
|
||||
/>
|
Before Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 15 KiB |