Newsletter
REAL HACKER NEWS
  • Home
  • REVIEWS
  • SECURITY
  • GAMING
  • SMARTPHONES
  • CAMERA
  • COMPUTERS
    • LAPTOP
  • APPLICATIONS
  • AUDIO
No Result
View All Result
  • Home
  • REVIEWS
  • SECURITY
  • GAMING
  • SMARTPHONES
  • CAMERA
  • COMPUTERS
    • LAPTOP
  • APPLICATIONS
  • AUDIO
No Result
View All Result
REAL HACKER NEWS
No Result
View All Result
Home APPLICATIONS

Jetpack Compose for Wear OS

Real Hacker Staff by Real Hacker Staff
January 25, 2023
in APPLICATIONS
0
Jetpack Compose for Wear OS
189
SHARES
1.5k
VIEWS
Share on FacebookShare on Twitter


With Jetpack Compose for Put on OS, you may construct lovely consumer interfaces for watches. It has tons of parts to select from. On this tutorial, you’ll find out about all the important parts — reminiscent of Inputs, Dialogs, Progress Indicators and Web page Indicators. You’ll additionally study when to make use of a Vignette and a TimeText.

Getting Began

Obtain the starter venture by clicking the Obtain Supplies button on the high or backside of the tutorial. Unzip it and import into Android Studio. Construct and run.

final version

The OneBreath app is a set of breath-holding occasions. It additionally has a stopwatch to trace new information and save them within the assortment.

Mess around with the app to get a sense of what you’ll construct on this tutorial.

Try ApneaRecordLocalSource.kt and ApneaRecordRepository.kt – these lessons mock a neighborhood information supply. It’ll assist to check the app, nevertheless it gained’t maintain your information between app launches.

Look additionally at StopWatchViewModel.kt. That is the view mannequin for the longer term stopwatch display screen. It’ll care for counting time.

You don’t have to alter something in these three lessons. Simply deal with the UI.

Utilizing Right Dependencies

Change to the starter venture. Go to the app-level construct.gradle and add the next dependencies:


implementation "androidx.put on.compose:compose-material:$wear_compose_version"
implementation "androidx.put on.compose:compose-navigation:$wear_compose_version"
implementation "androidx.put on.compose:compose-foundation:$wear_compose_version"

Why do you want these? In a Put on OS app, it’s best to use the Put on OS variations for compose-material and compose-navigation as a result of they’re totally different from their common siblings. As for the compose-foundation library, it builds upon its common model so you’ve gotten each dependencies.

Now that you’ve got all obligatory dependencies, construct and run. You’ll see the next display screen:

start screen

Time to dive in!

Watching over the Navigation

To start, you’ll add Compose navigation so you may navigate between screens.

Navigating Compose for Put on OS

Navigation in Compose for Put on OS is so much just like the common Compose navigation.

Open MainActivity.kt and declare a NavHostController above apneaRecordLocalSource:


personal lateinit var navController: NavHostController

In setContent() above OneBreathTheme(), initialize a swipeDismissableNavController:


navController = rememberSwipeDismissableNavController()

The distinction between Put on OS and a daily app is in how the consumer navigates again. Since watches don’t have again buttons, navigation again occurs when customers swipe to dismiss. That’s why you’ll use a SwipeDissmissableNavHost() right here.

Contained in the OneBreathTheme(), change the short-term Field() composable with the entry level to the app:


OneBreathApp(
  swipeDismissableNavController = navController,
  apneaRecordRepository = apneaRecordRepository
)

Right here, you cross the just lately created navController and the repository to OneBreathApp(), the place you’ll arrange the app navigation.

Go to OneBreathApp.kt. As you may see, it makes use of Scaffold(). However not like the common Compose Scaffold(), it has new attributes like timeText and vignette. You’ll get again to those later. For now, deal with SwipeDismissableNavHost(), the place you cross navController and startDestination as parameters.

Try the Vacation spot.kt file within the ui/navigation folder:


sealed class Vacation spot(
  val route: String
) {
  object Data : Vacation spot("information")
  object DayTrainingDetails : Vacation spot("dayTrainingDetails")
  object StopWatch : Vacation spot("stopWatch")
}

This sealed class describes all of the attainable routes within the app. Now you may arrange navigation for these routes. In OneBreathApp.kt, change SwipeDismissableNavHost‘s empty physique with the related routes:


composable(route = Vacation spot.StopWatch.route) {
}

