You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
213 lines
8.0 KiB
213 lines
8.0 KiB
/*
|
|
* Copyright (c) 2017 m2049r
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package com.m2049r.xmrwallet;
|
|
|
|
import android.app.Activity;
|
|
import android.app.AlertDialog;
|
|
import android.app.Fragment;
|
|
import android.content.Context;
|
|
import android.content.DialogInterface;
|
|
import android.content.Intent;
|
|
import android.content.SharedPreferences;
|
|
import android.content.pm.PackageManager;
|
|
import android.os.AsyncTask;
|
|
import android.os.Bundle;
|
|
import android.os.StrictMode;
|
|
import android.support.annotation.NonNull;
|
|
import android.util.Log;
|
|
import android.view.KeyEvent;
|
|
import android.view.LayoutInflater;
|
|
import android.view.View;
|
|
import android.view.WindowManager;
|
|
import android.view.inputmethod.EditorInfo;
|
|
import android.widget.BaseAdapter;
|
|
import android.widget.EditText;
|
|
import android.widget.ListView;
|
|
import android.widget.TextView;
|
|
import android.widget.Toast;
|
|
import android.widget.ToggleButton;
|
|
|
|
import com.m2049r.xmrwallet.model.WalletManager;
|
|
import com.m2049r.xmrwallet.util.Helper;
|
|
|
|
import java.io.File;
|
|
import java.io.IOException;
|
|
import java.net.InetSocketAddress;
|
|
import java.net.Socket;
|
|
import java.util.ArrayList;
|
|
import java.util.Date;
|
|
import java.util.List;
|
|
|
|
public class LoginActivity extends Activity implements LoginFragment.LoginFragmentListener {
|
|
static final String TAG = "LoginActivity";
|
|
|
|
static final int DAEMON_TIMEOUT = 500; // deamon must respond in 500ms
|
|
|
|
@Override
|
|
protected void onCreate(Bundle savedInstanceState) {
|
|
super.onCreate(savedInstanceState);
|
|
setContentView(R.layout.login_activity);
|
|
if (savedInstanceState != null) {
|
|
return;
|
|
}
|
|
if (Helper.getWritePermission(this)) {
|
|
startLoginFragment();
|
|
} else {
|
|
Log.i(TAG, "Waiting for permissions");
|
|
}
|
|
}
|
|
|
|
// adapted from http://www.mkyong.com/android/android-prompt-user-input-dialog-example/
|
|
@Override
|
|
public void promptPassword(final String wallet) {
|
|
Context context = LoginActivity.this;
|
|
LayoutInflater li = LayoutInflater.from(context);
|
|
View promptsView = li.inflate(R.layout.prompt_password, null);
|
|
|
|
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
|
|
alertDialogBuilder.setView(promptsView);
|
|
|
|
final EditText etPassword = (EditText) promptsView.findViewById(R.id.etPassword);
|
|
final TextView tvPasswordLabel = (TextView) promptsView.findViewById(R.id.tvPasswordLabel);
|
|
|
|
tvPasswordLabel.setText(LoginActivity.this.getString(R.string.prompt_password) + " " + wallet);
|
|
|
|
// set dialog message
|
|
alertDialogBuilder
|
|
.setCancelable(false)
|
|
.setPositiveButton("OK",
|
|
new DialogInterface.OnClickListener() {
|
|
public void onClick(DialogInterface dialog, int id) {
|
|
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
|
|
String pass = etPassword.getText().toString();
|
|
processPasswordEntry(wallet, pass);
|
|
}
|
|
})
|
|
.setNegativeButton("Cancel",
|
|
new DialogInterface.OnClickListener() {
|
|
public void onClick(DialogInterface dialog, int id) {
|
|
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
|
|
dialog.cancel();
|
|
}
|
|
});
|
|
|
|
final AlertDialog alertDialog = alertDialogBuilder.create();
|
|
// request keyboard
|
|
alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
|
|
// accept keyboard "ok"
|
|
etPassword.setOnEditorActionListener(new TextView.OnEditorActionListener() {
|
|
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
|
|
if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_DONE)) {
|
|
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
|
|
String pass = etPassword.getText().toString();
|
|
alertDialog.cancel();
|
|
processPasswordEntry(wallet, pass);
|
|
return false;
|
|
}
|
|
return false;
|
|
}
|
|
});
|
|
|
|
alertDialog.show();
|
|
}
|
|
|
|
private boolean checkWalletPassword(String walletName, String password) {
|
|
String walletPath = new File(Helper.getStorageRoot(getApplicationContext()),
|
|
walletName + ".keys").getAbsolutePath();
|
|
// only test view key
|
|
return WalletManager.getInstance().verifyWalletPassword(walletPath, password, true);
|
|
}
|
|
|
|
private void processPasswordEntry(String walletName, String pass) {
|
|
if (checkWalletPassword(walletName, pass)) {
|
|
startWallet(walletName, pass);
|
|
} else {
|
|
Toast.makeText(this, getString(R.string.bad_password), Toast.LENGTH_SHORT).show();
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////
|
|
// LoginFragment.LoginFragmentListener
|
|
////////////////////////////////////////
|
|
@Override
|
|
public SharedPreferences getPrefs() {
|
|
return getPreferences(Context.MODE_PRIVATE);
|
|
}
|
|
|
|
@Override
|
|
public File getStorageRoot() {
|
|
return Helper.getStorageRoot(getApplicationContext());
|
|
}
|
|
|
|
////////////////////////////////////////
|
|
////////////////////////////////////////
|
|
|
|
@Override
|
|
protected void onPause() {
|
|
Log.d(TAG, "onPause()");
|
|
super.onPause();
|
|
}
|
|
|
|
@Override
|
|
protected void onResume() {
|
|
super.onResume();
|
|
Log.d(TAG, "onResume()");
|
|
}
|
|
|
|
|
|
void startWallet(String walletName, String walletPassword) {
|
|
Log.d(TAG, "startWallet()");
|
|
Intent intent = new Intent(getApplicationContext(), WalletActivity.class);
|
|
intent.putExtra(WalletActivity.REQUEST_ID, walletName);
|
|
intent.putExtra(WalletActivity.REQUEST_PW, walletPassword);
|
|
startActivity(intent);
|
|
}
|
|
|
|
@Override
|
|
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
|
|
Log.d(TAG, "onRequestPermissionsResult()");
|
|
switch (requestCode) {
|
|
case Helper.PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE:
|
|
// If request is cancelled, the result arrays are empty.
|
|
if (grantResults.length > 0
|
|
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
|
startLoginFragment();
|
|
} else {
|
|
String msg = getString(R.string.message_strorage_not_permitted);
|
|
Log.e(TAG, msg);
|
|
throw new IllegalStateException(msg);
|
|
}
|
|
break;
|
|
default:
|
|
}
|
|
}
|
|
|
|
void startLoginFragment() {
|
|
// Create a new Fragment to be placed in the activity layout
|
|
Fragment fragment = new LoginFragment();
|
|
|
|
// In case this activity was started with special instructions from an
|
|
// Intent, pass the Intent's extras to the fragment as arguments
|
|
//firstFragment.setArguments(getIntent().getExtras());
|
|
|
|
// Add the fragment to the 'fragment_container' FrameLayout
|
|
getFragmentManager().beginTransaction()
|
|
.add(R.id.fragment_container, fragment).commit();
|
|
Log.d(TAG, "fragment added");
|
|
}
|
|
}
|