composable(route = Vacation spot.TrainingDayDetails.route) {
}

composable(route = Vacation spot.Data.route) {
}

Add the next inside the primary route composable:


val stopWatchViewModel = StopWatchViewModel(apneaRecordRepository)
StopWatchScreen(stopWatchViewModel)

Right here, you create a StopWatchViewModel and cross it to the StopWatchScreen().

The subsequent route is Vacation spot.TrainingDayDetails. It will lead you to the TrainingDayDetailsScreen(), the place you’ll see the stats for all of the breath holds you tried on that day. In a big app, you’d create a particulars display screen route based mostly on the id of the merchandise you wish to show and use that id in a related DetailsViewModel. However this app is moderately easy, so you may simply maintain a reference to a particular coaching day within the OneBreathApp(). Thus, add this line above Scaffold():


var selectedDay: TrainingDay? = null

Write this code contained in the composable with Vacation spot.TrainingDayDetails:


selectedDay?.let { day ->  // 1
  TrainingDayDetailsScreen(
    day.breaths,  // 2
    onDismissed = { swipeDismissableNavController.navigateUp() }  // 3
   )
}

Right here’s what’s occurring within the code above:

  1. Navigate solely after you set the selectedDay.
  2. Solely the record of makes an attempt is important to show the main points.
  3. In contrast to the earlier route, you set the onDismissed() callback explicitly right here since you’re utilizing SwipeToDismissBox() in TrainingDayDetails().

HorizontalViewPager and SwipeToDismissBox Navigation

Earlier than shifting on to the subsequent vacation spot, open TrainingDayDetailsScreen.kt. The explanation why the compose navigation in OneBreathApp.kt is totally different for this display screen is the SwipeToDismissBox() composable. The SwipeToDismissBox() has two states:


if (isBackground) {
  Field(modifier = Modifier.fillMaxSize())  // 1
} else {
  Field(
    modifier = Modifier
      .fillMaxSize()
      .edgeSwipeToDismiss(state)  // 2
  ) {
    HorizontalPager(state = pagerState, rely = maxPages) { web page ->
      selectedPage = pagerState.currentPage
      DetailsView(makes an attempt[page].utbTime, makes an attempt[page].totalDuration)
    }
  }
}
  1. SwipeToDismissBox() has a background scrim, which on this case is only a black full-screen field.
  2. In a standard state, this Field() composable holds a HorizontalPager, which lets you scroll by way of the main points display screen horizontally, but additionally makes swipe-to-dismiss motion not possible. That’s why it’s worthwhile to place it inside a SwipeToDismissBox() and have the edgeSwipeToDismiss() modifier to navigate again solely when the consumer swipes proper within the small area on the left a part of the display screen.

Lastly, arrange the final navigation route: Vacation spot.Data. Again in OneBreathApp.kt in SwipeDismissableNavHost(), add the next code contained in the related composable:


RecordsListScreen(
  apneaRecordRepository.information,  // 1
  onClickStopWatch = {  // 2
    swipeDismissableNavController.navigate(
      route = Vacation spot.StopWatch.route
    )
  },
  onClickRecordItem = { day ->  // 3
    selectedDay = day
    swipeDismissableNavController.navigate(
      route = Vacation spot.TrainingDayDetails.route
    )
  }
)

Right here’s what’s happening:

  1. The information record display screen shows a listing of information from the native supply.
  2. Once you faucet the New Coaching button, it redirects you to the stopwatch display screen.
  3. Once you select a specific coaching day from the record, it redirects to the coaching day particulars display screen.

As you may see, for the press occasions, this composable makes use of the 2 routes you’ve simply arrange.

You’re performed with the navigation — good job! However there’s nothing spectacular to see within the app but. So, it’s time to study concerning the Compose UI parts for Put on OS.

Attending to Know the Elements

Open RecordsListScreen.kt and add the next to RecordsListScreen() physique:


ScalingLazyColumn {  // 1
  merchandise {
    StopWatchListItemChip(onClickStopWatch)  // 2
  }
  for (merchandise in information) {
    merchandise {
      RecordListItemChip(merchandise, onClickRecordItem)
    }
  }
}

Right here’s what this implies:

  1. ScalingLazyColumn() is a Put on OS analog for LazyColumn(). The distinction is that it adapts to the spherical watch display screen. Construct and refresh the previews in RecordsListScreen to get a visible illustration.
  2. Each merchandise within the ScalingLazyColumn() is a Chip(). Take a look at StopWatchListItemChip() and RecordListItemChip() — they’ve placeholders for onClick, icon, label, secondaryLabel and different parameters.

Construct and run. You’ll see a set of breath holds:

records list

You possibly can both begin a brand new coaching or select a coaching day report from the record after which swipe to dismiss.

Congratulations — you nailed the navigation!

Now, open StopWatchScreen.kt. This display screen shows the info processed within the StopWatchViewModel. On high of the StopWatchScreen() composable, there are two states that affect the recomposition:


val state by stopWatchViewModel.state.collectAsState() // 1
val period by stopWatchViewModel.period.collectAsState() // 2
  1. This state handles all elements of the UI that don’t depend on the present stopwatch time, such because the StartStopButton() or the textual content trace on high of it.
  2. The period state will set off recomposition of the progress indicator and the time textual content each second.

For now, the StopWatchScreen() solely counts the time. However as soon as the consumer finishes their breath maintain, the app ought to ask for a sure enter. It is a good place to make use of a dialog.

Utilizing Dialogs

You should utilize Put on OS dialogs similar to the common Compose dialogs. Take a look at the dialog() composable in StopWatchScreen():


Dialog(
  showDialog = showSaveDialog,  // 1
  onDismissRequest = { showSaveDialog = false }  // 2
) {
  SaveResultDialog(
    onPositiveClick = {  // 3
    },
    onNegativeClick = {
    },
    consequence = period.toRecordString()
  )
}

Right here’s what’s occurring:

  1. You launched showSaveDialog on the high of StopWatchScreen(). It controls whether or not this dialog is seen or not.
  2. A easy callback resets showSaveDialog to false and hides the dialog.
  3. SaveResultDialog() is an Alert() dialog and requires onPositiveClick() and onNegativeClick() callbacks.

To activate this dialog, within the StartStopButton() discover the onStop() callback and add the code beneath stopWatchViewModel.cease():


if (state.utbTime > 0) {
  showSaveDialog = true
}

In freediving, the primary vital metric in your breath maintain is the Urge To Breathe (UTB) time. That is the second when the CO2 reaches a sure threshold and your mind indicators your physique to inhale. However it doesn’t imply you’ve run out of oxygen but.

Try the cease() operate in StopWatchViewModel.kt. It controls what occurs when the consumer faucets the cease button. On the primary faucet, it saves the UTB time to a neighborhood variable. On the second faucet, time monitoring really stops. That’s why you set showSaveDialog to true solely when utbTime has already been recorded.

Construct and run. Take a deep breath and begin the stopwatch. When you faucet the button two occasions — one for UTB and one for closing time — you’ll see the SaveResultDialog dialog:

result dialog

Subsequent, you’ll add some interactive parts to this app.

Including Inputs

Go to SaveResultDialog.kt. That is an Alert, which is among the Put on OS dialog varieties. The opposite sort is Affirmation. You possibly can study extra concerning the variations between the 2 varieties within the official documentation.

Take a look at the parameters of Alert(). It has an non-obligatory icon and a title, which is already created. The physique of this alert dialog makes use of a Textual content() composable. You solely must set the buttons for the consumer interplay. Set the negativeButton and positiveButton parameters to:


negativeButton = {
  Button(
    onClick = onNegativeClick,  // 1
    colours = ButtonDefaults.secondaryButtonColors()  // 2
  ) {
    Icon(
      imageVector = Icons.Crammed.Clear,  // 3
      contentDescription = "no"
    )
  }
},
positiveButton = {
  Button(
    onClick = onPositiveClick,
    colours = ButtonDefaults.primaryButtonColors()
  ) {
    Icon(
      imageVector = Icons.Crammed.Examine,
      contentDescription = "sure"
    )
  }
}

As you may see, utilizing Button() in Put on OS is straightforward:

  1. Crucial half is offering the buttons with an onClick callback, which you’ll set in a second.
  2. You possibly can specify the colours for the buttons.
  3. It’s also possible to select an icon — on this case, it’s a cross for the detrimental motion and a tick for the constructive motion.

Again within the StopWatchScreen.kt, discover SaveResultDialog() and alter the onPositiveCallback() and onNegativeCallback() to:


onPositiveClick = {
  showSaveDialog = false
  stopWatchViewModel.save()
},
onNegativeClick = {
  showSaveDialog = false
  stopWatchViewModel.refresh()
}

In each circumstances right here, you shut the dialog. If the consumer agrees to avoid wasting the consequence, you name the related technique from StopWatchViewModel. In any other case, you simply must refresh the values proven within the StopWatchScreen().

Construct and run.

interact with dialog

You possibly can work together with the dialog and save or discard the breath maintain consequence. Both approach, you navigate again to the StopWatchScreen().

Buttons are one option to work together with the consumer. There are additionally a number of enter choices in Put on OS. You should utilize one of many following:

  • Slider: To select from a variety of values.
  • Stepper: If you would like a vertical model of a slider.
  • Toggle chip: To modify between two values.
  • Picker: To pick particular information.

Within the OneBreath app, you’ll take care of a Slider().

Open AssessmentDialog.kt. Add the next line above the Alert(), doing all the mandatory imports:


var worth by keep in mind { mutableStateOf(5f) }

It will maintain the worth of an InlineSlider() with an preliminary worth of 5. Within the subsequent step, you’ll set the worth vary to 10.

Add the InlineSider() to the empty physique of Alert() dialog:


InlineSlider(
  worth = worth,
  onValueChange = { worth = it },
  increaseIcon = { Icon(InlineSliderDefaults.Enhance, "happy") },
  decreaseIcon = { Icon(InlineSliderDefaults.Lower, "unhappy") },
  valueRange = 1f..10f,
  steps = 10,
  segmented = true
)

As you may see, it has a number of parameters for the worth, the buttons, the worth vary, the variety of steps and whether or not it has segments or not. The worth of this slider modifications when the consumer faucets the Enhance or Lower buttons. Because you wish to save this worth together with the breath maintain time outcomes, change the empty onClick parameter in positiveButton:


onClick = {
  onPositiveClick(worth)
}

And now, again in StopWatchScreen.kt, use the AssessmentDialog() similar to you probably did with SaveResultDialog(). First, add a variable beneath showSaveDialog:


var showRatingDialog by keep in mind { mutableStateOf(false) }

Then, on the backside of StopWatchScreen() add a dialog. Use the showRatingDialog as a deal with to point out or cover the dialog and use AssessmentDialog() as content material:


Dialog(
  showDialog = showRatingDialog,
  onDismissRequest = { showRatingDialog = false }
) {
  AssessmentDialog(
    onPositiveClick = { ranking ->
      showRatingDialog = false
      stopWatchViewModel.save(ranking)  // 1
    },
    onNegativeClick = {
      showRatingDialog = false
      stopWatchViewModel.save()  // 2
    }
  )
}

Right here’s what occurs:

  1. After tapping the constructive button, you save the self-rating within the database together with different values from the StopWatchViewModel.
  2. When the consumer doesn’t wish to charge himself, you simply save the consequence.

Additionally, change stopWatchViewModel.save() in SaveResultDialog() with showRatingDialog = true, since you wish to present one dialog after one other and save the consequence solely after the AssessmentDialog().

Construct and run. Should you selected to maintain the report within the first dialog, you’ll see the second dialog as properly:

slider dialog
Prepared for some even cooler Put on OS Composables? It’s time to speak about Vignette and TimeText.

Including a Vignette

Open OneBreathApp.kt and have a look at the parameters in Scaffold() once more.
Set vignette parameter to:


vignette = {
  if (currentBackStackEntry?.vacation spot?.route == Vacation spot.Data.route) {
    Vignette(vignettePosition = VignettePosition.TopAndBottom)
  }
}

This situation means the vignette might be there just for the RecordsListScreen(). A vignette is a UI characteristic that dims an edge a part of the display screen. In your case, it’s TopAndBottom, as laid out in vignettePosition.

Examine the report record display screen with and with out the vignette:

With out Vignette With Vignette
no vignette with vignette

See the distinction? Within the right-hand model, the perimeters are barely darker.

TimeText

One other important Put on OS UI element is TimeText(). Nonetheless in OneBreathApp.kt, change the empty timeText parameter in Scaffold() with:


timeText = {
  if (currentBackStackEntry?.vacation spot?.route == Vacation spot.TrainingDayDetails.route) {  // 1
    TimeText(
      startLinearContent = {  // 2
        Textual content(
          textual content = selectedDay?.date.toFormattedString(),
          shade = colorPrimary,
          fashion = textStyle
        )
      },
      startCurvedContent = {  // 3
        curvedText(
          textual content = selectedDay?.date.toFormattedString(),
          shade = colorPrimary,
          fashion = CurvedTextStyle(textStyle)
        )
      }
    )
  } else TimeText()  // 4
}

Right here’s a breakdown of this code:

  1. You solely wish to present a further textual content earlier than the time within the coaching day particulars display screen. This extra textual content will maintain the date of the report.
  2. TimeText() adapts to spherical and sq. watches. For sq. watches, it makes use of TimeTextDefaults.timeTextStyle().
  3. For spherical watches, use CurvedTextStyle().
  4. All of the screens besides the coaching day particulars display screen will nonetheless present the present time on high.

Construct and run. You’ll see the present time on high now. Faucet on one of many inexperienced chips. Within the coaching day particulars display screen, you’ll additionally see the date:

training day details screen

Progress Indicator

Wouldn’t it’s good to have one thing like a clock hand for the stopwatch? You are able to do that with a Put on OS CircularProgressIndicator.

Go to StopWatchScreen.kt and add the next to the highest of the Field(), proper above Column():


CircularProgressIndicator(
  progress = period.toProgress(),
  modifier = Modifier
    .fillMaxSize()
    .padding(all = 1.dp)
)

This indicator will recompose each second and present the present period of your breath maintain. It’s normally advisable to go away a spot for the TimeText() by including startAngle and endAngle parameters, however in OneBreath you’ll sacrifice these to make the indicator resemble a clock hand.

Construct and run the app and begin the stopwatch. You’ll see the clock ticking:

determinate progress indicator

This CircularProgressIndicator() is determinate, however you can even use its indeterminate model to point out a loading indicator – simply pass over the progress parameter. It will appear like this:

indeterminate progress indicator

Web page Indicator

When you’re nonetheless operating the app, go to the report record display screen and faucet on one of many coaching day objects. Right here, within the particulars display screen, you may web page by way of all of your breath holds on that day. Can be good to know what web page you’re on, proper? A HorizontalPageIndicator will make it easier to with that.

Go to TrainingDayDetailsScreen.kt. In SwipeToDismissBox(), add this beneath val pagerState = rememberPagerState() :


val pageIndicatorState: PageIndicatorState = keep in mind {
  object : PageIndicatorState {
    override val pageOffset: Float
      get() = 0f
    override val selectedPage: Int
      get() = selectedPage
    override val pageCount: Int
      get() = maxPages
  }
}

Right here, you create a PageIndicatorState that connects the HorizontalPager() and HorizontalPageIndicator(). The selectedPage is about whenever you scroll by way of the pager. The pageCount is the overall variety of makes an attempt on the coaching day. The pageOffset is 0f on this case, however you should use it to animate the indicator.

To make use of it, add HorizontalPageIndicator() proper beneath HorizontalPager:


HorizontalPageIndicator(
  pageIndicatorState = pageIndicatorState,
  selectedColor = colorAccent
)

Construct and run. Decide a coaching day from the record. You’ll see a paging indicator on the backside:

paging indicator

HorizontalPageIndicator() is an instance of a horizontal paging indicator. Should you want a vertical indicator, you should use a PositionIndicator(). Try the official supplies for extra parts.

The place to Go From Right here?

Obtain the finished venture information by clicking the Obtain Supplies button on the high or backside of the tutorial.

Congratulations! Now you can monitor your breath-holding information with the app you’ve simply constructed. Now, take a deep breath and set a brand new private report! :]

Should you’re inquisitive about studying extra about numerous Put on OS Composables, take a look at the official documentation documentation, in addition to the Horologist library for superior date and time pickers. And for those who take pleasure in Put on OS improvement, don’t miss out on the Creating Tiles for Put on OS video course.

We hope you loved this tutorial. You probably have any questions or feedback, please be a part of the discussion board dialogue beneath!



Source link

Related articles

Supersonic Helps You Get on Track With Your Fitness Goals

Supersonic Helps You Get on Track With Your Fitness Goals

February 7, 2023
AirTag reunites couple with luggage four months after airline lost it

AirTag reunites couple with luggage four months after airline lost it

February 7, 2023
Tags: ComposeJetpackWear
Share76Tweet47

Related Posts

Supersonic Helps You Get on Track With Your Fitness Goals

Supersonic Helps You Get on Track With Your Fitness Goals

by Real Hacker Staff
February 7, 2023
0

However the brand new app Supersonic desires that will help you get transferring and sustain the useful behavior. The app...

AirTag reunites couple with luggage four months after airline lost it

AirTag reunites couple with luggage four months after airline lost it

by Real Hacker Staff
February 7, 2023
0

Apple's AirTag is at it once more and, this time, it is reunited a pair with their misplaced baggage after...

Apple will donate to relief efforts following devastating Turkey and Syria earthquakes

Apple will donate to relief efforts following devastating Turkey and Syria earthquakes

by Real Hacker Staff
February 7, 2023
0

Apple CEO Tim Cook dinner has confirmed that the iPhone maker will likely be donating to the aid and restoration...

Telegram introduces profile photo maker, real-time chat translation

Telegram introduces profile photo maker, real-time chat translation

by Real Hacker Staff
February 6, 2023
0

Telegram usually pushes out main updates as soon as a month, and February isn't any exception. After including the capability...

iPhone 14 reverse wireless charging didn’t happen (but Apple’s still working on it)

iPhone 14 reverse wireless charging didn’t happen (but Apple’s still working on it)

by Real Hacker Staff
February 6, 2023
0

Apple initially wished its 2022 Professional fashions such because the iPhone 14 Professional to incorporate a reverse wi-fi charging function,...

Load More
  • Trending
  • Comments
  • Latest
Chinese Hackers Using Russo-Ukrainian War Decoys to Target APAC and European Entities

Chinese Hackers Using Russo-Ukrainian War Decoys to Target APAC and European Entities

December 7, 2022
Sennheiser Starts Shipping EW-DX Digital Wireless Microphone Series

Sennheiser Starts Shipping EW-DX Digital Wireless Microphone Series

November 22, 2022
Spitfire Audio unveils Aperture: Cassette Symphony

Spitfire Audio unveils Aperture: Cassette Symphony

November 25, 2022
AntennaWare Addresses Body Blocking Issues In The UWB Market

AntennaWare Addresses Body Blocking Issues In The UWB Market

November 17, 2022

Hello world!

0
US Commodities Regulator Beefs Up Bitcoin Futures Review

US Commodities Regulator Beefs Up Bitcoin Futures Review

0
Bitcoin Hits 2018 Low as Concerns Mount on Regulation, Viability

Bitcoin Hits 2018 Low as Concerns Mount on Regulation, Viability

0
India: Bitcoin Prices Drop As Media Misinterprets Gov’s Regulation Speech

India: Bitcoin Prices Drop As Media Misinterprets Gov’s Regulation Speech

0
Twitter will stop forcing its algorithmic timeline on iOS and Android • TechCrunch

Twitter will stop forcing its algorithmic timeline on iOS and Android • TechCrunch

February 7, 2023
Super Nintendo World’s Mario Kart Attraction Criticized For Waist Size Restrictions

Super Nintendo World’s Mario Kart Attraction Criticized For Waist Size Restrictions

February 7, 2023
Monster Hunter Rise: Sunbreak Title Update 4 Out Now, Here Are The Full Patch Notes

Monster Hunter Rise: Sunbreak Title Update 4 Out Now, Here Are The Full Patch Notes

February 7, 2023
China-sceptic leader of Solomon Islands largest province removed | Politics News

China-sceptic leader of Solomon Islands largest province removed | Politics News

February 7, 2023

Recent News

Twitter will stop forcing its algorithmic timeline on iOS and Android • TechCrunch

Twitter will stop forcing its algorithmic timeline on iOS and Android • TechCrunch

February 7, 2023
Super Nintendo World’s Mario Kart Attraction Criticized For Waist Size Restrictions

Super Nintendo World’s Mario Kart Attraction Criticized For Waist Size Restrictions

February 7, 2023

Categories

  • APPLICATIONS
  • AUDIO
  • CAMERA
  • COMPUTERS
  • GAMING
  • LAPTOP
  • REVIEWS
  • SECURITY
  • SMARTPHONES
  • Uncategorized
REAL HACKER NEWS

We bring you the best news on Internet new gadgets hacking and technology from around the world

  • Contact
  • Cookie Privacy Policy
  • Terms and Conditions
  • Privacy Policy
  • Disclaimer
  • DMCA

© 2003 Real Hacker News

No Result
View All Result
  • Home
  • REVIEWS
  • SECURITY
  • GAMING
  • SMARTPHONES
  • CAMERA
  • COMPUTERS
    • LAPTOP
  • APPLICATIONS
  • AUDIO

© 2003 Real Hacker News

Go to mobile version